diff --git a/.gitignore b/.gitignore
index 2157929..8f3cf82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,7 +19,10 @@ __pycache__
*.deb
*.zip
/rpi-share
+/rpi-root
/package-lock.json
+/src/bbserial/linux-rpi-raspberrypi-kernel*
+/src/bbserial/raspberrypi-kernel*
*.elf
*.hex
diff --git a/Makefile b/Makefile
index ee8c2c6..401d467 100644
--- a/Makefile
+++ b/Makefile
@@ -31,11 +31,11 @@ WATCH := src/pug src/pug/templates src/stylus src/js src/resources Makefile
WATCH += src/static
ifndef HOST
-HOST=bbctrl.local
+HOST=onefinity.local
endif
ifndef PASSWORD
-PASSWORD=buildbotics
+PASSWORD=onefinity
endif
@@ -60,6 +60,7 @@ $(GPLAN_MOD): $(GPLAN_IMG)
./scripts/gplan-init-build.sh
git -C rpi-share/cbang fetch
git -C rpi-share/cbang reset --hard FETCH_HEAD
+ git -C rpi-share/cbang checkout 18f1e963107ef26abe750c023355a5c40dd07853
git -C rpi-share/camotics fetch
git -C rpi-share/camotics reset --hard FETCH_HEAD
git -C rpi-share/camotics checkout ec876c80d20fc19837133087cef0c447df5a939d
diff --git a/package.json b/package.json
index 1e3b07e..c8da749 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "bbctrl",
- "version": "1.0.6",
+ "version": "1.0.7b0",
"homepage": "https://onefinitycnc.com/",
"repository": "https://github.com/OneFinityCNC/onefinity",
"license": "GPL-3.0+",
diff --git a/scripts/gplan-build.sh b/scripts/gplan-build.sh
index a21237d..f294014 100755
--- a/scripts/gplan-build.sh
+++ b/scripts/gplan-build.sh
@@ -1,6 +1,6 @@
#!/bin/bash -ex
cd /mnt/host
-scons -C cbang disable_local="re2 libevent"
+scons -j 8 -C cbang disable_local="re2 libevent"
export CBANG_HOME="/mnt/host/cbang"
-scons -C camotics gplan.so with_gui=0 with_tpl=0
+scons -j 8 -C camotics gplan.so with_gui=0 with_tpl=0
diff --git a/src/js/admin-general-view.js b/src/js/admin-general-view.js
index 049ea25..e4ba39c 100644
--- a/src/js/admin-general-view.js
+++ b/src/js/admin-general-view.js
@@ -73,14 +73,12 @@ module.exports = {
restore: function (e) {
- debugger;
var files = e.target.files || e.dataTransfer.files;
if (!files.length) return;
var fr = new FileReader();
fr.onload = function (e) {
var config;
- debugger;
try {
config = JSON.parse(e.target.result);
} catch (ex) {
@@ -111,18 +109,15 @@ module.exports = {
cache: false
}).done(function (data) {
- debugger;
- //console.debug('>', data);
- //this.default_config = data;
- var config;
- try {
- config = JSON.parse(data);
- } catch(ex) {
- api.alert("Invalid default config file");
- return;
- }
-
- api.put('config/save', config).done(function (data) {
+ var config;
+ try {
+ config = JSON.parse(data);
+ } catch(ex) {
+ api.alert("Invalid default config file");
+ return;
+ }
+
+ api.put('config/save', config).done(function (data) {
this.confirmReset = false;
this.$dispatch('update');
@@ -149,18 +144,15 @@ module.exports = {
cache: false
}).done(function (data) {
- debugger;
- //console.debug('>', data);
- //this.default_config = data;
- var config;
- try {
- config = JSON.parse(data);
- } catch(ex) {
- api.alert("Invalid default config file");
- return;
- }
-
- api.put('config/save', config).done(function (data) {
+ var config;
+ try {
+ config = JSON.parse(data);
+ } catch(ex) {
+ api.alert("Invalid default config file");
+ return;
+ }
+
+ api.put('config/save', config).done(function (data) {
this.confirmReset = false;
this.$dispatch('update');
diff --git a/src/js/app.js b/src/js/app.js
index e2555ad..f724022 100644
--- a/src/js/app.js
+++ b/src/js/app.js
@@ -359,13 +359,13 @@ module.exports = new Vue({
// },
get_ip_address : function() {
- console.debug('get_ip>', this.ipAddress);
- return this.ipAddress;
+ console.debug('get_ip>', this.ipAddress);
+ return this.ipAddress;
},
get_ssid : function() {
- console.debug('get_ssid>', this.wifiSSID);
- return this.wifiSSID;
+ console.debug('get_ssid>', this.wifiSSID);
+ return this.wifiSSID;
},
// get_disk_space : function() {
@@ -408,6 +408,11 @@ module.exports = new Vue({
}
update_object(this.state, e.data, false);
+
+ if (this.state.pw === 0) {
+ Vue.set(this.state, "probe_connected", true);
+ }
+
this.$broadcast('update');
}.bind(this)
diff --git a/src/js/control-view.js b/src/js/control-view.js
index 2657ead..4b76f7f 100644
--- a/src/js/control-view.js
+++ b/src/js/control-view.js
@@ -67,6 +67,7 @@ module.exports = {
deleteGCode: false,
tab: 'auto',
jog_incr: 1.0,
+ probe_test: false,
tool_msg: false,
tool_diameter: 6.35,
toolpath_msg: {x: false, y: false, z: false, a: false, b: false, c: false},
@@ -259,8 +260,27 @@ module.exports = {
},
- set_tool_diameter : function (new_diameter) {
+ start_probe_test: function(on_finish) {
+ this.probe_test = true;
+ Vue.set(this.state, "probe_connected", false);
+ Vue.set(this.state, "on_probe_finish", on_finish);
+ },
+ finish_probe_test: function() {
+ this.probe_test = false;
+ Vue.set(this.state, "probe_connected", false);
+
+ const on_finish = this.state.on_probe_finish;
+ Vue.set(this.state, "on_probe_finish", undefined);
+
+ on_finish();
+ },
+
+ show_tool_diameter_prompt: function() {
+ this.tool_msg = true;
+ },
+
+ set_tool_diameter : function (new_diameter) {
if(isNaN(new_diameter))
return;
@@ -269,7 +289,6 @@ module.exports = {
this.tool_diameter = parseFloat(new_diameter);
this.probe_xyz();
-
},
set_jog_incr: function(newValue) {
@@ -435,9 +454,6 @@ module.exports = {
var zcmd = "Z" + z_jog * this.jog_incr;
var acmd = "A" + a_jog * this.jog_incr;
- console.log("Jog command: " + this.jog_incr);
- //debugger;
-
this.send('G91\nG0' + xcmd + ycmd + zcmd + acmd + '\n');
},
@@ -458,15 +474,20 @@ module.exports = {
},
- load_toolpath: function (file, file_time) {
+ load_toolpath: async function (file, file_time) {
this.toolpath = {};
if (!file) return;
-
- api.get('path/' + file).done(function (toolpath) {
if (this.last_file_time != file_time) return;
+ this.showGcodeMessage = true;
+
+ let done = false;
+ while (!done) {
+ const toolpath = await api.get(`path/${file}`);
+
if (typeof toolpath.progress == 'undefined') {
+ done = true;
toolpath.filename = file;
this.toolpath_progress = 1;
this.showGcodeMessage = false;
@@ -478,13 +499,10 @@ module.exports = {
Vue.set(state, 'path_min_' + axis, bounds.min[axis]);
Vue.set(state, 'path_max_' + axis, bounds.max[axis]);
}
-
} else {
- this.showGcodeMessage = true;
this.toolpath_progress = toolpath.progress;
- this.load_toolpath(file, file_time); // Try again
}
- }.bind(this));
+ }
},
diff --git a/src/js/gcode-viewer.js b/src/js/gcode-viewer.js
index 658382c..633a8d5 100644
--- a/src/js/gcode-viewer.js
+++ b/src/js/gcode-viewer.js
@@ -80,33 +80,29 @@ module.exports = {
methods: {
- load: function (file) {
+ load: async function(file) {
if (file == this.file) return;
this.clear();
this.file = file;
if (!file) return;
- var xhr = new XMLHttpRequest();
- xhr.open('GET', '/api/file/' + file + '?' + Math.random(), true);
- xhr.responseType = 'text';
+ const response = await fetch(`/api/file/${file}?${Math.random()}`);
+ const text = await response.text();
- xhr.onload = function (e) {
- if (this.file != file) return;
- var lines = escapeHTML(xhr.response.trimRight()).split(/\r?\n/);
-
- for (var i = 0; i < lines.length; i++) {
- lines[i] = '
' +
- '' + (i + 1) + '' + lines[i] + '';
- }
+ if (text.length > 20e6) {
+ this.clusterize.update(['File is large - gcode view disabled']);
+ } else {
+ const lines = escapeHTML(text.trimRight())
+ .split(/[\r\n]/)
+ .map((line, i) => `${i + 1}${line}`);
this.clusterize.update(lines);
- this.empty = false;
+ }
- Vue.nextTick(this.update_line);
- }.bind(this)
+ this.empty = false;
- xhr.send();
+ Vue.nextTick(this.update_line);
},
diff --git a/src/pug/templates/control-view.pug b/src/pug/templates/control-view.pug
index bad4a5f..58baee0 100644
--- a/src/pug/templates/control-view.pug
+++ b/src/pug/templates/control-view.pug
@@ -27,6 +27,54 @@
script#control-view-template(type="text/x-template")
#control
+ message(:show.sync="showGcodeMessage")
+ h3(slot="header") Processing New File
+
+ div(slot="body")
+ h3 Please wait..
+ p Simulating GCode to check for errors, calculate ETA and generate 3D view.
+
+ div(slot="footer")
+ label Simulating {{(toolpath_progress || 0) | percent}}
+
+ message(:show.sync=`ask_home_msg`)
+ h3(slot="header") Home Machine
+
+ div(slot="body")
+ p Home the machine?
+
+ div(slot="footer")
+ button.pure-button(@click="home()")
+ | OK
+
+ button.pure-button(@click='ask_home_msg = false; ask_home = false')
+ | Cancel
+
+ message(:show.sync=`ask_zero_xy_msg`)
+ h3(slot="header") XY Origin
+
+ div(slot="body")
+ p Move to XY origin?
+
+ div(slot="footer")
+ button.pure-button(@click="goto_zero(1,1,0,0)")
+ | Confirm
+
+ button.pure-button(@click='ask_zero_xy_msg = false')
+ | Cancel
+
+ message(:show.sync=`ask_zero_z_msg`)
+ h3(slot="header") Z Origin
+
+ div(slot="body")
+ p Move to Z origin?
+
+ div(slot="footer")
+ button.pure-button(@click="goto_zero(0,0,1,0)")
+ | Confirm
+
+ button.pure-button(@click='ask_zero_z_msg = false')
+ | Cancel
table(width="99%")
tr
@@ -87,7 +135,7 @@ script#control-view-template(type="text/x-template")
button.pure-button(title="Home all axes.", @click="home()",
:disabled="!is_idle",style="height:60px;width:60px")
.fa.fa-home
-
+
each axis in 'xyzabc'
tr.axis(:class=`${axis}.klass`, v-if=`${axis}.enabled`,
:title=`${axis}.title`)
@@ -114,56 +162,6 @@ script#control-view-template(type="text/x-template")
button.pure-button(@click=`toolpath_msg['${axis}'] = false`)
| OK
-
- message(:show.sync="showGcodeMessage")
- h3(slot="header") Processing New File
-
- div(slot="body")
- h3 Please wait..
- p Simulating GCode to check for errors, calculate ETA and generate 3D view.
-
- div(slot="footer")
- label Simulating {{(toolpath_progress || 0) | percent}}
-
- message(:show.sync=`ask_home_msg`)
- h3(slot="header") Home Machine
-
- div(slot="body")
- p Home the machine?
-
- div(slot="footer")
- button.pure-button(@click="home()")
- | OK
-
- button.pure-button(@click='ask_home_msg = false; ask_home = false')
- | Cancel
-
- message(:show.sync=`ask_zero_xy_msg`)
- h3(slot="header") XY Origin
-
- div(slot="body")
- p Move to XY origin?
-
- div(slot="footer")
- button.pure-button(@click="goto_zero(1,1,0,0)")
- | Confirm
-
- button.pure-button(@click='ask_zero_xy_msg = false')
- | Cancel
-
- message(:show.sync=`ask_zero_z_msg`)
- h3(slot="header") Z Origin
-
- div(slot="body")
- p Move to Z origin?
-
- div(slot="footer")
- button.pure-button(@click="goto_zero(0,0,1,0)")
- | Confirm
-
- button.pure-button(@click='ask_zero_z_msg = false')
- | Cancel
-
th.actions
button.pure-button(:disabled="!can_set_axis",
title=`Set {{'${axis}' | upper}} axis position.`,
@@ -308,7 +306,21 @@ script#control-view-template(type="text/x-template")
.bar(:style="'width:' + (progress || 0) * 100 + '%'")
tr
td(style="white-space: nowrap;text-align:center")
- button(:class="state['pw'] ? '' : 'load-on'",style="height:100px;width:200px",@click="tool_msg = true",) Probe XYZ
+ message(:show.sync=`probe_test`)
+ h3(slot="header") Test probe connection
+
+ div(slot="body")
+ .pure-form
+ p Attach the probe magnet to the collet.
+ p Touch the probe block to the bit.
+
+ div(slot="footer")
+ button.pure-button(@click=`probe_test = false`)
+ | Cancel
+
+ button.pure-button.button-success(
+ :disabled=`!state.probe_connected`
+ @click=`finish_probe_test()`) Continue
message(:show.sync=`tool_msg`)
h3(slot="header") Enter probe tool information
@@ -328,9 +340,9 @@ script#control-view-template(type="text/x-template")
button.pure-button.button-success(
@click=`set_tool_diameter(tool_diameter)`) Set
+ button(:class="state['pw'] ? '' : 'load-on'", style="height:100px;width:200px", @click=`start_probe_test(show_tool_diameter_prompt)`) Probe XYZ
+ button(:class="state['pw'] ? '' : 'load-on'", style="height:100px;width:200px", @click=`start_probe_test(probe_z)`) Probe Z
- button(:class="state['pw'] ? '' : 'load-on'",style="height:100px;width:200px",@click="probe_z()") Probe Z
-
.tabs
diff --git a/src/py/bbctrl/Config.py b/src/py/bbctrl/Config.py
index 0034cfe..83d61c8 100644
--- a/src/py/bbctrl/Config.py
+++ b/src/py/bbctrl/Config.py
@@ -137,7 +137,9 @@ class Config(object):
def upgrade(self, config):
- version = tuple(map(int, config['version'].split('.')))
+ version = config['version']
+ version = version.split('b')[0] # Strip off any "beta" suffix
+ version = tuple(map(int, version.split('.'))) # Break it into a tuple of integers
if version < (0, 2, 4):
for motor in config['motors']:
@@ -177,7 +179,7 @@ class Config(object):
self._update(config, False)
with open(self.ctrl.get_path('config.json'), 'w') as f:
- json.dump(config, f)
+ json.dump(config, f, indent=2)
os.sync()
diff --git a/src/py/bbctrl/Planner.py b/src/py/bbctrl/Planner.py
index 0b2e1b3..e5fc20b 100644
--- a/src/py/bbctrl/Planner.py
+++ b/src/py/bbctrl/Planner.py
@@ -381,7 +381,7 @@ class Planner():
except RuntimeError as e:
# Pass on the planner message
- self.log.error(str(e));
+ self.log.error(str(e))
self.stop()
except:
diff --git a/src/py/bbctrl/State.py b/src/py/bbctrl/State.py
index 80ff92f..2bb42fc 100644
--- a/src/py/bbctrl/State.py
+++ b/src/py/bbctrl/State.py
@@ -105,7 +105,7 @@ class State(object):
def load_files(self):
- self.files = []
+ files = []
upload = self.ctrl.get_upload()
@@ -116,37 +116,38 @@ class State(object):
for path in os.listdir(upload):
if os.path.isfile(upload + '/' + path):
- self.files.append(path)
+ files.append(path)
- self.files.sort()
- self.set('files', self.files)
+ files.sort()
+ self.set('files', files)
- if len(self.files): self.select_file(self.files[0])
+ if len(files): self.select_file(files[0])
else: self.select_file('')
def clear_files(self):
self.select_file('')
- self.files = []
- self.changes['files'] = self.files
+ self.set('files', [])
def add_file(self, filename):
- if not filename in self.files:
- self.files.append(filename)
- self.files.sort()
- self.changes['files'] = self.files
+ files = copy.deepcopy(self.get('files'))
+ if not filename in files:
+ files.append(filename)
+ files.sort()
+ self.set('files', files)
self.select_file(filename)
def remove_file(self, filename):
- if filename in self.files:
- self.files.remove(filename)
- self.changes['files'] = self.files
+ files = copy.deepcopy(self.get('files'))
+ if filename in files:
+ files.remove(filename)
+ self.set('files', files)
if self.get('selected', filename) == filename:
- if len(self.files): self.select_file(self.files[0])
+ if len(files): self.select_file(files[0])
else: self.select_file('')