diff --git a/mods/bambu/bambu.js b/mods/bambu/bambu.js index 5d41e4b6..1a86038e 100644 --- a/mods/bambu/bambu.js +++ b/mods/bambu/bambu.js @@ -13,7 +13,7 @@ self.kiri.load(api => { let monitors = []; let video_on = false; let bound, device, printers, select, selected, conn_alert, export_select; - let btn_del, in_host, in_code, in_serial, filelist; + let btn_del, in_host, in_code, in_serial, filelist, print_ams_select = 'auto'; let ptype, host, password, serial, amsmap, socket = { open: false, q: [], @@ -243,6 +243,22 @@ self.kiri.load(api => { h.option({ _: 'none', value: '255' }), ...options ]); + [ "print-bambu-spool", "bbl_file_spool" ].forEach(dropdown => { + h.bind($(dropdown),[ + h.option({ _: 'external', value: '', _selected: print_ams_select === '' }), + h.option({ _: 'ams auto', value: 'auto', _selected: print_ams_select === 'auto' }), + ...trays.map(tray => { + return h.option({ + _: `ams tray ${tray.id}`, + _selected: print_ams_select === tray.id, + value: tray.id, + }); + }) + ]); + $(dropdown).onchange = (ev) => { + print_ams_select = ev.target.value; + }; + }); let tdiv = $('bbl_ams_trays'); tdiv.setAttribute("style",[ "gap: 5px;", @@ -263,6 +279,9 @@ self.kiri.load(api => { }))) } else { $('bbl_ams_tray').innerHTML = ''; + $('bbl_file_spool').innerHTML = ''; + $('print-bambu-spool').innerHTML = ''; + print_ams_select = 'auto'; } let state = (gcode_state || 'unknown').toLowerCase(); $('bbl_noz').value = nozzle_diameter || ''; @@ -431,9 +450,17 @@ self.kiri.load(api => { function file_print(path) { if (selected?.rec?.host && path) { + let spool = print_ams_select; 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 }); + console.log({ file_print: path, host, code, serial, spool, amsmap }); + socket.send({ + cmd: "file-print", + path, + host, + code, + serial, + amsmap: spool === 'auto' && amsmap ? amsmap : spool + }); } } @@ -743,16 +770,11 @@ self.kiri.load(api => { h.label('date'), h.input({ id: "bbl_file_date", size: 12, readonly }) ]), + h.div({ class: "var-row" }, [ + h.label('spool'), + h.select({ id: "bbl_file_spool" }) + ]), h.div({ class: "grow" }), - h.button({ - _: 'delete', - id: "bbl_file_delete", - class: "f-col a-center t-center", - disabled: true, - onclick() { - console.log({ deleting: selected.file.path }); - file_delete(selected.file.path); - }}), h.button({ _: 'print', id: "bbl_file_print", @@ -763,6 +785,15 @@ self.kiri.load(api => { file_print(selected.file.path); api.alerts.show(`printing: ${selected.file.path}`,2); }}), + h.button({ + _: 'delete', + id: "bbl_file_delete", + class: "f-col a-center t-center", + disabled: true, + onclick() { + console.log({ deleting: selected.file.path }); + file_delete(selected.file.path); + }}), ]), h.div({ class: "t-body t-inset f-col gap3 pad4" }, [ h.label({ class: "set-header dev-sel" }, [ @@ -796,8 +827,8 @@ self.kiri.load(api => { select.onchange = (ev => printer_select(select.value)); filelist.onchange = (ev => { let file = selected.file = selected.status.files[filelist.selectedIndex]; - $('bbl_file_size').value = file.size; - $('bbl_file_date').value = file.date; + $('bbl_file_size').value = file?.size ?? ''; + $('bbl_file_date').value = file?.date ?? ''; $('bbl_file_delete').disabled = $('bbl_file_print').disabled = false; }); @@ -876,29 +907,32 @@ self.kiri.load(api => { api.modal.show('bambu'); } devlist.onchange = () => { - let info = printers[devlist.value]; + let info = printers[devlist.value] || {}; host = info.host; ptype = info.type; serial = info.serial; password = info.code; export_select = devlist.value; + $('print-bambu-spool').innerHMTL = ''; $('print-bambu-1').disabled = $('print-bambu-2').disabled = (host && serial && password) ? false : true; get_ams_map(settings); + printer_select(export_select); console.log({ bambu: serial, ptype, host, amsmap }); }; } function send(filename, gcode, start) { + const spool = print_ams_select; const baseUrl = '/api/bambu_send'; const url = new URL(baseUrl, window.location.origin); url.searchParams.append('host', host); url.searchParams.append('code', password); url.searchParams.append('filename', filename); url.searchParams.append('serial', serial); - url.searchParams.append('ams', amsmap); url.searchParams.append('start', start ?? false); + url.searchParams.append('ams', spool === 'auto' && amsmap ? amsmap : spool); const alert = api.alerts.show('Sending to Bambu Printer'); diff --git a/mods/bambu/frames.js b/mods/bambu/frames.js index 08dd46c0..999dce0c 100644 --- a/mods/bambu/frames.js +++ b/mods/bambu/frames.js @@ -18,6 +18,7 @@ class FrameStream extends EventEmitter { const encoder = new TextEncoder(); const userBytes = encoder.encode('bblp'); const codeBytes = encoder.encode(code); + const useCA = false; view.setInt32(0, 0x0040, true); view.setInt32(4, 0x3000, true); @@ -25,12 +26,16 @@ class FrameStream extends EventEmitter { new Uint8Array(abuf, 0x30, codeBytes.length).set(codeBytes); let frame; - const remoteSocket = this.#remoteSocket = tls.connect({ + const remoteSocket = this.#remoteSocket = tls.connect(Object.assign({}, { host, - port: 6000, + port: 6000 + }, useCA ? { ca: bblCA, servername: serial - }, () => { + } : { + rejectUnauthorized: false, + checkServerIdentity: () => {} + }), () => { // send authentication to start jpeg frame stream remoteSocket.write(Buffer.from(abuf)); this.emit('connect', host); diff --git a/mods/bambu/init.js b/mods/bambu/init.js index ec2f5c1a..eeb80c6e 100644 --- a/mods/bambu/init.js +++ b/mods/bambu/init.js @@ -11,6 +11,7 @@ module.exports = async (server) => { const mcache = {}; const wsopen = []; const found = {}; + const useCA = false; const debug = false; class MQTT { @@ -21,12 +22,15 @@ module.exports = async (server) => { #frames; #topic_report; #topic_request; - #options = { + #options = Object.assign({}, { protocol: 'mqtts', port: 8883, username: 'bblp', + }, useCA ? { ca: bblCA - } + } : { + rejectUnauthorized: false + }); constructor(host, code, serial, onready, onerror, onmessage) { this.#options.host = host; @@ -74,7 +78,10 @@ module.exports = async (server) => { keepalive() { clearTimeout(this.#timer); - this.#timer = setTimeout(() => { this.end() }, 30000); + this.#timer = setTimeout(() => { + util.log('keepalive expired', this.#serial); + this.end(); + }, 300000); } keepconn() { @@ -102,7 +109,7 @@ module.exports = async (server) => { end() { if (this.#client) { - debug && util.log('mqtt end', this.#serial); + util.log('mqtt end', this.#serial); this.#client.end(); this.#client = undefined; } @@ -144,7 +151,7 @@ module.exports = async (server) => { const host = args.host || "localhost"; const user = args.user || "bblp"; const password = args.password || args.code || ''; - // client.ftp.verbose = true; + client.ftp.verbose = debug; try { await client.access({ port, @@ -152,7 +159,12 @@ module.exports = async (server) => { user, password, secure: "implicit", - secureOptions: { ca: bblCA, servername: args.serial } + secureOptions: useCA ? { + ca: bblCA, + servername: args.serial + } : { + rejectUnauthorized: false + } }); } catch (error) { util.log({ ftp_error: error }); @@ -219,10 +231,10 @@ module.exports = async (server) => { vibration_cali: false } }; - if (amsmap) { + if (amsmap && amsmap !== 'auto') { cmd.print.ams_mapping = amsmap.split(',').map(v => parseInt(v)); } - debug && util.log({ file_print: cmd }); + util.log({ file_print: cmd }); get_mqtt(host, code, serial, message => { debug && util.log('mqtt_recv', message); wsend({ serial, message }); @@ -404,7 +416,7 @@ module.exports = async (server) => { if_mqtt(serial, direct); break; case "frames": - util.log('request frames', serial, frames); + debug && util.log('request frames', serial, frames); mcache[serial]?.set_frames(frames); break; case "keepalive": diff --git a/src/kiri/export.js b/src/kiri/export.js index 8e84594c..33ee8839 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -529,7 +529,7 @@ function exportGCodeDialog(gcode, sections, info, names) { } function gen3mf(then, ptype = 'unknown') { - console.log({ gen3mf_target: ptype }); + console.log({ gen3mf_printer_type: ptype }); let now = new Date(); let ymd = [ now.getFullYear(), @@ -583,6 +583,27 @@ function exportGCodeDialog(gcode, sections, info, names) { '' ].join('\n') },{ + // name: `Metadata/plate_1.json`, + // data: JSON.toString({ + // "bbox_all": [ 115.199992, 115.199992, 140.799992, 140.799992 ], + // "bbox_objects": [ + // { + // "area": 655.3599853515625, + // "bbox": [ 115.199992, 115.199992, 140.799992, 140.799992 ], + // "id": 42, + // "layer_height": 0.25, + // "name": "Cube" + // } + // ], + // "bed_type": "textured_plate", + // "filament_colors": ["#FFFFFF"], + // "filament_ids": [0], + // "first_extruder": 0, + // "is_seq_print": false, + // "nozzle_diameter": 0.6, + // "version": 2 + // }) + // },{ name: `Metadata/model_settings.config`, data: [ '', diff --git a/web/kiri/index.html b/web/kiri/index.html index 60bf3ecf..8338bc18 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -633,8 +633,10 @@
- + + +