From bf9ce2da9bd75e27f6f38bd11542841d8be226f2 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 8 Nov 2026 18:08:20 +0000 Subject: [PATCH] Add gcode position tracking and virtual SD card status handling in PrinterClient - Introduced gcodePositionObject to track the printer's G-code position and related status. - Enhanced status handling to include virtual SD card information, such as file position, size, and progress. - Updated event emission to include gcodePosition updates, improving real-time feedback for printer status. - Refactored existing status handling logic to accommodate new data structures and ensure consistency. --- src/printer/printerclient.js | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/printer/printerclient.js b/src/printer/printerclient.js index 0d3b73f..a3bf1e1 100644 --- a/src/printer/printerclient.js +++ b/src/printer/printerclient.js @@ -41,6 +41,7 @@ export class PrinterClient { this.currentSubJob = printer.currentSubJob; this.temperatureObject = {}; this.motionObject = {}; + this.gcodePositionObject = {}; this.miscObject = {}; this.currentFilamentStock = printer.currentFilamentStock; this.currentFilament = null; @@ -59,6 +60,7 @@ export class PrinterClient { gcode_move: null, toolhead: null, motion_report: null, + virtual_sdcard: null, "heater_fan nozzle_cooling_fan": null, fan: null, "output_pin BEEPER_pin": null, @@ -667,6 +669,43 @@ export class PrinterClient { _.merge(this.motionObject, { gcodePosition: status.gcode_move.position, }); + _.merge(this.gcodePositionObject, { + position: status.gcode_move.position, + }); + } + + if (status.virtual_sdcard) { + const virtualSdcard = status.virtual_sdcard; + const gcodePositionPatch = {}; + if (virtualSdcard.file_position !== undefined) { + gcodePositionPatch.filePosition = virtualSdcard.file_position; + } + if (virtualSdcard.file_size !== undefined) { + gcodePositionPatch.fileSize = virtualSdcard.file_size; + } + if (virtualSdcard.progress !== undefined) { + gcodePositionPatch.progress = virtualSdcard.progress; + } + if (virtualSdcard.is_active !== undefined) { + gcodePositionPatch.isActive = virtualSdcard.is_active; + } + if (Object.keys(gcodePositionPatch).length > 0) { + _.merge(this.gcodePositionObject, gcodePositionPatch); + } + } + + if (status.print_stats?.info != null) { + const info = status.print_stats.info; + const layerPatch = {}; + if (info.current_layer !== undefined) { + layerPatch.currentLayer = info.current_layer; + } + if (info.total_layer !== undefined) { + layerPatch.totalLayer = info.total_layer; + } + if (Object.keys(layerPatch).length > 0) { + _.merge(this.gcodePositionObject, layerPatch); + } } if (status.gcode_move?.speed !== undefined) { @@ -897,6 +936,12 @@ export class PrinterClient { eventType: "motion", eventData: this.motionObject, }); + this.socketClient.objectEvent({ + objectType: "printer", + _id: this.id, + eventType: "gcodePosition", + eventData: this.gcodePositionObject, + }); this.socketClient.objectEvent({ objectType: "printer", _id: this.id,