Add gcode position tracking and virtual SD card status handling in PrinterClient
All checks were successful
farmcontrol/farmcontrol-server/pipeline/head This commit looks good

- 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.
This commit is contained in:
Tom Butcher 2026-11-08 18:08:20 +00:00
parent 2522e2f9ce
commit bf9ce2da9b

View File

@ -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,