Handle id wrapping by restricting ids to 16-bit
authorJoseph Coffland <joseph@cauldrondevelopment.com>
Wed, 28 Nov 2018 00:06:23 +0000 (16:06 -0800)
committerJoseph Coffland <joseph@cauldrondevelopment.com>
Wed, 28 Nov 2018 00:06:23 +0000 (16:06 -0800)
src/avr/src/command.c
src/avr/src/vars.def
src/py/bbctrl/CommandQueue.py
src/py/bbctrl/Planner.py

index 9f01b30e8ed496d051a814f1448ba0fec2204ea8..498a297337fdfd6faa8e763703a3c242ccd2d049 100644 (file)
@@ -68,7 +68,7 @@
 
 static struct {
   bool active;
-  uint32_t id;
+  uint16_t id;
   uint32_t last_empty;
   volatile uint16_t count;
   float position[AXES];
@@ -284,5 +284,5 @@ bool command_exec() {
 
 
 // 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;}
index e5a206dc36b378e4449f56e809ad725a3512f9f0..51a754679211dc1f3d65fec7bac4d1ac87c95467 100644 (file)
@@ -120,7 +120,7 @@ VAR(hy_rated_rpm,    hq, u16,   0,      0, 1) // Huanyang rated RPM
 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
index b04ad63748d4d30d6a36b8a6fe10a586182e3980..75b68cee5c00a7dc937e985b3b54dfaea3d69a9f 100644 (file)
@@ -32,6 +32,10 @@ log = logging.getLogger('CmdQ')
 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
@@ -60,7 +64,7 @@ class CommandQueue():
             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()
@@ -73,7 +77,7 @@ class CommandQueue():
 
 
     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
 
index e1f892e8ab1f678b08ccad97fa5250b90a1c26ff..7e20b3758a0e1bdef48cd3c387e77a54400c1aee 100644 (file)
@@ -310,6 +310,10 @@ class Planner():
 
 
     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: