From 161c10a43b5e54885a7263f518ed505e2f3e873a Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 22 Dec 2024 00:14:49 +0100 Subject: [PATCH] Start print in bambu integration --- .../core/bambu/bambu_printer_integration.cpp | 6 +- .../core/bambu/bambu_printer_integration.hpp | 22 ++-- .../src/core/bambu/bambu_printer_panels.cpp | 115 ++++++++++++++++++ .../src/core/bambu/bambu_printer_parsers.cpp | 9 ++ CYD-Klipper/src/core/printer_integration.hpp | 1 + CYD-Klipper/src/ui/panels/files_panel.cpp | 19 ++- CYD-Klipper/src/ui/ui_utils.cpp | 4 +- 7 files changed, 156 insertions(+), 20 deletions(-) diff --git a/CYD-Klipper/src/core/bambu/bambu_printer_integration.cpp b/CYD-Klipper/src/core/bambu/bambu_printer_integration.cpp index 95ec995..a7571f6 100644 --- a/CYD-Klipper/src/core/bambu/bambu_printer_integration.cpp +++ b/CYD-Klipper/src/core/bambu/bambu_printer_integration.cpp @@ -42,6 +42,7 @@ bool BambuPrinter::publish_mqtt_command(const char* command) char auth[48] = {0}; sprintf(auth, "device/%s/request", printer_config->printer_auth); + LOG_F(("Publishing MQTT Command: %s", command)); return client.publish(auth, command); } @@ -298,11 +299,6 @@ Files BambuPrinter::get_files() return files; } -bool BambuPrinter::start_file(const char* filename) -{ - return false; -} - Thumbnail BambuPrinter::get_32_32_png_image_thumbnail(const char* gcode_filename) { Thumbnail thumbnail = {0}; diff --git a/CYD-Klipper/src/core/bambu/bambu_printer_integration.hpp b/CYD-Klipper/src/core/bambu/bambu_printer_integration.hpp index 5c266b2..c4643a9 100644 --- a/CYD-Klipper/src/core/bambu/bambu_printer_integration.hpp +++ b/CYD-Klipper/src/core/bambu/bambu_printer_integration.hpp @@ -19,16 +19,6 @@ class BambuPrinter : public BasePrinter unsigned int ignore_error = 0; unsigned long print_start; - union { - struct { - bool chamber_light_available : 1; - bool chamber_light_on : 1; - bool work_light_available : 1; - bool work_light_on : 1; - }; - unsigned char bambu_misc; - }; - protected: void parse_state(JsonDocument& in); void init_ui_panels(); @@ -39,6 +29,17 @@ class BambuPrinter : public BasePrinter float chamber_fan_speed; BambuSpeedProfile speed_profile = BambuSpeedProfileNormal; + union { + struct { + bool chamber_light_available : 1; + bool chamber_light_on : 1; + bool work_light_available : 1; + bool work_light_on : 1; + bool has_ams : 1; + }; + unsigned char bambu_misc; + }; + BambuPrinter(int index) : BasePrinter(index) { supported_features = PrinterFeatureHome @@ -63,6 +64,7 @@ class BambuPrinter : public BasePrinter print_start = millis(); init_ui_panels(); + no_confirm_print_file = true; } bool move_printer(const char* axis, float amount, bool relative); diff --git a/CYD-Klipper/src/core/bambu/bambu_printer_panels.cpp b/CYD-Klipper/src/core/bambu/bambu_printer_panels.cpp index 6362f3f..f6494be 100644 --- a/CYD-Klipper/src/core/bambu/bambu_printer_panels.cpp +++ b/CYD-Klipper/src/core/bambu/bambu_printer_panels.cpp @@ -7,6 +7,7 @@ const char* speed_profiles[] = { "Silent (50%)", "Normal (100%)", "Sport (124%)", "Ludicrous (166%)" }; const BambuSpeedProfile speed_profile_values[] = { BambuSpeedProfileSilent, BambuSpeedProfileNormal, BambuSpeedProfileSport, BambuSpeedProfileLudicrous }; const char* COMMAND_SET_PRINT_SPEED = "{\"print\":{\"command\":\"print_speed\",\"param\":\"%d\"}}"; +const char* COMMAND_START_PRINT_3MF = "{\"print\":{\"command\":\"project_file\",\"param\":\"Metadata/plate_1.gcode\",\"project_id\":\"0\",\"profile_id\":\"0\",\"task_id\":\"0\",\"subtask_id\":\"0\",\"subtask_name\":\"CYD-Klipper Print Job\",\"url\":\"file:///sdcard/%s\",\"timelapse\":%s,\"bed_type\":\"auto\",\"bed_leveling\":%s,\"flow_cali\":%s,\"vibration_cali\":%s,\"layer_inspect\":%s,\"ams_mapping\":[],\"use_ams\":%s}}"; enum FanIndex { @@ -139,4 +140,118 @@ void BambuPrinter::init_ui_panels() { custom_menus_count = 4; custom_menus = bambu_ui_panels; +} + +struct +{ + const char* bambu_current_file; + + union + { + struct + { + bool bambu_option_use_ams : 1; + bool bambu_option_timelapse : 1; + bool bambu_option_bed_leveling : 1; + bool bambu_option_flow_calibration : 1; + bool bambu_option_vibration_compensation : 1; + bool bambu_option_layer_inspect : 1; + }; + unsigned char bambu_options_raw; + }; +} __internal_bambu_file_state = {}; + +#define SET_BOOL_STATE(bool_name, func_name) static void func_name (lv_event_t * e) { auto state = lv_obj_get_state(lv_event_get_target(e)); bool_name = (state & LV_STATE_CHECKED == LV_STATE_CHECKED); } + +SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_use_ams, set_bambu_option_use_ams) +SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_timelapse, set_bambu_option_timelapse) +SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_bed_leveling, set_bambu_option_bed_leveling) +SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_flow_calibration, set_bambu_option_flow_calibration) +SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_vibration_compensation, set_bambu_option_vibration_compensation) +SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_layer_inspect, set_bambu_option_layer_inspect) + +#define BOOLEAN_TO_STRING(b) b ? "true" : "false" + +static void print_file_start(lv_event_t * e) +{ + BambuPrinter* printer = (BambuPrinter*)get_current_printer(); + char buff[713]; + + if (snprintf(buff, 713, COMMAND_START_PRINT_3MF, + __internal_bambu_file_state.bambu_current_file, + BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_timelapse), + BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_bed_leveling), + BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_flow_calibration), + BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_vibration_compensation), + BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_layer_inspect), + BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_use_ams)) >= 712) + { + LOG_LN("Failed to prepare message to start print"); + return; + } + + printer->publish_mqtt_command(buff); +} + +bool BambuPrinter::start_file(const char* filename){ + if (get_current_printer_data()->state != PrinterState::PrinterStateIdle) + { + return false; + } + + __internal_bambu_file_state.bambu_current_file = filename; + + lv_obj_t * panel = lv_obj_create(lv_scr_act()); + lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX * 2, 0); + lv_layout_flex_column(panel); + lv_obj_set_size(panel, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 3, CYD_SCREEN_HEIGHT_PX - CYD_SCREEN_GAP_PX * 2); + lv_obj_align(panel, LV_ALIGN_CENTER, 0, 0); + + lv_obj_t * label_print_file = lv_label_create(panel); + lv_obj_set_width(label_print_file, LV_PCT(100)); + lv_label_set_long_mode(label_print_file, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_label_set_text_fmt(label_print_file, "Settings for %s", __internal_bambu_file_state.bambu_current_file); + + __internal_bambu_file_state.bambu_option_use_ams = ((BambuPrinter*)get_current_printer())->has_ams; + __internal_bambu_file_state.bambu_option_timelapse = false; + __internal_bambu_file_state.bambu_option_bed_leveling = true; + __internal_bambu_file_state.bambu_option_flow_calibration = true; + __internal_bambu_file_state.bambu_option_vibration_compensation = true; + __internal_bambu_file_state.bambu_option_layer_inspect = true; + + if (__internal_bambu_file_state.bambu_option_use_ams) + { + lv_create_custom_menu_switch("Use AMS", panel, set_bambu_option_use_ams, __internal_bambu_file_state.bambu_option_use_ams); + } + + lv_create_custom_menu_switch("Timelapse", panel, set_bambu_option_timelapse, __internal_bambu_file_state.bambu_option_timelapse); + lv_create_custom_menu_switch("Bed Leveling", panel, set_bambu_option_bed_leveling, __internal_bambu_file_state.bambu_option_bed_leveling); + lv_create_custom_menu_switch("Flow Calibration", panel, set_bambu_option_flow_calibration, __internal_bambu_file_state.bambu_option_flow_calibration); + lv_create_custom_menu_switch("Vibration Compensation", panel, set_bambu_option_vibration_compensation, __internal_bambu_file_state.bambu_option_vibration_compensation); + lv_create_custom_menu_switch("Inspect First Layer", panel, set_bambu_option_layer_inspect, __internal_bambu_file_state.bambu_option_layer_inspect); + + lv_obj_t* buttons_panel = lv_create_empty_panel(panel); + lv_layout_flex_row(buttons_panel); + lv_obj_set_size(buttons_panel, LV_PCT(100), CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + + lv_obj_t* btn = lv_btn_create(buttons_panel); + lv_obj_set_flex_grow(btn, 1); + lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel); + + lv_obj_t* label = lv_label_create(btn); + lv_label_set_text(label, LV_SYMBOL_CLOSE " Cancel"); + lv_obj_center(label); + + btn = lv_btn_create(buttons_panel); + lv_obj_set_flex_grow(btn, 1); + lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_obj_add_event_cb(btn, print_file_start, LV_EVENT_CLICKED, panel); + lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel); + + label = lv_label_create(btn); + lv_label_set_text(label, LV_SYMBOL_OK " Print"); + lv_obj_center(label); + + return true; } \ No newline at end of file diff --git a/CYD-Klipper/src/core/bambu/bambu_printer_parsers.cpp b/CYD-Klipper/src/core/bambu/bambu_printer_parsers.cpp index d2c2b8e..b1a0e44 100644 --- a/CYD-Klipper/src/core/bambu/bambu_printer_parsers.cpp +++ b/CYD-Klipper/src/core/bambu/bambu_printer_parsers.cpp @@ -228,6 +228,15 @@ void BambuPrinter::parse_state(JsonDocument& in) chamber_fan_speed = convert_fan_speed(print["big_fan2_speed"]); } + if (print.containsKey("ams_exist_bits")) + { + const char* ams_exists = print["ams_exist_bits"]; + if (!strcmp(ams_exists, "0")) + { + has_ams = true; + } + } + printer_data.extrude_mult = 1; } diff --git a/CYD-Klipper/src/core/printer_integration.hpp b/CYD-Klipper/src/core/printer_integration.hpp index acab184..220aa5f 100644 --- a/CYD-Klipper/src/core/printer_integration.hpp +++ b/CYD-Klipper/src/core/printer_integration.hpp @@ -150,6 +150,7 @@ class BasePrinter public: short popup_message_timeout_s = 10; + bool no_confirm_print_file = false; PrinterConfiguration* printer_config{}; PrinterFeatures supported_features{}; diff --git a/CYD-Klipper/src/ui/panels/files_panel.cpp b/CYD-Klipper/src/ui/panels/files_panel.cpp index 87ec141..d4c74be 100644 --- a/CYD-Klipper/src/ui/panels/files_panel.cpp +++ b/CYD-Klipper/src/ui/panels/files_panel.cpp @@ -11,14 +11,23 @@ const char* selected_file = NULL; -static void btn_print_file(lv_event_t * e){ +static void btn_print_file(lv_event_t * e) +{ lv_obj_t * panel = (lv_obj_t*)lv_event_get_user_data(e); lv_obj_del(panel); current_printer_start_file(selected_file); } -static void btn_print_file_verify(lv_event_t * e){ +static void btn_print_file_verify_instant(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_target(e); + selected_file = (char*)lv_event_get_user_data(e); + current_printer_start_file(selected_file); +} + +static void btn_print_file_verify(lv_event_t * e) +{ if (get_current_printer_data()->state != PrinterState::PrinterStateIdle){ return; } @@ -111,10 +120,12 @@ void files_panel_init(lv_obj_t* panel){ lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_FILE, files.available_files[i]); lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0); - if (global_config.full_filenames){ + if (global_config.full_filenames) + { lv_label_set_long_mode(lv_obj_get_child(btn, 1), LV_LABEL_LONG_WRAP); } - lv_obj_add_event_cb(btn, btn_print_file_verify, LV_EVENT_CLICKED, (void*)(files.available_files[i])); + + lv_obj_add_event_cb(btn, (get_current_printer()->no_confirm_print_file) ? btn_print_file_verify_instant : btn_print_file_verify, LV_EVENT_CLICKED, (void*)(files.available_files[i])); lv_obj_on_destroy_free_data(btn, files.available_files[i]); } diff --git a/CYD-Klipper/src/ui/ui_utils.cpp b/CYD-Klipper/src/ui/ui_utils.cpp index 7faa561..31afb73 100644 --- a/CYD-Klipper/src/ui/ui_utils.cpp +++ b/CYD-Klipper/src/ui/ui_utils.cpp @@ -181,8 +181,10 @@ void lv_create_custom_menu_entry(const char* label_text, lv_obj_t* object, lv_ob lv_obj_set_parent(object, panel); - if (set_height) + if (set_height) + { lv_obj_set_height(object, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + } if (comment != NULL) {