add nozzle, bed, fan, light controls

This commit is contained in:
Stewart Allen 2025-02-02 14:07:59 -05:00
commit 3921bad804
3 changed files with 163 additions and 28 deletions

View file

@ -7,10 +7,11 @@ self.kiri.load(api => {
}
const { kiri, moto } = self;
const { ui } = api;
const { ui } = kiri;
const h = moto.webui;
const defhost = ";; DEFINE BAMBU-HOST ";
const defams = ";; DEFINE BAMBU-AMS ";
const readonly = true;
let init = false;
let status = {};
@ -154,6 +155,7 @@ self.kiri.load(api => {
function printer_render(rec = {}) {
let { info, print, files } = rec;
let {
ams,
ams_status,
bed_target_temper,
bed_temper,
@ -161,10 +163,13 @@ self.kiri.load(api => {
big_fan2_speed,
chamber_temper,
cooling_fan_speed,
fan_gear,
gcode_file,
gcode_state, // PREPARE, PAUSE, RUNNING, FAILED
heatbreak_fan_speed,
home_flag,
layer_num,
lights_report,
mc_percent,
mc_remaining_time,
nozzle_diameter,
@ -180,13 +185,18 @@ self.kiri.load(api => {
$('bbl_noz').value = nozzle_diameter || '';
$('bbl_noz_temp').value = nozzle_temper?.toFixed(1) ?? '';
$('bbl_noz_target').value = nozzle_target_temper?.toFixed(1) ?? '';
$('bbl_noz_on').checked = nozzle_target_temper > 0;
$('bbl_bed_temp').value = bed_temper?.toFixed(1) ?? '';
$('bbl_bed_target').value = bed_target_temper?.toFixed(1) ?? '';
$('bbl_bed_on').checked = bed_target_temper > 0;
$('bbl_pause').disabled = (gcode_state !== 'RUNNING');
$('bbl_resume').disabled = (gcode_state !== 'PAUSE' || gcode_state === 'FAILED');
$('bbl_fan_part').value = cooling_fan_speed || 0;
$('bbl_fan_part_on').checked = cooling_fan_speed > 0 ? true : false;
$('bbl_fan_1').value = big_fan1_speed || 0;
$('bbl_fan_1_on').checked = big_fan1_speed > 0 ? true : false;
$('bbl_fan_2').value = big_fan2_speed || 0;
$('bbl_fan_2_on').checked = big_fan2_speed > 0 ? true : false;
$('bbl_fan_heatbreak').value = heatbreak_fan_speed || 0;
$('bbl_file_active').value = gcode_file || '';
if (files && filelist.selectedIndex === -1) {
@ -203,8 +213,20 @@ self.kiri.load(api => {
filelist.selectedIndex = 0;
filelist.onchange();
}
(lights_report || []).forEach(rec => {
if (rec.node === 'chamber_light') {
$('bbl_chamber_light').checked = (rec.mode === 'on');
}
});
ui.setVisible($('bbl_ams'), ams?.version ? true : false);
$('bbl_ams_spool').checked = ((home_flag ?? 0) & 0x400) ? true : false;
$('bbl_step_recover').checked = ((home_flag ?? 0) & 0x10) ? true : false;
// provide only the print info from the serial recorld
$('bbl_rec').value = JSON.stringify(deepSortObject({ ...rec.print }), undefined, 2);
$('bbl_rec').value = JSON.stringify(deepSortObject({
...rec.print
// info: rec.info,
// print: rec.print,
}), undefined, 2);
if (print_error) {
bbl_status.value = `print error ${print_error}`
} else if (mc_remaining_time && gcode_state !== 'FAILED') {
@ -252,12 +274,23 @@ self.kiri.load(api => {
return selected?.rec?.serial ? true : false;
}
function cmd_if(cmd) {
function cmd_if(cmd, obj = {}) {
if (monitoring()) {
socket.send({ cmd, serial: selected.rec.serial });
socket.send({ ...obj, cmd, serial: selected.rec.serial });
}
}
function cmd_direct(obj = {}) {
cmd_if("direct", { direct: obj });
}
function cmd_gcode(code) {
cmd_direct({ print: {
command: "gcode_line",
param: `${code} \n`
} });
}
function file_list() {
if (selected?.rec?.host) {
filelist.selectedIndex = -1;
@ -365,15 +398,24 @@ self.kiri.load(api => {
]),
h.div({ class: "var-row" }, [
h.label('diameter'),
h.input({ id: "bbl_noz", size: 5 })
h.input({ id: "bbl_noz", size: 5, readonly })
]),
h.div({ class: "var-row" }, [
h.label('temp'),
h.input({ id: "bbl_noz_temp", size: 5 })
h.input({ id: "bbl_noz_temp", size: 5, readonly })
]),
h.div({ class: "var-row" }, [
h.div({ class: "var-row", ondblclick() {
let value = prompt('new nozzle temp', $('bbl_noz_target').value);
if (value !== null) {
cmd_gcode(`M104 S${value}`)
}
} }, [
h.label('target'),
h.input({ id: "bbl_noz_target", size: 5 })
h.input({ id: "bbl_noz_on", type: "checkbox", onclick() {
let value = $('bbl_noz_on').checked ? '220' : '0';
cmd_gcode(`M104 S${value}`)
} }),
h.input({ id: "bbl_noz_target", size: 5, readonly })
])
]),
h.div({ class: "t-body t-inset f-col" }, [
@ -382,33 +424,81 @@ self.kiri.load(api => {
]),
h.div({ class: "var-row" }, [
h.label('temp'),
h.input({ id: "bbl_bed_temp", size: 5 })
h.input({ id: "bbl_bed_temp", size: 5, readonly })
]),
h.div({ class: "var-row" }, [
h.div({ class: "var-row", ondblclick() {
let value = prompt('new bed temp', $('bbl_bed_target').value);
if (value !== null) {
cmd_gcode(`M140 S${value}`)
}
} }, [
h.label('target'),
h.input({ id: "bbl_bed_target", size: 5 })
h.input({ id: "bbl_bed_on", type: "checkbox", onclick() {
let value = $('bbl_bed_on').checked ? '60' : '0';
cmd_gcode(`M140 S${value}`);
} }),
h.input({ id: "bbl_bed_target", size: 5, readonly })
])
]),
h.div({ class: "t-body t-inset f-col" }, [
h.label({ class: "set-header dev-sel" }, [
h.a('fans')
h.a('chamber')
]),
h.div({ class: "var-row", ondblclick() {
let value = prompt('new part fan value', $('bbl_fan_part').value);
if (value !== null) {
cmd_gcode(`M106 P1 S${value}`)
}
} }, [
h.label('part fan'),
h.input({ id: "bbl_fan_part_on", type: "checkbox", onclick() {
let value = $('bbl_fan_part_on').checked ? '255' : '0';
cmd_gcode(`M106 P1 S${value}`)
} }),
h.input({ id: "bbl_fan_part", size: 5, readonly })
]),
h.div({ class: "var-row", ondblclick() {
let value = prompt('new aux fan value', $('bbl_fan_1').value);
if (value !== null) {
cmd_gcode(`M106 P2 S${value}`)
}
} }, [
h.label('aux fan'),
h.input({ id: "bbl_fan_1_on", type: "checkbox", onclick() {
let value = $('bbl_fan_1_on').checked ? '255' : '0';
cmd_gcode(`M106 P2 S${value}`)
} }),
h.input({ id: "bbl_fan_1", size: 5, readonly })
]),
h.div({ class: "var-row", ondblclick() {
let value = prompt('new chamber fan value', $('bbl_fan_2').value);
if (value !== null) {
cmd_gcode(`M106 P3 S${value}`)
}
} }, [
h.label('chamber fan'),
h.input({ id: "bbl_fan_2_on", type: "checkbox", onclick() {
let value = $('bbl_fan_2_on').checked ? '255' : '0';
cmd_gcode(`M106 P3 S${value}`)
} }),
h.input({ id: "bbl_fan_2", size: 5, readonly })
]),
h.div({ class: "var-row" }, [
h.label('part'),
h.input({ id: "bbl_fan_part", size: 5 })
h.label('heatbreak fan'),
h.input({ id: "bbl_fan_heatbreak", size: 5, readonly })
]),
h.div({ class: "var-row" }, [
h.label('fan1'),
h.input({ id: "bbl_fan_1", size: 5 })
h.label('light'),
h.input({ id: "bbl_chamber_light", type: "checkbox", onclick() {
cmd_direct({
system: {
command: "ledctrl",
led_node: "chamber_light",
led_mode: $('bbl_chamber_light').checked ? "on" : "off"
}
})
} })
]),
h.div({ class: "var-row" }, [
h.label('fan2'),
h.input({ id: "bbl_fan_2", size: 5 })
]),
h.div({ class: "var-row" }, [
h.label('heatbreak'),
h.input({ id: "bbl_fan_heatbreak", size: 5 })
])
])
]),
h.div({ class: "f-col gap4 grow" }, [
@ -421,6 +511,47 @@ self.kiri.load(api => {
})
]),
h.div({ class: "f-col gap3" }, [
h.div({ id: "bbl_ams", class: "hide t-body t-inset f-col gap3 pad4" }, [
h.label({ class: "set-header dev-sel" }, [
h.a('ams')
]),
// { print: { auto_recovery: true, command: 'print_option', option: 1, reason: 'success', result: 'success', sequence_id: '20005' } }
h.div({ class: "var-row" }, [
// home_flag bit 11 (0x400)
h.label('auto spool advance'),
h.input({ id: "bbl_ams_spool", type: "checkbox", onclick() {
cmd_direct({
print: {
auto_switch_filament: $('bbl_ams_spool').checked,
command: 'print_option',
sequence_id: '123',
option: $('bbl_ams_spool').checked ? 1 : 0
}
})
} })
]),
]),
h.div({ class: "t-body t-inset f-col gap3 pad4 grow" }, [
h.label({ class: "set-header dev-sel" }, [
h.a('print options')
]),
h.div({ class: "var-row" }, [
// home_flag bit 5 (0x10)
h.label('auto step recovery'),
h.input({ id: "bbl_step_recover", type: "checkbox", onclick() {
cmd_direct({
print: {
auto_recovery: $('bbl_step_recover').checked,
command: 'print_option',
sequence_id: '124',
option: $('bbl_step_recover').checked ? 1 : 0
}
})
} })
]),
]),
// ]),
// h.div({ class: "f-col gap3" }, [
h.div({ class: "t-body t-inset f-col gap3 pad4 grow" }, [
h.div({ class: "set-header", onclick() {
file_list();
@ -432,11 +563,11 @@ self.kiri.load(api => {
h.select({ id: "bbl_files" }, []),
h.div({ class: "var-row" }, [
h.label('size'),
h.input({ id: "bbl_file_size", size: 12 })
h.input({ id: "bbl_file_size", size: 12, readonly })
]),
h.div({ class: "var-row" }, [
h.label('date'),
h.input({ id: "bbl_file_date", size: 12 })
h.input({ id: "bbl_file_date", size: 12, readonly })
]),
h.div({ class: "grow" }),
h.button({
@ -463,7 +594,7 @@ self.kiri.load(api => {
h.a('active file')
]),
h.div({ class: "var-row" }, [
h.input({ id: "bbl_file_active", class: "t-left", disabled: true })
h.input({ id: "bbl_file_active", class: "t-left", readonly })
]),
])
])

View file

@ -40,7 +40,7 @@ module.exports = async (server) => {
util.log('mqtt sub', this.#serial, err || "ok");
onready(this);
this.keepalive();
this.keepconn();
// this.keepconn();
});
});
@ -277,7 +277,7 @@ module.exports = async (server) => {
util.log('ws open', req.url, wsopen.length);
ws.on('message', msg => {
msg = JSON.parse(msg);
let { cmd, host, code, serial, path, amsmap } = msg;
let { cmd, host, code, serial, path, amsmap, direct } = msg;
switch (cmd) {
case "monitor":
get_mqtt(host, code, serial, message => {
@ -344,6 +344,9 @@ module.exports = async (server) => {
case "cancel":
if_mqtt(serial, { print: { command: "stop", sequence_id: "0", param: "" } });
break;
case "direct":
if_mqtt(serial, direct);
break;
case "keepalive":
// util.log({ keepalive: serial });
mcache[serial]?.keepalive();

View file

@ -2317,6 +2317,7 @@ details[open] > summary::after {
.var-row {
white-space: nowrap;
align-items: center;
gap: 4px;
}
.var-row label {
padding: 2px 4px 2px 0;