Merge branch '1.0.7-devel' into refactored-probing
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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
|
||||
|
||||
5
Makefile
5
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
|
||||
|
||||
@@ -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+",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,9 +109,6 @@ module.exports = {
|
||||
cache: false
|
||||
|
||||
}).done(function (data) {
|
||||
debugger;
|
||||
//console.debug('>', data);
|
||||
//this.default_config = data;
|
||||
var config;
|
||||
try {
|
||||
config = JSON.parse(data);
|
||||
@@ -149,9 +144,6 @@ module.exports = {
|
||||
cache: false
|
||||
|
||||
}).done(function (data) {
|
||||
debugger;
|
||||
//console.debug('>', data);
|
||||
//this.default_config = data;
|
||||
var config;
|
||||
try {
|
||||
config = JSON.parse(data);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
|
||||
@@ -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] = '<li class="ln' + (i + 1) + '">' +
|
||||
'<b>' + (i + 1) + '</b>' + lines[i] + '</li>';
|
||||
}
|
||||
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) => `<li class="ln${i + 1}"><b>${i + 1}</b>${line}</li>`);
|
||||
|
||||
this.clusterize.update(lines);
|
||||
}
|
||||
|
||||
this.empty = false;
|
||||
|
||||
Vue.nextTick(this.update_line);
|
||||
}.bind(this)
|
||||
|
||||
xhr.send();
|
||||
},
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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,8 +340,8 @@ 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="probe_z()") Probe Z
|
||||
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
|
||||
|
||||
|
||||
.tabs
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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('')
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user