static struct {
bool active;
- uint32_t id;
+ uint16_t id;
uint32_t last_empty;
volatile uint16_t count;
float position[AXES];
// Var callbacks
-uint32_t get_id() {return cmd.id;}
-void set_id(uint32_t id) {cmd.id = id;}
+uint16_t get_id() {return cmd.id;}
+void set_id(uint16_t id) {cmd.id = id;}
VAR(hy_status, hs, u8, 0, 0, 1) // Huanyang status flags
// Machine state
-VAR(id, id, u32, 0, 1, 1) // Last executed command ID
+VAR(id, id, u16, 0, 1, 1) // Last executed command ID
VAR(feed_override, fo, u16, 0, 1, 1) // Feed rate override
VAR(speed_override, so, u16, 0, 1, 1) // Spindle speed override
VAR(optional_pause, op, b8, 0, 1, 1) // Optional pause state
log.setLevel(logging.WARNING)
+# 16-bit less with wrap around
+def id_less(a, b): return (1 << 15) < (a - b) % ((1 << 16) - 1)
+
+
class CommandQueue():
def __init__(self):
self.lastEnqueueID = 0
id, cb, args, kwargs = self.q[0]
# Execute commands <= releaseID
- if self.releaseID < id: return
+ if id_less(self.releaseID, id): return
log.info('releasing id=%d' % id)
self.q.popleft()
def release(self, id):
- if id and id <= self.releaseID:
+ if id and not id_less(self.releaseID, id):
log.warning('id out of order %d <= %d' % (id, self.releaseID))
self.releaseID = id
def _encode(self, block):
+ # Handle id wrapping by restricting ids to 16-bit
+ # See CommandQueue id_less()
+ block['id'] %= (1 << 16) - 1
+
cmd = self.__encode(block)
if cmd is not None: