Fixed Web based jogging
authorJoseph Coffland <joseph@cauldrondevelopment.com>
Tue, 6 Feb 2018 22:49:27 +0000 (14:49 -0800)
committerJoseph Coffland <joseph@cauldrondevelopment.com>
Tue, 6 Feb 2018 22:49:27 +0000 (14:49 -0800)
package.json
src/jade/templates/axis-control.jade
src/jade/templates/control-view.jade
src/js/axis-control.js
src/js/control-view.js
src/py/bbctrl/AVR.py
src/py/bbctrl/Cmd.py
src/py/bbctrl/Jog.py
src/py/bbctrl/Web.py
src/stylus/style.styl

index 3fe24984c8a0614a9d1cac9de77133649f2158c1..e3b0b81b22de59b13c0ed9dce428ecbf33fbff8b 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "bbctrl",
-  "version": "0.3.2",
+  "version": "0.3.3",
   "homepage": "https://github.com/buildbotics/bbctrl-firmware",
   "license": "GPL 3+",
   "dependencies": {
index 5a3a5bdab02686b90cdad5f40be4846c64adbb18..8851e86eb989ac7e6f8c171a0bb0fed7e6cca18d 100644 (file)
@@ -55,107 +55,107 @@ script#axis-control-template(type="text/x-template")
 
 
     g(transform="scale(0.8, 0.8)")
-      // 100 ring
+      // 100% ring
       g.ring(fill="#9f9f9f", filter="url(#shadow)")
         use.button(xlink:href="#pie-1", v-if="enabled[0]",
           transform="translate(134 121) rotate(-45)",
-          @click="jog(0, 100)", title="Jog +100 {{axes[0]}}")
+          @mousedown="jog(0, 1)", @mouseup="release(0)")
 
         use.button(xlink:href="#pie-1", v-if="enabled[0]",
           transform="translate(115 121) rotate(135)",
-          @click="jog(0, -100)", title="Jog -100 {{axes[0]}}")
+          @mousedown="jog(0, -1)", @mouseup="release(0)")
 
-        g.button(@click="jog(1, 100)", title="Jog +100 {{axes[1]}}",
+        g.button(@mousedown="jog(1, 1)", @mouseup="release(1)",
           v-if="enabled[1]")
           use.button(xlink:href="#pie-1",
             transform="translate(124 111) rotate(-135)")
-          text(x="125", y="24", transform="rotate(20 125 125)") 100
-          text(x="125", y="24", transform="rotate(-20 125 125)") 100
+          text(x="125", y="24", transform="rotate(22 125 125)") 100%
+          text(x="125", y="24", transform="rotate(-22 125 125)") 100%
           use.button(xlink:href="#pie-1", fill="transparent",
             transform="translate(124 111) rotate(-135)")
 
         use.button(xlink:href="#pie-1", v-if="enabled[1]",
-          transform="translate(124 130) rotate(45)",
-          @click="jog(1, -100)", title="Jog -100 {{axes[1]}}")
+          transform="translate(124 130) rotate(45)", @mousedown="jog(1, -1)",
+          @mouseup="release(1)")
 
-      // 10 ring
+      // 50% ring
       g.ring(fill="#c5c5c5", filter="url(#shadow)")
         use.button(xlink:href="#pie-2", v-if="enabled[0]",
           transform="translate(134 121) rotate(-45)",
-          @click="jog(0, 10)", title="Jog +10 {{axes[0]}}")
+          @mousedown="jog(0, 0.5)", @mouseup="release(0)")
 
         use.button(xlink:href="#pie-2", v-if="enabled[0]",
           transform="translate(115 121) rotate(135)",
-          @click="jog(0, -10)", title="Jog -10 {{axes[0]}}")
+          @mousedown="jog(0, -0.5)", @mouseup="release(0)")
 
-        g.button(@click="jog(1, 10)", title="Jog +10 {{axes[1]}}",
+        g.button(@mousedown="jog(1, 0.5)", @mouseup="release(1)",
           v-if="enabled[1]")
           use.button(xlink:href="#pie-2",
             transform="translate(124 111) rotate(-135)")
-          text(x="125", y="50") 10
+          text(x="125", y="48") 50%
           use.button(xlink:href="#pie-2", fill="transparent",
             transform="translate(124 111) rotate(-135)")
 
         use.button(xlink:href="#pie-2", v-if="enabled[1]",
           transform="translate(124 130) rotate(45)",
-          @click="jog(1, -10)", title="Jog -10 {{axes[1]}}")
+          @mousedown="jog(1, -0.5)", @mouseup="release(1)")
 
 
-      // 1 ring
+      // 25% ring
       g.ring(fill="#e2e2e2", filter="url(#shadow)")
         use.button(xlink:href="#pie-3", v-if="enabled[0]",
           transform="translate(134 121) rotate(-45)",
-          @click="jog(0, 1)", title="Jog +1 {{axes[0]}}")
+          @mousedown="jog(0, 0.25)", @mouseup="release(0)")
 
         use.button(xlink:href="#pie-3", v-if="enabled[0]",
           transform="translate(115 121) rotate(135)",
-          @click="jog(0, -1)", title="Jog -1 {{axes[0]}}")
+          @mousedown="jog(0, -0.25)", @mouseup="release(0)")
 
-        g.button(@click="jog(1, 1)", title="Jog +1 {{axes[1]}}",
+        g.button(@mousedown="jog(1, 0.25)", @mouseup="release(1)",
           v-if="enabled[1]")
           use.button(xlink:href="#pie-3",
             transform="translate(124 111) rotate(-135)")
-          text(x="125", y="75") 1
+          text(x="125", y="73") 25%
           use.button(xlink:href="#pie-3", fill="transparent",
             transform="translate(124 111) rotate(-135)")
 
         use.button(xlink:href="#pie-3", v-if="enabled[1]",
           transform="translate(124 130) rotate(45)",
-          @click="jog(1, -1)", title="Jog -1 {{axes[1]}}")
+          @mousedown="jog(1, -0.25)", @mouseup="release(1)")
 
 
-      // 0.1 ring
+      // 10% ring
       g.ring(fill="#f7f7f7", filter="url(#shadow)")
         use.button(xlink:href="#pie-4", v-if="enabled[0]",
           transform="translate(134 121) rotate(-45)",
-          @click="jog(0, 0.1)", title="Jog +0.1 {{axes[0]}}")
+          @mousedown="jog(0, 0.1)", @mouseup="release(0)")
 
         use.button(xlink:href="#pie-4", v-if="enabled[0]",
           transform="translate(115 121) rotate(135)",
-          @click="jog(0, -0.1)", title="Jog -0.1 {{axes[0]}}")
+          @mousedown="jog(0, -0.1)", @mouseup="release(0)")
 
-        g.button(@click="jog(1, 0.1)", title="Jog +0.1 {{axes[1]}}",
+        g.button(@mousedown="jog(1, 0.1)", @mouseup="release(1)",
           v-if="enabled[1]")
           use.button(xlink:href="#pie-4",
             transform="translate(124 111) rotate(-135)")
-          text(x="125", y="95") 0.1
+          text(x="125", y="95") 10%
           use.button(xlink:href="#pie-4", fill="transparent",
             transform="translate(124 111) rotate(-135)")
 
         use.button(xlink:href="#pie-4", v-if="enabled[1]",
           transform="translate(124 130) rotate(45)",
-          @click="jog(1, -0.1)", title="Jog -0.1 {{axes[1]}}")
+          @mousedown="jog(1, -0.1)", @mouseup="release(1)")
 
 
       // +A
-      g.button.arrow(@click="jog(0, 100)", title="Jog +100 {{axes[0]}}",
+      g.button.arrow(@mousedown="jog(0, 1)", @mouseup="release(0)",
         transform="translate(230 120)", v-if="enabled[0]")
         use(xlink:href="#arrow", fill="url(#{{colors[0]}}-1)")
         text(x="-12", y="5", font-size="14", textLength="21") +{{axes[0]}}
 
 
       // -A
-      g.button.arrow(@click="jog(0, -100)", title="Jog -100 {{axes[0]}}",
+      g.button.arrow(@mousedown="jog(0, -1)", @mouseup="release(0)",
         transform="translate(20 120)", v-if="enabled[0]")
         use(xlink:href="#arrow", fill="url(#{{colors[0]}}-1)",
           transform="rotate(180)")
@@ -163,7 +163,7 @@ script#axis-control-template(type="text/x-template")
 
 
       // +B
-      g.button.arrow(@click="jog(1, 100)", title="Jog +100 {{axes[1]}}",
+      g.button.arrow(@mousedown="jog(1, 1)", @mouseup="release(1)",
         transform="translate(125, 18)", v-if="enabled[1]")
         use(xlink:href="#arrow", fill="url(#{{colors[1]}}-1)",
           transform="rotate(-90)")
@@ -171,7 +171,7 @@ script#axis-control-template(type="text/x-template")
 
 
       // -B
-      g.button.arrow(@click="jog(1, -100)", title="Jog -100 {{axes[1]}}",
+      g.button.arrow(@mousedown="jog(1, -1)", @mouseup="release(1)",
         transform="translate(125, 225)", v-if="enabled[1]")
         use(xlink:href="#arrow", fill="url(#{{colors[1]}}-1)",
           transform="rotate(90)")
index 4cfcad3cb2bc82af1f0b286d37b2ad1462b8afaf..7a808ad2f66c61eedae9e8334ac3c4b756a74425 100644 (file)
@@ -226,13 +226,20 @@ script#control-view-template(type="text/x-template")
           axis-control(axes="XY", :colors="['red', 'green']",
             :enabled="[enabled('x'), enabled('y')]",
             v-if="enabled('x') || enabled('y')")
+
           axis-control(axes="AZ", :colors="['orange', 'blue']",
             :enabled="[enabled('a'), enabled('z')]",
             v-if="enabled('a') || enabled('z')")
+
           axis-control(axes="BC", :colors="['cyan', 'purple']",
             :enabled="[enabled('b'), enabled('c')]",
             v-if="enabled('b') || enabled('c')")
 
+        center
+          | Left click the axes above holding down the mouse button to jog the
+          | machine.
+        center Jogging speed is set by the ring that is clicked.
+
       section#content4.tab-content
         .toolbar
           button.pure-button(title="Clear console.", @click="clear_console")
index a8c2427312c7c26b3a83fdddefa5a27136279251..60d5979fd19d159812f045dff6bc06593aad4abe 100644 (file)
@@ -7,8 +7,7 @@ module.exports = {
 
 
   methods: {
-    jog: function (axis, move) {
-      this.$dispatch('jog', this.axes[axis], move)
-    }
+    jog: function (axis, power) {this.$dispatch('jog', this.axes[axis], power)},
+    release: function (axis) {this.$dispatch('jog', this.axes[axis], 0)}
   }
 }
index 11f2b4e89885006190a293d4a3830a223cef7de9..3e4eb6f2f54677d682bc5f38dd888c76cd055bb4 100644 (file)
@@ -58,8 +58,11 @@ module.exports = {
 
 
   events: {
-    // TODO These should all be implemented via the API
-    jog: function (axis, move) {this.send('g91 g0' + axis + move)},
+    jog: function (axis, power) {
+      var data = {};
+      data[axis] = power;
+      api.put('jog', data);
+    },
 
 
     message: function (msg) {
index 84b3a6dc51f677d0156c9cfe3f1e8ac279669b4f..96b1a809217096b08f4eaaeb31b639b630e11db9 100644 (file)
@@ -275,11 +275,7 @@ class AVR():
 
     def jog(self, axes):
         if self._is_busy(): raise Exception('Busy, cannot jog')
-
-        _axes = {}
-        for i in range(len(axes)): _axes["xyzabc"[i]] = axes[i]
-
-        self._queue_command(Cmd.jog(_axes))
+        self._queue_command(Cmd.jog(axes))
 
 
     def home(self, axis, position = None):
index 75ac09efc3937a0882bb322a1c7da3ca1e416c36..e4d5fb68d6f2bb23e13a52af67dfd5d45f7cd581 100755 (executable)
@@ -39,6 +39,9 @@ def encode_axes(axes):
         if axis in axes:
             data += axis + encode_float(axes[axis])
 
+        elif axis.upper() in axes:
+            data += axis + encode_float(axes[axis.upper()])
+
     return data
 
 
index d153a02525bc4d3a6fdf89f9fba74c060e9c5a49..222abb67849328a4760ba4dc5fd2223a5b3f1c6b 100644 (file)
@@ -50,7 +50,9 @@ class Jog(inevent.JogHandler):
         if self.v != self.lastV:
             self.lastV = self.v
             try:
-                self.ctrl.avr.jog(self.v)
+                axes = {}
+                for i in range(len(self.v)): axes["xyzabc"[i]] = self.v[i]
+                self.ctrl.avr.jog(axes)
             except Exception as e: log.error('Jog: %s', e)
 
         self.ctrl.ioloop.call_later(0.25, self.callback)
index 01fe4a2722a892704d854af8871f06bb5f635814..e81afae22342076ab5e30614aa32a1db06a4a55d 100644 (file)
@@ -206,6 +206,10 @@ class OverrideSpeedHandler(bbctrl.APIHandler):
     def put_ok(self, value): self.ctrl.avr.override_speed(float(value))
 
 
+class JogHandler(bbctrl.APIHandler):
+    def put_ok(self): self.ctrl.avr.jog(self.json)
+
+
 # Used by CAMotics
 class WSConnection(tornado.websocket.WebSocketHandler):
     def __init__(self, app, request, **kwargs):
@@ -294,6 +298,7 @@ class Web(tornado.web.Application):
             (r'/api/position/([xyzabcXYZABC])', PositionHandler),
             (r'/api/override/feed/([\d.]+)', OverrideFeedHandler),
             (r'/api/override/speed/([\d.]+)', OverrideSpeedHandler),
+            (r'/api/jog', JogHandler),
             (r'/(.*)', StaticFileHandler,
              {'path': bbctrl.get_resource('http/'),
               "default_filename": "index.html"}),
index 6a983af672dc8117bf1abe9e3e1485542cac4581..9644e6f2a634a6d4f00031628e3aabacae70ec83 100644 (file)
@@ -217,6 +217,11 @@ body
 
   .jog svg
     text
+      -webkit-user-select none
+      -khtml-user-select none
+      -moz-user-select -moz-none
+      -o-user-select none
+      user-select none
       font-family Sans
       font-weight bold
       stroke transparent