Klipper
parent
2f19bcbc1d
commit
e0e3c39de9
|
|
@ -167,23 +167,53 @@ WiFiClient KlipperClient::getPostRequest(String apiPostData, String apiPostBody)
|
||||||
|
|
||||||
|
|
||||||
void KlipperClient::getPrinterJobResults() {
|
void KlipperClient::getPrinterJobResults() {
|
||||||
|
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 *jsonDoc;
|
||||||
if (!validate()) {
|
if (!validate()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
// Req 1
|
||||||
DynamicJsonDocument *jsonDoc = this->jsonRequestClient->requestJson(
|
this->debugController->printLn("Get Klipper Data: " + this->getInstanceServerTarget() + ":" + String(this->getInstanceServerPort()));
|
||||||
|
jsonDoc = this->jsonRequestClient->requestJson(
|
||||||
PRINTER_REQUEST_GET,
|
PRINTER_REQUEST_GET,
|
||||||
this->getInstanceServerTarget(),
|
this->getInstanceServerTarget(),
|
||||||
this->getInstanceServerPort(),
|
this->getInstanceServerPort(),
|
||||||
this->encodedAuth,
|
this->encodedAuth,
|
||||||
"/printer/objects/query?heater_bed&extruder&webhooks&virtual_sdcard&print_stats&toolhead&display_status",
|
"/printer/objects/query?print_stats",
|
||||||
|
"",
|
||||||
|
bufferSize,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
printerData.state = (const char*)(*jsonDoc)["result"]["status"]["print_stats"]["state"];
|
||||||
|
printerData.filamentLength = (const char*)(*jsonDoc)["result"]["status"]["job"]["print_stats"]["filament_used"];
|
||||||
|
printerData.progressPrintTime = (const char*)(*jsonDoc)["result"]["status"]["print_stats"]["print_duration"];
|
||||||
|
printerData.fileName = (const char*)(*jsonDoc)["result"]["status"]["print_stats"]["filename"];
|
||||||
|
|
||||||
|
if (printerData.state == "printing") {
|
||||||
|
printerData.isPrinting = true;
|
||||||
|
} else {
|
||||||
|
printerData.isPrinting = false;
|
||||||
|
}
|
||||||
|
printerData.state = "I";
|
||||||
|
if (BasePrinterClientImpl::isOperational()) {
|
||||||
|
this->debugController->printLn("Status: " + printerData.state);
|
||||||
|
} else {
|
||||||
|
this->debugController->printLn("Printer Not Operational");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Req 2
|
||||||
|
jsonDoc = this->jsonRequestClient->requestJson(
|
||||||
|
PRINTER_REQUEST_GET,
|
||||||
|
this->getInstanceServerTarget(),
|
||||||
|
this->getInstanceServerPort(),
|
||||||
|
this->encodedAuth,
|
||||||
|
"/printer/objects/query?heater_bed&extruder&display_status",
|
||||||
"",
|
"",
|
||||||
bufferSize,
|
bufferSize,
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
if (this->jsonRequestClient->getLastError() != "") {
|
if (this->jsonRequestClient->getLastError() != "") {
|
||||||
this->debugController->printLn("Get Klipper Data: " + this->getInstanceServerTarget() + ":" + String(this->getInstanceServerPort()));
|
|
||||||
this->debugController->printLn(this->jsonRequestClient->getLastError());
|
this->debugController->printLn(this->jsonRequestClient->getLastError());
|
||||||
printerData.error = this->jsonRequestClient->getLastError();
|
printerData.error = this->jsonRequestClient->getLastError();
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
|
|
@ -194,49 +224,62 @@ void KlipperClient::getPrinterJobResults() {
|
||||||
printerData.bedTargetTemp = "";
|
printerData.bedTargetTemp = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
printerData.progressCompletion = (int)(*jsonDoc)["result"]["status"]["display_status"]["progress"];
|
||||||
String targetServer = this->globalDataController->getPrinterServer();
|
printerData.toolTemp = (int)(*jsonDoc)["result"]["status"]["extruder"]["temperature"];
|
||||||
if (this->globalDataController->getPrinterServer() == "") {
|
printerData.toolTargetTemp = (int)(*jsonDoc)["result"]["status"]["extruder"]["target"];
|
||||||
targetServer = this->globalDataController->getPrinterHostName();
|
printerData.bedTemp = (int)(*jsonDoc)["result"]["status"]["heater_bed"]["temperature"];
|
||||||
}
|
printerData.bedTargetTemp = (int)(*jsonDoc)["result"]["status"]["heater_bed"]["target"];
|
||||||
|
|
||||||
// get the Printer Job status
|
// Req 3
|
||||||
String apiGetData = "GET /printer/objects/query?heater_bed&extruder&webhooks&virtual_sdcard&print_stats&toolhead&display_status";
|
jsonDoc = this->jsonRequestClient->requestJson(
|
||||||
WiFiClient printClient = getSubmitRequest(apiGetData);
|
PRINTER_REQUEST_GET,
|
||||||
if (printerData.error != "") {
|
this->getInstanceServerTarget(),
|
||||||
return;
|
this->getInstanceServerPort(),
|
||||||
}
|
this->encodedAuth,
|
||||||
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;
|
"/printer/objects/query?toolhead&virtual_sdcard",
|
||||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
"",
|
||||||
|
bufferSize,
|
||||||
// Parse JSON object
|
true
|
||||||
DeserializationError error = deserializeJson(jsonBuffer, printClient);
|
);
|
||||||
if (error) {
|
if (this->jsonRequestClient->getLastError() != "") {
|
||||||
this->debugController->printLn("Klipper Data Parsing failed: " + targetServer + ":" + String(this->globalDataController->getPrinterPort()));
|
this->debugController->printLn(this->jsonRequestClient->getLastError());
|
||||||
printerData.error = "Klipper Data Parsing failed: " + targetServer + ":" + String(this->globalDataController->getPrinterPort());
|
printerData.error = this->jsonRequestClient->getLastError();
|
||||||
printerData.state = "";
|
printerData.state = "";
|
||||||
printerData.isPrinting = false;
|
printerData.isPrinting = false;
|
||||||
printerData.toolTemp = "";
|
printerData.toolTemp = "";
|
||||||
printerData.toolTargetTemp = "";
|
printerData.toolTargetTemp = "";
|
||||||
printerData.bedTemp = "";
|
printerData.bedTemp = "";
|
||||||
printerData.bedTargetTemp = (const char*)jsonBuffer["result"]["status"]["heater_bed"]["target"];
|
printerData.bedTargetTemp = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float fileProgress = (float)(*jsonDoc)["result"]["status"]["virtual_sdcard"]["progress"];
|
||||||
|
printerData.progressFilepos = (const char*)(*jsonDoc)["result"]["status"]["virtual_sdcard"]["file_position"];
|
||||||
|
printerData.estimatedPrintTime = (float)(*jsonDoc)["result"]["status"]["toolhead"]["estimated_print_time"];
|
||||||
|
|
||||||
|
/*
|
||||||
|
printerData.progressPrintTimeLeft : No metadata is available, print duration and progress can be used to calculate the ETA:
|
||||||
|
*/
|
||||||
|
float totalPrintTime = printerData.progressPrintTime.toFloat() / fileProgress;
|
||||||
|
printerData.progressPrintTimeLeft = String(totalPrintTime - printerData.progressPrintTime.toFloat());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// // &webhooks&virtual_sdcard&print_stats
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
printerData.averagePrintTime = (int)jsonBuffer["result"]["status"]["toolhead"]["averagePrintTime"];
|
printerData.averagePrintTime = (int)jsonBuffer["result"]["status"]["toolhead"]["averagePrintTime"];
|
||||||
printerData.estimatedPrintTime = (float)jsonBuffer["result"]["status"]["toolhead"]["estimated_print_time"];
|
|
||||||
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 = (int)jsonBuffer["result"]["status"]["display_status"]["progress"];
|
;
|
||||||
printerData.progressFilepos = (const char*)jsonBuffer["result"]["status"]["virtual_sdcard"]["file_position"];
|
|
||||||
printerData.progressPrintTime = (const char*)jsonBuffer["result"]["status"]["print_stats"]["print_duration"];
|
|
||||||
printerData.progressPrintTimeLeft = (const char*)jsonBuffer["progress"]["printTimeLeft"];
|
*/
|
||||||
printerData.filamentLength = (const char*)jsonBuffer["result"]["status"]["job"]["print_stats"]["filament_used"];
|
|
||||||
printerData.state = (const char*)jsonBuffer["result"]["status"]["print_stats"]["state"];*/
|
|
||||||
/**
|
/**
|
||||||
printerData.progressPrintTimeLeft :
|
printerData.progressPrintTimeLeft :
|
||||||
If no metadata is available, print duration and progress can be used to calculate the ETA:
|
If no metadata is available, print duration and progress can be used to calculate the ETA:
|
||||||
|
|
@ -248,11 +291,7 @@ let total_time = pstats.print_duration / vsd.progress;
|
||||||
let eta = total_time - pstats.print_duration; */
|
let eta = total_time - pstats.print_duration; */
|
||||||
|
|
||||||
|
|
||||||
/*if (BasePrinterClientImpl::isOperational()) {
|
/*
|
||||||
this->debugController->printLn("Status: " + printerData.state);
|
|
||||||
} else {
|
|
||||||
this->debugController->printLn("Printer Not Operational");
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the fileseize
|
// get the fileseize
|
||||||
apiGetData = "GET /server/files/metadata?filename=" + printerData.fileName;
|
apiGetData = "GET /server/files/metadata?filename=" + printerData.fileName;
|
||||||
|
|
@ -275,20 +314,15 @@ let eta = total_time - pstats.print_duration; */
|
||||||
}
|
}
|
||||||
|
|
||||||
String printing = (const char*)jsonBuffer["result"]["status"]["print_stats"]["state"];
|
String printing = (const char*)jsonBuffer["result"]["status"]["print_stats"]["state"];
|
||||||
if (printing == "printing") {
|
|
||||||
printerData.isPrinting = true;
|
|
||||||
} else {
|
|
||||||
printerData.isPrinting = false;
|
|
||||||
}
|
|
||||||
printerData.toolTemp = (int)jsonBuffer["result"]["status"]["extruder"]["temperature"];
|
|
||||||
printerData.toolTargetTemp = (int)jsonBuffer["result"]["status"]["extruder"]["target"];
|
|
||||||
printerData.bedTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["temperature"];
|
|
||||||
printerData.bedTargetTemp = (int)jsonBuffer["result"]["status"]["heater_bed"]["target"];
|
|
||||||
printerData.fileSize = (long)jsonBuffer2["result"]["size"];
|
printerData.fileSize = (long)jsonBuffer2["result"]["size"];
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
if (BasePrinterClientImpl::isOperational()) {
|
if (BasePrinterClientImpl::isOperational()) {
|
||||||
this->debugController->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");
|
this->debugController->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)");
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KlipperClient::getPrinterPsuState() {
|
void KlipperClient::getPrinterPsuState() {
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,15 @@ WiFiClient JsonRequestClient::requestWifiClient(
|
||||||
|
|
||||||
while(requestClient.connected() && !requestClient.available()) delay(1);
|
while(requestClient.connected() && !requestClient.available()) delay(1);
|
||||||
|
|
||||||
|
// Did we have header data in response?
|
||||||
|
char statusPeek[32] = {0};
|
||||||
|
requestClient.peekBytes(statusPeek, sizeof(statusPeek));
|
||||||
|
if (String(statusPeek).indexOf("HTTP/") < 0) {
|
||||||
|
this->debugController->print("No HTTP Header: ");
|
||||||
|
this->debugController->printLn(statusPeek);
|
||||||
|
return requestClient;
|
||||||
|
}
|
||||||
|
|
||||||
// Check HTTP status
|
// Check HTTP status
|
||||||
char status[32] = {0};
|
char status[32] = {0};
|
||||||
requestClient.readBytesUntil('\r', status, sizeof(status));
|
requestClient.readBytesUntil('\r', status, sizeof(status));
|
||||||
|
|
@ -101,10 +110,11 @@ DynamicJsonDocument *JsonRequestClient::requestJson(
|
||||||
DynamicJsonDocument *returnJson = this->createNewJsonDocument(bufferSize);
|
DynamicJsonDocument *returnJson = this->createNewJsonDocument(bufferSize);
|
||||||
DeserializationError error = deserializeJson(*returnJson, reqClient);
|
DeserializationError error = deserializeJson(*returnJson, reqClient);
|
||||||
if (error) {
|
if (error) {
|
||||||
this->debugController->printLn("Data Parsing failed: " + server + ":" + String(port));
|
this->debugController->printLn("Data Parsing failed: " + server + ":" + String(port) + "[" + error.c_str() + "]");
|
||||||
this->lastError = "Klipper Data Parsing failed: " + server + ":" + String(port);
|
this->lastError = "Data Parsing failed: " + server + ":" + String(port);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
reqClient.stop();
|
||||||
return returnJson;
|
return returnJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -126,6 +136,7 @@ DynamicJsonDocument *JsonRequestClient::createNewJsonDocument(size_t bufferSize)
|
||||||
|
|
||||||
void JsonRequestClient::freeLastJsonDocument() {
|
void JsonRequestClient::freeLastJsonDocument() {
|
||||||
if (JsonRequestClient::lastJsonDocument != NULL) {
|
if (JsonRequestClient::lastJsonDocument != NULL) {
|
||||||
|
JsonRequestClient::lastJsonDocument->clear();
|
||||||
free(JsonRequestClient::lastJsonDocument);
|
free(JsonRequestClient::lastJsonDocument);
|
||||||
JsonRequestClient::lastJsonDocument = NULL;
|
JsonRequestClient::lastJsonDocument = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue