From 6aa74633a8f2d968f7ec4a0674d26957bf621fde Mon Sep 17 00:00:00 2001 From: Sims <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 15 Dec 2024 01:15:58 +0100 Subject: [PATCH] Add min fetcher for octoprint --- .../octoprint_printer_integration.cpp | 50 +++++++++++++++++-- .../octoprint_printer_integration.hpp | 6 ++- .../octoprint/octoprint_printer_parsers.cpp | 29 +++++++---- 3 files changed, 71 insertions(+), 14 deletions(-) diff --git a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp index 5ff3c4f..bff131c 100644 --- a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp +++ b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp @@ -177,7 +177,7 @@ bool OctoPrinter::fetch() request_consecutive_fail_count = 0; JsonDocument doc; deserializeJson(doc, client.getStream()); - parse_printer_state(doc); + parse_printer_status(doc); doc.clear(); configure_http_client(client2, "/api/job", true, 1000, printer_config); @@ -216,12 +216,56 @@ bool OctoPrinter::fetch() PrinterDataMinimal OctoPrinter::fetch_min() { - return {}; + PrinterDataMinimal min = {}; + min.success = true; + min.print_progress = 0; + min.power_devices = 0; + min.state = PrinterState::PrinterStateOffline; + + { + HTTPClient client; + int http_code = 0; + configure_http_client(client, "/api/printer", true, 1000, printer_config); + int http_code = client.GET(); + + if (http_code == 200) + { + JsonDocument doc; + deserializeJson(doc, client.getStream()); + min.state = parse_printer_state(doc); + } + else if (http_code == 409) + { + min.state = PrinterState::PrinterStateError; + return min; + } + else + { + return min; + } + } + + { + HTTPClient client; + configure_http_client(client, "/api/job", true, 1000, printer_config); + + if (client.GET() == 200) + { + JsonDocument doc; + deserializeJson(doc, client.getStream()); + min.print_progress = parse_job_state_progress(doc); + } + else + { + min.state = PrinterState::PrinterStateError; + } + } + + return min; } void OctoPrinter::disconnect() { - } const char* MACRO_AUTOLEVEL = "Auto-Level (G28+G29)"; diff --git a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp index 0c0901c..724ff07 100644 --- a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp +++ b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp @@ -14,10 +14,12 @@ class OctoPrinter : public BasePrinter bool no_printer = false; unsigned char request_consecutive_fail_count{}; - void parse_printer_state(JsonDocument& in); + void parse_printer_status(JsonDocument& in); + PrinterState parse_printer_state(JsonDocument& in); void parse_job_state(JsonDocument& in); + float parse_job_state_progress(JsonDocument& in); void parse_error(JsonDocument& in); - void OctoPrinter::parse_file_list(JsonDocument &in, std::list &files, int fetch_limit); + void parse_file_list(JsonDocument &in, std::list &files, int fetch_limit); bool get_request(const char* endpoint, int timeout_ms = 1000); void init_ui_panels(); diff --git a/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp b/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp index fbc7243..fd0563e 100644 --- a/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp +++ b/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp @@ -2,11 +2,9 @@ #include "octoprint_printer_integration.hpp" #include -void OctoPrinter::parse_printer_state(JsonDocument& in) +PrinterState OctoPrinter::parse_printer_state(JsonDocument& in) { auto flags = in["state"]["flags"]; - auto text = in["state"]["text"]; - bool cancelling = flags["cancelling"]; bool closedOrError = flags["closedOrError"]; bool error = flags["error"]; @@ -21,25 +19,32 @@ void OctoPrinter::parse_printer_state(JsonDocument& in) if (printing || resuming) { - printer_data.state = PrinterState::PrinterStatePrinting; + return PrinterState::PrinterStatePrinting; } else if (pausing || paused) { - printer_data.state = PrinterState::PrinterStatePaused; + return PrinterState::PrinterStatePaused; } else if (cancelling || finishing || ready) { - printer_data.state = PrinterState::PrinterStateIdle; + return PrinterState::PrinterStateIdle; } - else + + return PrinterState::PrinterStateError; +} + +void OctoPrinter::parse_printer_status(JsonDocument& in) +{ + auto text = in["state"]["text"]; + printer_data.state = parse_printer_state(in); + + if (printer_data.state == PrinterState::PrinterStateError) { if (text != NULL && (printer_data.state_message == NULL || strcmp(printer_data.state_message, text))) { printer_data.state_message = (char *)malloc(strlen(text) + 1); strcpy(printer_data.state_message, text); } - - printer_data.state = PrinterState::PrinterStateError; } auto temperature = in["temperature"]; @@ -88,6 +93,12 @@ void OctoPrinter::parse_job_state(JsonDocument& in) printer_data.remaining_time_s = progress["printTimeLeft"]; } +float OctoPrinter::parse_job_state_progress(JsonDocument& in) +{ + float completion = in["progress"]["completion"]; + return completion / 100; +} + void OctoPrinter::parse_error(JsonDocument& in) { const char* error = in["error"];