From f1e5ccae1aa6e268f97e46e24f5f57e0f8a161da Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 10 Feb 2025 17:00:25 -0500 Subject: [PATCH] add ams tray selector --- mods/bambu/bambu.js | 44 +++++++++++++++++++++++++++++++++++++++----- mods/bambu/init.js | 9 ++++----- src/moto/webui.js | 5 +++++ 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/mods/bambu/bambu.js b/mods/bambu/bambu.js index db61cae9..f08d1be0 100644 --- a/mods/bambu/bambu.js +++ b/mods/bambu/bambu.js @@ -223,6 +223,23 @@ self.kiri.load(api => { total_layer_num, upload } = print || {}; + let { tray_pre, tray_now, tray_tar } = ams || {}; + let trays = ams?.ams?.map((ams, unit) => { + return ams.tray.map(tray => { + return { unit, wet: ams.humidity, ...tray }; + }); + }).flat(); + if (trays && trays.length) { + let options = trays.map(tray => h.option({ + _: tray.id, + _selected: tray_now === tray.id, + value: tray.id, + })); + h.bind($('bbl_ams_tray'), [ + h.option({ _: 'none', value: '255' }), + ...options + ]); + } let state = (gcode_state || 'unknown').toLowerCase(); $('bbl_noz').value = nozzle_diameter || ''; $('bbl_noz_temp').value = nozzle_temper?.toFixed(1) ?? ''; @@ -271,11 +288,12 @@ self.kiri.load(api => { }), undefined, 2); $('bbl_accel').selectedIndex = (spd_lvl ?? 2) - 1; if (print_error) { - bbl_status.value = `print error ${print_error}` + bbl_status.value = `${state} | print error ${print_error}` } else if (mc_remaining_time && gcode_state !== 'FAILED') { bbl_status.value = `layer ${layer_num} of ${total_layer_num} | ${mc_percent}% complete | ${mc_remaining_time} minutes left | ${state}` } else { - bbl_status.value = `printer ${print_type || ""} | ${state}`; + let ams_tray = tray_now !== tray_tar ? ` | ams loading spool ${tray_tar}` : ''; + bbl_status.value = `printer ${print_type || ""} | ${state}${ams_tray}`; } if (gcode_state && conn_alert) { api.alerts.hide(conn_alert); @@ -285,7 +303,7 @@ self.kiri.load(api => { function render_list(to) { let list = Object.keys(printers).map(name => { return selected?.name === name ? - h.option({ _: name, value: name, selected: true }) : + h.option({ _: name, value: name, _selected: true }) : h.option({ _: name, value: name }); }); list = [ @@ -363,6 +381,7 @@ self.kiri.load(api => { function file_print(path) { if (selected?.rec?.host && path) { let { host, code, serial } = selected.rec; + console.log({ file_print: path, host, code, serial, amsmap }); socket.send({ cmd: "file-print", path, host, code, serial, amsmap }); } } @@ -577,7 +596,7 @@ self.kiri.load(api => { h.canvas({ id: "bbl_video", class: "video hide", - style: "width: 100%; height: 100%; box-sizing: border-box", + style: "width: 100%; height: auto; box-sizing: border-box; aspect-ratio: 16 / 9", }) ]), h.div({ class: "f-col gap3" }, [ @@ -585,7 +604,6 @@ self.kiri.load(api => { 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'), @@ -601,6 +619,21 @@ self.kiri.load(api => { }) } }) ]), + h.div({ class: "var-row" }, [ + h.label('tray select'), + h.select({ id: "bbl_ams_tray", onchange() { + let new_tray = $('bbl_ams_tray').value + api.alerts.show(`select tray ${new_tray}`,2); + cmd_direct({ + print: { + command: 'ams_change_filament', + curr_temp: 220, // current filament heat to + tar_temp: 220, // new filament heat to + target: parseInt(new_tray) + } + }); + } }) + ]), ]), h.div({ class: "t-body t-inset f-col gap3 pad4 grow" }, [ h.label({ class: "set-header dev-sel" }, [ @@ -676,6 +709,7 @@ self.kiri.load(api => { onclick() { console.log({ printing: selected.file.path }); file_print(selected.file.path); + api.alerts.show(`printing: ${selected.file.path}`,2); }}), ]), h.div({ class: "t-body t-inset f-col gap3 pad4" }, [ diff --git a/mods/bambu/init.js b/mods/bambu/init.js index 378ae452..dc77052c 100644 --- a/mods/bambu/init.js +++ b/mods/bambu/init.js @@ -10,7 +10,7 @@ module.exports = async (server) => { const mcache = {}; const wsopen = []; const found = {}; - const debug = false; + const debug = true; class MQTT { #timer; @@ -205,7 +205,6 @@ module.exports = async (server) => { function file_print(opts = {}) { const { host, code, serial, filename, amsmap } = opts; - debug && util.log({ file_print: opts }); const cmd = { print: { command: "project_file", @@ -221,8 +220,9 @@ module.exports = async (server) => { } }; if (amsmap) { - cmd.print.ams_mapping = amsmap; + cmd.print.ams_mapping = amsmap.split(',').map(v => parseInt(v)); } + debug && util.log({ file_print: cmd }); get_mqtt(host, code, serial, message => { debug && util.log('mqtt_recv', message); wsend({ serial, message }); @@ -311,11 +311,10 @@ module.exports = async (server) => { res.setHeader('Cache-Control', 'no-cache, no-store, private'); const data = req.app.post; const { host, code, filename, serial, ams, start } = query; - const amsmap = ams ? ams.split(',').map(v => parseInt(v)) : undefined; ftp_send({ host, code, filename, data }) .then(() => { if (serial && start ==='true') { - file_print({ host, code, serial, filename, amsmap }); + file_print({ host, code, serial, filename, amsmap: ams }); } res.end(o2s({ sent: true })); }) diff --git a/src/moto/webui.js b/src/moto/webui.js index cd8e7f71..bc77f910 100644 --- a/src/moto/webui.js +++ b/src/moto/webui.js @@ -33,9 +33,14 @@ function build(data, context) { html.push(`<${type}`); let func = {}; for (let [key, val] of Object.entries(attr || {})) { + if (val === undefined) { + continue; + } let tov = typeof val; if (key === '_') { text = val; + } else if (key.startsWith('_')) { + if (val) html.push(` ${key.substring(1)}`); } else if (key === 'id') { elid = val ? (tov === 'object' ? val.join('_') : val) : undefined; } else if (tov === 'function') {