diff --git a/CYD-Klipper/src/core/klipper/klipper_printer_integration.cpp b/CYD-Klipper/src/core/klipper/klipper_printer_integration.cpp index 7279453..ec675a1 100644 --- a/CYD-Klipper/src/core/klipper/klipper_printer_integration.cpp +++ b/CYD-Klipper/src/core/klipper/klipper_printer_integration.cpp @@ -330,7 +330,7 @@ Files KlipperPrinter::get_files() Files files_result = {0}; HTTPClient client; LOG_F(("Heap space pre-file-parse: %d bytes\n", esp_get_free_heap_size())); - std::list files; + std::list files; auto timer_request = millis(); configure_http_client(client, "/server/files/list", true, 5000); diff --git a/CYD-Klipper/src/core/klipper/klipper_printer_integration.hpp b/CYD-Klipper/src/core/klipper/klipper_printer_integration.hpp index 3487029..5aacd39 100644 --- a/CYD-Klipper/src/core/klipper/klipper_printer_integration.hpp +++ b/CYD-Klipper/src/core/klipper/klipper_printer_integration.hpp @@ -8,7 +8,7 @@ typedef struct { char* name; float modified; -} FileSystemFile; +} KlipperFileSystemFile; class KlipperPrinter : public BasePrinter { @@ -32,7 +32,7 @@ class KlipperPrinter : public BasePrinter int parse_macros_count(JsonDocument &in); PowerDevices parse_power_devices(JsonDocument &in); int parse_power_devices_count(JsonDocument &in); - void parse_file_list(JsonDocument &in, std::list &files, int fetch_limit); + void parse_file_list(JsonDocument &in, std::list &files, int fetch_limit); char *parse_thumbnails(JsonDocument &in); public: diff --git a/CYD-Klipper/src/core/klipper/klipper_printer_parsers.cpp b/CYD-Klipper/src/core/klipper/klipper_printer_parsers.cpp index 391cd9f..2c7490e 100644 --- a/CYD-Klipper/src/core/klipper/klipper_printer_parsers.cpp +++ b/CYD-Klipper/src/core/klipper/klipper_printer_parsers.cpp @@ -310,13 +310,13 @@ int KlipperPrinter::parse_power_devices_count(JsonDocument &in) return count; } -void KlipperPrinter::parse_file_list(JsonDocument &in, std::list &files, int fetch_limit) +void KlipperPrinter::parse_file_list(JsonDocument &in, std::list &files, int fetch_limit) { auto result = in["result"].as(); for (auto file : result) { - FileSystemFile f = {0}; + KlipperFileSystemFile f = {0}; const char *path = file["path"]; float modified = file["modified"]; auto file_iter = files.begin(); diff --git a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp index 7a5adc0..b293941 100644 --- a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp +++ b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.cpp @@ -269,6 +269,19 @@ bool OctoPrinter::set_power_device_state(const char* device_name, bool state) Files OctoPrinter::get_files() { + HTTPClient client; + JsonDocument filter; + JsonDocument doc; + configure_http_client(client, "/api/files?recursive=true", true, 5000, printer_config); + + filter["files"][0]["path"] = true; + filter["files"][0]["date"] = true; + + if (client.GET() == 200) + { + auto parseResult = deserializeJson(doc, client.getStream(), DeserializationOption::Filter(filter)); + } + return {}; } diff --git a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp index 43f0183..5f12513 100644 --- a/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp +++ b/CYD-Klipper/src/core/octoprint/octoprint_printer_integration.hpp @@ -1,6 +1,12 @@ #include "../printer_integration.hpp" #include #include +#include + +typedef struct { + char* name; + float modified; +} OctoFileSystemFile; class OctoPrinter : public BasePrinter { @@ -11,6 +17,7 @@ class OctoPrinter : public BasePrinter void parse_printer_state(JsonDocument& in); void parse_job_state(JsonDocument& in); void parse_error(JsonDocument& in); + void OctoPrinter::parse_file_list(JsonDocument &in, std::list &files, int fetch_limit); bool get_request(const char* endpoint, int timeout_ms = 1000, bool stream = true); bool post_request(const char* endpoint, const char* body, int timeout_ms = 1000, bool stream = false); diff --git a/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp b/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp index 1a43415..6cbb511 100644 --- a/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp +++ b/CYD-Klipper/src/core/octoprint/octoprint_printer_parsers.cpp @@ -101,4 +101,52 @@ void OctoPrinter::parse_error(JsonDocument& in) strcpy(printer_data.state_message, error); } } +} + +void OctoPrinter::parse_file_list(JsonDocument &in, std::list &files, int fetch_limit) +{ + auto result = in["files"].as(); + + for (auto file : result) + { + OctoFileSystemFile f = {0}; + const char *path = file["path"]; + float modified = file["date"]; + auto file_iter = files.begin(); + + while (file_iter != files.end()) + { + if ((*file_iter).modified < modified) + break; + + file_iter++; + } + + if (file_iter == files.end() && files.size() >= fetch_limit) + continue; + + f.name = (char *)malloc(strlen(path) + 1); + if (f.name == NULL) + { + LOG_LN("Failed to allocate memory"); + continue; + } + strcpy(f.name, path); + f.modified = modified; + + if (file_iter != files.end()) + files.insert(file_iter, f); + else + files.push_back(f); + + if (files.size() > fetch_limit) + { + auto last_entry = files.back(); + + if (last_entry.name != NULL) + free(last_entry.name); + + files.pop_back(); + } + } } \ No newline at end of file