diff --git a/CYD-Klipper/src/conf/global_config.h b/CYD-Klipper/src/conf/global_config.h index 55a85c9..96d426e 100644 --- a/CYD-Klipper/src/conf/global_config.h +++ b/CYD-Klipper/src/conf/global_config.h @@ -5,6 +5,12 @@ #define CONFIG_VERSION 4 +enum { + REMAINING_TIME_CALC_PERCENTAGE = 0, + REMAINING_TIME_CALC_INTERPOLATED = 1, + REMAINING_TIME_CALC_SLICER = 2, +}; + typedef struct _GLOBAL_CONFIG { unsigned char version; union { @@ -21,6 +27,7 @@ typedef struct _GLOBAL_CONFIG { bool rotateScreen : 1; bool onDuringPrint : 1; bool autoOtaUpdate : 1; + unsigned char remaining_time_calc_mode : 2; }; }; float screenCalXOffset; diff --git a/CYD-Klipper/src/core/data_setup.cpp b/CYD-Klipper/src/core/data_setup.cpp index ab4beb2..c0c30e7 100644 --- a/CYD-Klipper/src/core/data_setup.cpp +++ b/CYD-Klipper/src/core/data_setup.cpp @@ -49,6 +49,8 @@ void send_gcode(bool wait, const char *gcode) sprintf(buff, "http://%s:%d/printer/gcode/script?script=%s", global_config.klipperHost, global_config.klipperPort, urlEncode(gcode).c_str()); HTTPClient client; client.begin(buff); + int httpCode = client.GET(); + if (!wait) { @@ -65,6 +67,30 @@ void send_gcode(bool wait, const char *gcode) } } +int get_slicer_time_estimate_s() +{ + if (printer.state == PRINTER_STATE_IDLE) + return 0; + + delay(10); + + char buff[256] = {}; + sprintf(buff, "http://%s:%d/server/files/metadata?filename=%s", global_config.klipperHost, global_config.klipperPort, urlEncode(printer.print_filename).c_str()); + HTTPClient client; + client.useHTTP10(true); + client.begin(buff); + int httpCode = client.GET(); + + if (httpCode != 200) + return 0; + + JsonDocument doc; + deserializeJson(doc, client.getStream()); + int time_estimate_s = doc["result"]["estimated_time"]; + Serial.printf("Got slicer time estimate: %ds\n", time_estimate_s); + return time_estimate_s; +} + void move_printer(const char* axis, float amount, bool relative) { if (!printer.homed_axis || printer.state == PRINTER_STATE_PRINTING) return; @@ -222,7 +248,36 @@ void fetch_printer_data() if (printer.state == PRINTER_STATE_PRINTING && printer.print_progress > 0) { - printer.remaining_time_s = (printer.elapsed_time_s / printer.print_progress) - printer.elapsed_time_s; + float remaining_time_s_percentage = (printer.elapsed_time_s / printer.print_progress) - printer.elapsed_time_s; + float remaining_time_s_slicer = 0; + + if (printer.slicer_estimated_print_time_s > 0) + { + remaining_time_s_slicer = printer.slicer_estimated_print_time_s - printer.elapsed_time_s; + } + + if (remaining_time_s_slicer <= 0 || global_config.remaining_time_calc_mode == REMAINING_TIME_CALC_PERCENTAGE) + { + printer.remaining_time_s = remaining_time_s_percentage; + } + else if (global_config.remaining_time_calc_mode == REMAINING_TIME_CALC_INTERPOLATED) + { + printer.remaining_time_s = remaining_time_s_percentage * printer.print_progress + remaining_time_s_slicer * (1 - printer.print_progress); + } + else if (global_config.remaining_time_calc_mode == REMAINING_TIME_CALC_SLICER) + { + printer.remaining_time_s = remaining_time_s_slicer; + } + } + + if (printer.remaining_time_s < 0) + { + printer.remaining_time_s = 0; + } + + if (printer.state == PRINTER_STATE_IDLE) + { + printer.slicer_estimated_print_time_s = 0; } lv_msg_send(DATA_PRINTER_DATA, &printer); @@ -230,6 +285,10 @@ void fetch_printer_data() if (printer.state != printer_state || emit_state_update) { + if (printer_state == PRINTER_STATE_PRINTING){ + printer.slicer_estimated_print_time_s = get_slicer_time_estimate_s(); + } + printer.state = printer_state; lv_msg_send(DATA_PRINTER_STATE, &printer); } diff --git a/CYD-Klipper/src/core/data_setup.h b/CYD-Klipper/src/core/data_setup.h index 9197b6e..d1a4224 100644 --- a/CYD-Klipper/src/core/data_setup.h +++ b/CYD-Klipper/src/core/data_setup.h @@ -23,8 +23,8 @@ typedef struct _Printer { float elapsed_time_s; float remaining_time_s; float filament_used_mm; - char* print_filename; // 0 -> 1 - float print_progress; + char* print_filename; + float print_progress; // 0 -> 1 float fan_speed; // 0 -> 1 float gcode_offset[3]; float speed_mult; @@ -34,6 +34,7 @@ typedef struct _Printer { float pressure_advance; float smooth_time; int feedrate_mm_per_s; + int slicer_estimated_print_time_s; } Printer; extern Printer printer; diff --git a/CYD-Klipper/src/ui/panels/settings_panel.cpp b/CYD-Klipper/src/ui/panels/settings_panel.cpp index 291813d..c251ebc 100644 --- a/CYD-Klipper/src/ui/panels/settings_panel.cpp +++ b/CYD-Klipper/src/ui/panels/settings_panel.cpp @@ -99,6 +99,14 @@ static void auto_ota_update_switch(lv_event_t* e){ WriteGlobalConfig(); } +const char* estimated_time_options = "Percentage\nInterpolated\nSlicer"; + +static void estimated_time_dropdown(lv_event_t * e){ + lv_obj_t * dropdown = lv_event_get_target(e); + global_config.remaining_time_calc_mode = lv_dropdown_get_selected(dropdown); + WriteGlobalConfig(); +} + const static lv_point_t line_points[] = { {0, 0}, {(short int)((CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2) * 0.85f), 0} }; void create_settings_widget(const char* label_text, lv_obj_t* object, lv_obj_t* root_panel, bool set_height = true){ @@ -256,4 +264,11 @@ void settings_panel_init(lv_obj_t* panel){ lv_obj_add_state(toggle, LV_STATE_CHECKED); create_settings_widget("Auto Update", toggle, panel); + + dropdown = lv_dropdown_create(panel); + lv_dropdown_set_options(dropdown, estimated_time_options); + lv_obj_add_event_cb(dropdown, estimated_time_dropdown, LV_EVENT_VALUE_CHANGED, NULL); + + lv_dropdown_set_selected(dropdown, global_config.remaining_time_calc_mode); + create_settings_widget("Estimated Time", dropdown, panel); } \ No newline at end of file