From e7d015487cfb8e51b3332964e53ae682cb4d7745 Mon Sep 17 00:00:00 2001 From: Eric McNiece Date: Wed, 17 May 2023 21:57:01 -0700 Subject: [PATCH 1/3] fix: @babel/polyfill not found in Docker container (#831) Co-authored-by: Eric McNiece --- entrypoint | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/entrypoint b/entrypoint index b193e551b..e224f802f 100755 --- a/entrypoint +++ b/entrypoint @@ -1,8 +1,6 @@ #!/usr/bin/env node -require('@babel/polyfill'); - -const launchServer = require('/opt/cncjs/server-cli').default; +const launchServer = require('/opt/cncjs/server-cli'); launchServer().catch(err => { console.error('Error:', err); From a4f48618008c2a1729a15b827be7d4fe6b8499ea Mon Sep 17 00:00:00 2001 From: Cheton Wu <447801+cheton@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:26:54 +0800 Subject: [PATCH 2/3] feat(Marlin): add support for parsing temperature data for heated chamber, cooler, and other temperature states (#832) --- .../MarlinLineParserResultTemperature.js | 116 ++++++++++++++++-- test/marlin.js | 45 +++++++ 2 files changed, 150 insertions(+), 11 deletions(-) diff --git a/src/server/controllers/Marlin/MarlinLineParserResultTemperature.js b/src/server/controllers/Marlin/MarlinLineParserResultTemperature.js index 8f4266319..413e7df7b 100644 --- a/src/server/controllers/Marlin/MarlinLineParserResultTemperature.js +++ b/src/server/controllers/Marlin/MarlinLineParserResultTemperature.js @@ -1,6 +1,21 @@ import { ensureString } from 'ensure-type'; class MarlinLineParserResultTemperature { + // https://github.com/MarlinFirmware/Marlin/blob/2.1.x/Marlin/src/module/temperature.cpp + // + // Print a single heater state in the form: + // Bed: " B:nnn.nn /nnn.nn" + // Chamber: " C:nnn.nn /nnn.nn" + // Cooler: " L:nnn.nn /nnn.nn" + // Probe: " P:nnn.nn" + // Board: " M:nnn.nn" + // SoC: " S:nnn.nn" + // Redundant: " R:nnn.nn /nnn.nn" + // Extruder: " T0:nnn.nn /nnn.nn" + // With ADC: " T0:nnn.nn /nnn.nn (nnn.nn)" + // + // Example #1 + // ``` // ok T:0 // ok T:293.0 /0.0 B:25.9 /0.0 @:0 B@:0 // ok T:293.0 /0.0 B:25.9 /0.0 T0:293.0 /0.0 T1:100.0 /0.0 @:0 B@:0 @0:0 @1:0 @@ -12,36 +27,66 @@ class MarlinLineParserResultTemperature { // T:293.0 /0.0 B:25.9 /0.0 T0:293.0 /0.0 T1:100.0 /0.0 @:0 B@:0 @0:0 @1:0 // T:293.0 /0.0 (0.0) B:25.9 /0.0 T0:293.0 /0.0 (0.0) T1:100.0 /0.0 (0.0) @:0 B@:0 @0:0 @1:0 // T0:27.37 /0.00 B:28.27 /0.00 T0:27.58 /0.00 T1:27.37 /0.00 @:0 B@:0 @0:0 @1:0 + // ``` // - // Example: When the active hot end is set to T0 + // Example #2: T0 is the active hotend + // ``` // T:293.0 /0.0 B:25.9 /0.0 T0:293.0 /0.0 T1:100.0 /0.0 @:0 B@:0 @0:0 @1:0 // T0:293.0 /0.0 B:25.9 /0.0 T0:293.0 /0.0 T1:100.0 /0.0 @:0 B@:0 @0:0 @1:0 + // ``` // - // Example: When the active hot end is set to T1 + // Example #3: T1 is the active hotend + // ``` // T:100.0 /0.0 B:25.9 /0.0 T0:293.0 /0.0 T1:100.0 /0.0 @:0 B@:0 @0:0 @1:0 // T0:100.0 /0.0 B:25.9 /0.0 T0:293.0 /0.0 T1:100.0 /0.0 @:0 B@:0 @0:0 @1:0 + // ``` static parse(line) { - let r = line.match(/^(ok)?\s+(T|T\d+):[0-9\.\-]+/i); + let r = line.match(/^(ok)?\s+(T\d+|T|B|C|L|P|M|S|R):[0-9\.\-]+/i); if (!r) { return null; } const payload = { ok: line.startsWith('ok'), - extruder: {}, // active hotend - heatedBed: {}, + + // T0:nnn.nn /nnn.nn + // T1:nnn.nn /nnn.nn hotend: {}, + + // T:nnn.nn /nnn.nn + extruder: {}, + + // B:nnn.nn /nnn.nn + heatedBed: {}, + + // C:nnn.nn /nnn.nn + heatedChamber: {}, + + // L:nnn.nn /nnn.nn + cooler: {}, + + // P:nnn.nn + probe: {}, + + // M:nnn.nn + board: {}, + + // S:nnn.nn + soc: {}, + + // R:nnn.nn /nnn.nn + redundant: {}, }; - const re = /(?:(?:(T|B|T\d+):([0-9\.\-]+)\s+\/([0-9\.\-]+)(?:\s+\((?:[0-9\.\-]+)\))?)|(?:(@|B@|@\d+):([0-9\.\-]+))|(?:(W):(\?|[0-9]+)))/ig; + const re = /(?:(?:(T\d+|T|B|C|L|P|M|S|R):([0-9\.\-]+)\s+\/([0-9\.\-]+)(?:\s+\((?:[0-9\.\-]+)\))?)|(?:(@|B@|C@|@\d+):([0-9\.\-]+))|(?:(W):(\?|[0-9]+)))/ig; while ((r = re.exec(line))) { - // r[1] = T, B, T0, T1 - // r[4] = @, B@, @0, @1 + // r[1] = T0, T1, T, B, C, L, P, M, S, R + // r[4] = @, B@, C@, @0, @1 // r[6] = W const key = r[1] || r[4] || r[6]; - { // Hotend temperature (T0:293.0 /0.0) + { // Multi-Hotend (T0:293.0 /0.0) const found = ensureString(key).match(/^T(\d+)$/); if (found) { const hotendIndex = parseInt(found[1], 10); @@ -61,18 +106,51 @@ class MarlinLineParserResultTemperature { } } - if (key === 'T') { // T:293.0 /0.0 + if (key === 'T') { // Hotend (T:293.0 /0.0) payload.extruder.deg = payload.extruder.deg ?? r[2]; payload.extruder.degTarget = payload.extruder.degTarget ?? r[3]; continue; } - if (key === 'B') { // B:60.0 /0.0 + if (key === 'B') { // Heated bed (B:60.0 /0.0) payload.heatedBed.deg = r[2]; payload.heatedBed.degTarget = r[3]; continue; } + if (key === 'C') { // Heated chamber + payload.heatedChamber.deg = r[2]; + payload.heatedChamber.degTarget = r[3]; + continue; + } + + if (key === 'L') { // Cooler + payload.cooler.deg = r[2]; + payload.cooler.degTarget = r[3]; + continue; + } + + if (key === 'P') { // Probe + payload.probe.deg = r[2]; + continue; + } + + if (key === 'M') { // Board + payload.board.deg = r[2]; + continue; + } + + if (key === 'S') { // SoC + payload.soc.deg = r[2]; + continue; + } + + if (key === 'R') { // Redundant + payload.redundant.deg = r[2]; + payload.redundant.degTarget = r[3]; + continue; + } + if (key === '@') { // @:127 payload.extruder.power = r[5]; continue; @@ -83,6 +161,22 @@ class MarlinLineParserResultTemperature { continue; } + if (key === 'C@') { // C@:127 + // The first @C:nnn represents the soft PWM amount of the heated chamber + if (payload.heatedChamber.deg !== undefined && payload.heatedChamber.power === undefined) { + // Set power for heated chamber if not set + payload.heatedChamber.power = r[5]; + continue; + } + + // The second @C:nnn represents the soft PWM amount of the cooler + if (payload.cooler.deg !== undefined && payload.cooler.power === undefined) { + // Set power for cooler if not set + payload.cooler.power = r[5]; + continue; + } + } + { // Hotend power (@0:0) const found = ensureString(key).match(/^@(\d+)$/); if (found) { diff --git a/test/marlin.js b/test/marlin.js index bb989c0b7..030f15ce7 100644 --- a/test/marlin.js +++ b/test/marlin.js @@ -286,6 +286,51 @@ test('MarlinLineParserResultTemperature', (t) => { runner.parse(line); }); + t.test('ok L:21.84 /0.00 @:0 C@:0', (t) => { + const runner = new MarlinRunner(); + runner.on('temperature', ({ raw, ok, extruder, cooler }) => { + t.equal(raw, 'ok L:21.84 /0.00 @:0 C@:0'); + t.equal(ok, true); + t.same(extruder, { + power: 0, + }); + t.same(cooler, { + deg: '21.84', + degTarget: '0.00', + power: 0, + }); + t.end(); + }); + + const line = 'ok L:21.84 /0.00 @:0 C@:0'; + runner.parse(line); + }); + + t.test('ok C:25.9 /0.00 L:21.84 /0.00 @:0 C@:127 C@:0', (t) => { + const runner = new MarlinRunner(); + runner.on('temperature', ({ raw, ok, extruder, heatedChamber, cooler }) => { + t.equal(raw, 'ok C:25.9 /0.00 L:21.84 /0.00 @:0 C@:127 C@:0'); + t.equal(ok, true); + t.same(extruder, { + power: 0, + }); + t.same(heatedChamber, { + deg: '25.9', + degTarget: '0.00', + power: 127, + }); + t.same(cooler, { + deg: '21.84', + degTarget: '0.00', + power: 0, + }); + t.end(); + }); + + const line = 'ok C:25.9 /0.00 L:21.84 /0.00 @:0 C@:127 C@:0'; + runner.parse(line); + }); + t.test(' T:293.0 /0.0 B:25.9 /0.0 @:0 B@:0', (t) => { const runner = new MarlinRunner(); runner.on('temperature', ({ raw, ok, extruder, heatedBed, hotend, wait }) => { From 5e1dc9abffb48d34c8e0e32364c9191f7c75bad7 Mon Sep 17 00:00:00 2001 From: cheton Date: Sat, 1 Jul 2023 17:41:44 +0800 Subject: [PATCH 3/3] chore(release): publish 1.10.3 --- package.json | 2 +- src/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 93f4300b8..bcf4b8970 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cncjs", - "version": "1.10.2", + "version": "1.10.3", "description": "A web-based interface for CNC milling controller running Grbl, Marlin, Smoothieware, or TinyG", "homepage": "https://github.com/cncjs/cncjs", "author": "Cheton Wu ", diff --git a/src/package.json b/src/package.json index 187d53044..6bb553d19 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "cncjs-app", - "version": "1.10.2", + "version": "1.10.3", "productName": "CNCjs", "description": "CNC Milling Controller", "homepage": "https://github.com/cncjs/cncjs",