Skip to content

Commit

Permalink
feat(Marlin): add support of multiple hotend readings
Browse files Browse the repository at this point in the history
  • Loading branch information
cheton committed Aug 20, 2022
1 parent 8a76a50 commit 9caaa56
Show file tree
Hide file tree
Showing 3 changed files with 208 additions and 28 deletions.
64 changes: 51 additions & 13 deletions src/server/controllers/Marlin/MarlinLineParserResultTemperature.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ensureString } from 'ensure-type';

class MarlinLineParserResultTemperature {
// ok T:0
// ok T:293.0 /0.0 B:25.9 /0.0 @:0 B@:0
Expand All @@ -9,7 +11,15 @@ class MarlinLineParserResultTemperature {
// T:293.0 /0.0 B:25.9 /0.0 @:0 B@:0
// 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.58 /0.00 B:28.27 /0.00 T0:27.58 /0.00 T1:27.37 /0.00 @: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
// 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
// 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);
if (!r) {
Expand All @@ -18,24 +28,42 @@ class MarlinLineParserResultTemperature {

const payload = {
ok: line.startsWith('ok'),
extruder: {},
heatedBed: {}
extruder: {}, // active hotend
heatedBed: {},
hotend: {},
};

const re = /(?:(?:(T|B|T\d+):([0-9\.\-]+)\s+\/([0-9\.\-]+)(?:\s+\((?:[0-9\.\-]+)\))?)|(?:(@|B@|@\d+):([0-9\.\-]+))|(?:(W):(\?|[0-9]+)))/ig;

while ((r = re.exec(line))) {
// r[1] = T, B, T0, T1
// r[4] = @, B@, @0, @1
// r[6] = W
const key = r[1] || r[4] || r[6];

if (key === 'T') { // T:293.0 /0.0
payload.extruder.deg = r[2];
payload.extruder.degTarget = r[3];
continue;
{ // Hotend temperature (T0:293.0 /0.0)
const found = ensureString(key).match(/^T(\d+)$/);
if (found) {
const hotendIndex = parseInt(found[1], 10);
const hotendKey = `T${hotendIndex}`;
payload.hotend[hotendKey] = {
...payload.hotend[hotendKey],
deg: r[2],
degTarget: r[3],
};
// Try to update the active hot end if the hot end index is 0.
// Note: The active hot end might be reported as T0 before B.
if (hotendIndex === 0) { // T0:27.37 /0.00
payload.extruder.deg = payload.extruder.deg ?? r[2];
payload.extruder.degTarget = payload.extruder.degTarget ?? r[3];
}
continue;
}
}

if (key === 'T0') { // T0:27.58 /0.00
payload.extruder.deg = r[2];
payload.extruder.degTarget = r[3];
if (key === 'T') { // T:293.0 /0.0
payload.extruder.deg = payload.extruder.deg ?? r[2];
payload.extruder.degTarget = payload.extruder.degTarget ?? r[3];
continue;
}

Expand All @@ -55,14 +83,24 @@ class MarlinLineParserResultTemperature {
continue;
}

{ // Hotend power (@0:0)
const found = ensureString(key).match(/^@(\d+)$/);
if (found) {
const hotendIndex = parseInt(found[1], 10);
const hotendKey = `T${hotendIndex}`;
payload.hotend[hotendKey] = {
...payload.hotend[hotendKey],
power: r[5],
};
continue;
}
}

// M109, M190: Print temp & remaining time every 1s while waiting
if (key === 'W') { // W:?, W:9, ..., W:0
payload.wait = r[7];
continue;
}

// Hotends: T0, T1, ...
// TODO
}

return {
Expand Down
14 changes: 10 additions & 4 deletions src/server/controllers/Marlin/MarlinRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class MarlinRunner extends events.EventEmitter {
ovS: 100,
extruder: {}, // { deg, degTarget, power }
heatedBed: {}, // { deg, degTarget, power }
hotend: {}, // { T0: { deg, degTarget, power }, T1: { deg, degTarget, power }, ... }
rapidFeedrate: 0, // Related to G0
feedrate: 0, // Related to G1, G2, G3, G38.2, G38.3, G38.4, G38.5, G80
spindle: 0 // Related to M3, M4, M5
Expand Down Expand Up @@ -112,16 +113,21 @@ class MarlinRunner extends events.EventEmitter {
...this.state,
extruder: {
...this.state.extruder,
...payload.extruder
...payload.extruder,
},
heatedBed: {
...this.state.heatedBed,
...payload.heatedBed
}
...payload.heatedBed,
},
hotend: {
...this.state.hotend,
...payload.hotend,
},
};

if (!_.isEqual(this.state.extruder, nextState.extruder) ||
!_.isEqual(this.state.heatedBed, nextState.heatedBed)) {
!_.isEqual(this.state.heatedBed, nextState.heatedBed) ||
!_.isEqual(this.state.hotend, nextState.hotend)) {
this.state = nextState; // enforce change
}

Expand Down
Loading

0 comments on commit 9caaa56

Please sign in to comment.