Implement tx queue
authorNick Downing <nick.downing@lifx.co>
Wed, 18 Mar 2020 17:30:22 +0000 (04:30 +1100)
committerNick Downing <nick.downing@lifx.co>
Wed, 18 Mar 2020 17:30:22 +0000 (04:30 +1100)
blockly.html.jst
js/mirobot.js.min

index 1109a2c..7b27007 100644 (file)
@@ -168,11 +168,9 @@ return async env => {
             "nextStatement": null,
             "colour": "%{BKY_LOGIC_HUE}"
           }
-
-
         ]);
 
-        Blockly.JavaScript['move_to'] = function(block) {
+        Blockly.JavaScript['move_to'] = block => {
           var a = Blockly.JavaScript.valueToCode(block, 'A',
               Blockly.JavaScript.ORDER_COMMA) || '0';
           var b = Blockly.JavaScript.valueToCode(block, 'B',
@@ -186,13 +184,13 @@ return async env => {
           return 'await deviceMoveTo(' + a + ', ' + b + ', ' + c + ');\n'
         };
 
-        Blockly.JavaScript['gripper'] = function(block) {
+        Blockly.JavaScript['gripper'] = block => {
           var d = Blockly.JavaScript.valueToCode(block, 'F',
               Blockly.JavaScript.ORDER_COMMA) || '0';
           return 'await deviceGripper(' + d + ');\n'
         };
 
-        Blockly.JavaScript['delay'] = function(block) {
+        Blockly.JavaScript['delay'] = block => {
           var millisecs = Blockly.JavaScript.valueToCode(block, 'millisecs',
               Blockly.JavaScript.ORDER_COMMA) || '0';
           return 'await delay(' + millisecs + ');\n'
index b23436e..2bc78ff 100644 (file)
@@ -34,89 +34,141 @@ let rx_stop = async () => {
   console.log('rx_stop')
   rx_cont = false
   while (rx_active)
-    await sleep(100)
+    await sleep(10)
   console.log('rx_stop done')
 }
 
-let tx_immediate = async (device, text) => {
-  console.log('tx_immediate', text)
+let tx_text = async (device, text) => {
+  console.log('tx_text', text)
   data = new Uint8Array(text.length);
   for (var i = 0; i < text.length; ++i)
     data[i] = text.charCodeAt(i);
   await device.transferOut(2, data.buffer)
 }
+let tx_wait = async (device, text, timeout) => {
+  await tx_text(device, text)
+  for (let i = 0; i < timeout; ++i) {
+    if (rx_buf.slice(0, 1) === '>') {
+      rx_buf = rx_buf.slice(1)
+      return true
+    }
+    await sleep(1)
+  }
+  return false
+}
+let tx_active = false
+let tx_cont = false
+let tx_queue = []
+let tx_task = async device => {
+  console.log('tx_task')
+  tx_active = true
+  try {
+    while (tx_cont) {
+      if (tx_queue.length)
+        tx_wait(device, tx_queue.shift(), 60000)
+      await sleep(1);
+    }
+  }
+  catch (err) {
+    console.log('tx_task err', err.message)
+  }
+  console.log('tx_task done')
+  tx_active = false
+}
+let tx_stop = async () => {
+  console.log('tx_stop')
+  tx_cont = false
+  while (tx_active)
+    await sleep(10)
+  console.log('tx_stop done')
+}
+
+let device, device_busy = false
+let axes = [
+  {
+    min_degrees: -90,
+    min_position: 14578,
+    max_degrees: 90,
+    max_position: 35733
+  },
+  {
+    min_degrees: -50,
+    min_position: 31031.88888888889,
+    max_degrees: 75,
+    max_position: 16340.91666666667
+  },
+  {
+    min_degrees: 0,
+    min_position: 25155.5,
+    max_degrees: 90,
+    max_position: 14578
+  },
+  {
+    min_degrees: -45,
+    min_position: 30444.25,
+    max_degrees: 45,
+    max_position: 19866.75
+  },
+  {
+    min_degrees: -45,
+    min_position: 30444.25,
+    max_degrees: 45,
+    max_position: 19866.75
+  },
+  {
+    min_degrees: 0,
+    min_position: 25155.5,
+    max_degrees: 60,
+    max_position: 18103.833333333333
+  }
+]
+let move_to = (axis, speed, value) => {
+  if (value < axes[axis].min_degrees)
+    value = axes[axis].min_degrees
+  else if (value > axes[axis].max_degrees)
+    value = axes[axis].max_degrees
+  if (axes[axis].value !== undefined)
+    axes[axis].value.innerHTML = value
+  if (device !== undefined) {
+    axes[axis].position =
+      Math.round(axes[axis].min_position +
+        (value - axes[axis].min_degrees) *
+        (axes[axis].max_position - axes[axis].min_position) /
+        (axes[axis].max_degrees - axes[axis].min_degrees))
+    tx_queue.push(
+      `${String.fromCharCode(97 + axis)}${speed} ${String.fromCharCode(65 + axis)}${axes[axis].position}\n`
+    )
+  }
+}
 
 document.addEventListener(
   'DOMContentLoaded',
   () => {
-    let device, device_busy = false
-    let axes = [
-      {
-        slider: document.getElementById("slider-a"),
-        value: document.getElementById("value-a"),
-        min_degrees: -90,
-        min_position: 14578,
-        max_degrees: 90,
-        max_position: 35733
-      },
-      {
-        slider: document.getElementById("slider-b"),
-        value: document.getElementById("value-b"),
-        min_degrees: -50,
-        min_position: 31031.88888888889,
-        max_degrees: 75,
-        max_position: 16340.91666666667
-      },
-      {
-        slider: document.getElementById("slider-c"),
-        value: document.getElementById("value-c"),
-        min_degrees: 0,
-        min_position: 25155.5,
-        max_degrees: 90,
-        max_position: 14578
-      },
-      {
-        slider: document.getElementById("slider-d"),
-        value: document.getElementById("value-d"),
-        min_degrees: -45,
-        min_position: 30444.25,
-        max_degrees: 45,
-        max_position: 19866.75
-      },
-      {
-        slider: document.getElementById("slider-e"),
-        value: document.getElementById("value-e"),
-        min_degrees: -45,
-        min_position: 30444.25,
-        max_degrees: 45,
-        max_position: 19866.75
-      },
-      {
-        slider: document.getElementById("slider-f"),
-        value: document.getElementById("value-f"),
-        min_degrees: 0,
-        min_position: 25155.5,
-        max_degrees: 60,
-        max_position: 18103.833333333333
-      }
-    ]
+    axes[0].slider = document.getElementById("slider-a")
+    axes[0].value = document.getElementById("value-a")
+    axes[1].slider = document.getElementById("slider-b")
+    axes[1].value = document.getElementById("value-b")
+    axes[2].slider = document.getElementById("slider-c")
+    axes[2].value = document.getElementById("value-c")
+    axes[3].slider = document.getElementById("slider-d")
+    axes[3].value = document.getElementById("value-d")
+    axes[4].slider = document.getElementById("slider-e")
+    axes[4].value = document.getElementById("value-e")
+    axes[5].slider = document.getElementById("slider-f")
+    axes[5].value = document.getElementById("value-f")
+
     for (let i = 0; i < axes.length; ++i) {
-      axes[i].value.innerHTML = axes[i].slider.value
+      let value = axes[i].slider.value
+      axes[i].value.innerHTML = value
+      axes[i].position =
+        Math.round(axes[i].min_position +
+          (value - axes[i].min_degrees) *
+          (axes[i].max_position - axes[i].min_position) /
+          (axes[i].max_degrees - axes[i].min_degrees))
 
       let axis = i
       axes[i].slider.oninput = function() {
-        axes[axis].value.innerHTML = this.value
-        if (device && !device_busy) {
-          axes[axis].position =
-            Math.round(axes[axis].min_position +
-              (this.value - axes[axis].min_degrees) *
-              (axes[axis].max_position - axes[axis].min_position) /
-              (axes[axis].max_degrees - axes[axis].min_degrees))
-          tx_immediate(
-            device,
-            `${String.fromCharCode(97 + axis)}32000 ${String.fromCharCode(65 + axis)}${axes[axis].position}\n`
-          )
-        }
+        move_to(axis, 32000, this.value)
       }
     }
 
@@ -140,23 +192,28 @@ document.addEventListener(
       
                     console.assert(!rx_active, '!rx_active')
                     rx_cont = true
+                    rx_buf = ''
                     rx_task(device)
       
+                    console.assert(!tx_active, '!tx_active')
+                    tx_cont = true
+                    tx_queue = []
+                    tx_task(device)
+
                     await sleep(100)
                     rx_buf = ''
       
-                    tx_immediate(device, '\n')
-                    await sleep(100)
-                    if (rx_buf.slice(0, 1) === '>') {
+                    if (tx_wait(device, '\n', 100)) {
                       console.log('prompt detected')
-                      rx_buf = rx_buf.slice(1)
                       document.getElementById('connection-status').innerHTML = 'Connected'
                       document.getElementById('connect-disconnect').innerHTML = 'Disconnect'
+
                     }
                     else {
                       console.log('no prompt detected')
                       device.close()
                       await rx_stop()
+                      await tx_stop()
                       device = undefined
                     }
                   }
@@ -164,6 +221,7 @@ document.addEventListener(
                     console.log('exception', err.message)
                     device.close()
                     await rx_stop()
+                    await tx_stop()
                     device = undefined
                   }
                 }
@@ -176,6 +234,7 @@ document.addEventListener(
                 // disconnect request
                 device.close()
                 await rx_stop()
+                await tx_stop()
                 device = undefined
                 document.getElementById('connection-status').innerHTML = 'Disconnected'
                 document.getElementById('connect-disconnect').innerHTML = 'Connect'