Modified KlipperClient (JSON parsing)

pull/125/head
Matthias Grimm 2020-12-13 14:11:15 -06:00
parent a0eb1ff4fe
commit 8295f4fe43
1 changed files with 35 additions and 15 deletions

View File

@ -1,3 +1,6 @@
// Moonraker API: https://github.com/Arksine/moonraker/blob/master/docs/web_api.md
// ArduinoJSON Assistant: https://arduinojson.org/v6/assistant/
#include "KlipperClient.h" #include "KlipperClient.h"
KlipperClient::KlipperClient(GlobalDataController *globalDataController, DebugController *debugController) { KlipperClient::KlipperClient(GlobalDataController *globalDataController, DebugController *debugController) {
@ -154,12 +157,12 @@ void KlipperClient::getPrinterJobResults() {
return; return;
} }
//**** get the Printer Job status //**** get the Printer Job status
String apiGetData = "GET /printer/objects/query?heater_bed&extruder&print_stats&toolhead&display_status"; String apiGetData = "GET /printer/objects/query?heater_bed&extruder&webhooks&virtual_sdcard&print_stats&toolhead&display_status";
WiFiClient printClient = getSubmitRequest(apiGetData); WiFiClient printClient = getSubmitRequest(apiGetData);
if (printerData.error != "") { if (printerData.error != "") {
return; return;
} }
const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710; const size_t bufferSize = JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(9) + 426;
DynamicJsonDocument jsonBuffer(bufferSize); DynamicJsonDocument jsonBuffer(bufferSize);
// Parse JSON object // Parse JSON object
@ -168,20 +171,36 @@ void KlipperClient::getPrinterJobResults() {
this->debugController->printLn("Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort)); this->debugController->printLn("Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort));
printerData.error = "Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort); printerData.error = "Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort);
printerData.state = ""; printerData.state = "";
printerData.isPrinting = false;
printerData.toolTemp = "";
printerData.toolTargetTemp = "";
printerData.bedTemp = "";
printerData.bedTargetTemp = (const char*)jsonBuffer["result"]["status"]["heater_bed"]["target"];
return;
return; return;
} }
printerData.averagePrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["averagePrintTime"]; printerData.averagePrintTime = (int)jsonBuffer["result"]["status"]["toolhead"]["averagePrintTime"];
printerData.estimatedPrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["estimatedPrintTime"]; printerData.estimatedPrintTime = (float)jsonBuffer["result"]["status"]["toolhead"]["estimated_print_time"];
printerData.fileName = (const char*)jsonBuffer["result"]["status"]["print_stats"]["filename"]; printerData.fileName = (const char*)jsonBuffer["result"]["status"]["print_stats"]["filename"];
printerData.fileSize = (const char*)jsonBuffer["job"]["file"]["size"]; // printerData.fileSize = (const char*)jsonBuffer["job"]["file"]["size"];
printerData.lastPrintTime = (const char*)jsonBuffer["job"]["lastPrintTime"]; printerData.lastPrintTime = (const char*)jsonBuffer["job"]["lastPrintTime"];
printerData.progressCompletion = (const char*)jsonBuffer["result"]["status"]["display_status"]["progress"]; printerData.progressCompletion = (int)jsonBuffer["result"]["status"]["display_status"]["progress"];
printerData.progressFilepos = (const char*)jsonBuffer["result"]["status"]["virtual_sdcard"]["file_position"]; printerData.progressFilepos = (const char*)jsonBuffer["result"]["status"]["virtual_sdcard"]["file_position"];
printerData.progressPrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["print_duration"]; printerData.progressPrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["print_duration"];
printerData.progressPrintTimeLeft = (const char*)jsonBuffer["progress"]["printTimeLeft"]; printerData.progressPrintTimeLeft = (const char*)jsonBuffer["progress"]["printTimeLeft"];
printerData.filamentLength = (const char*)jsonBuffer["result"]["status"]["job"]["print_stats"]["filament_used"]; printerData.filamentLength = (const char*)jsonBuffer["result"]["status"]["job"]["print_stats"]["filament_used"];
printerData.state = (const char*)jsonBuffer["result"]["status"]["print_stats"]["state"]; printerData.state = (const char*)jsonBuffer["result"]["status"]["print_stats"]["state"];
/**
printerData.progressPrintTimeLeft :
If no metadata is available, print duration and progress can be used to calculate the ETA:
// assume "result" is the response from the status query
let vsd = result.status.virtual_sdcard;
let pstats = result.status.print_stats;
let total_time = pstats.print_duration / vsd.progress;
let eta = total_time - pstats.print_duration; */
if (isOperational()) { if (isOperational()) {
this->debugController->printLn("Status: " + printerData.state); this->debugController->printLn("Status: " + printerData.state);
@ -189,13 +208,13 @@ void KlipperClient::getPrinterJobResults() {
this->debugController->printLn("Printer Not Operational"); this->debugController->printLn("Printer Not Operational");
} }
//**** get the Printer Temps and Stat //**** get the fileseize
apiGetData = "GET /printer/objects/query?heater_bed&extruder&print_stats"; apiGetData = "GET /server/files/metadata?filename=" + printerData.fileName;
printClient = getSubmitRequest(apiGetData); printClient = getSubmitRequest(apiGetData);
if (printerData.error != "") { if (printerData.error != "") {
return; return;
} }
const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300; const size_t bufferSize2 = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(8) + 128;
DynamicJsonDocument jsonBuffer2(bufferSize2); DynamicJsonDocument jsonBuffer2(bufferSize2);
// Parse JSON object // Parse JSON object
@ -205,20 +224,21 @@ void KlipperClient::getPrinterJobResults() {
printerData.toolTemp = ""; printerData.toolTemp = "";
printerData.toolTargetTemp = ""; printerData.toolTargetTemp = "";
printerData.bedTemp = ""; printerData.bedTemp = "";
printerData.bedTargetTemp = (const char*)jsonBuffer2["result"]["status"]["heater_bed"]["target"]; printerData.bedTargetTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["target"];
return; return;
} }
String printing = (const char*)jsonBuffer2["result"]["status"]["print_stats"]["state"]; String printing = (bool)jsonBuffer["result"]["status"]["print_stats"]["state"];
if (printing == "printing") { if (printing == "printing") {
printerData.isPrinting = true; printerData.isPrinting = true;
} else { } else {
printerData.isPrinting = false; printerData.isPrinting = false;
} }
printerData.toolTemp = (const char*)jsonBuffer2["result"]["status"]["extruder"]["temperature"]; printerData.toolTemp = (int)jsonBuffer["result"]["status"]["extruder"]["temperature"];
printerData.toolTargetTemp = (const char*)jsonBuffer2["result"]["status"]["extruder"]["target"]; printerData.toolTargetTemp = (int)jsonBuffer["result"]["status"]["extruder"]["target"];
printerData.bedTemp = (const char*)jsonBuffer2["result"]["status"]["heater_bed"]["temperature"]; printerData.bedTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["temperature"];
printerData.bedTargetTemp = (const char*)jsonBuffer2["result"]["status"]["heater_bed"]["target"]; printerData.bedTargetTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["target"];
printerData.fileSize = (long)jsonBuffer2["result"]["size"];
if (isPrinting()) { if (isPrinting()) {
this->debugController->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); this->debugController->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");