#include #include #include #include #include "../include/MakerbaseCommand.h" #include "../include/MoonrakerAPI.h" #include "../include/mks_log.h" #include "../include/mks_gcode.h" #include "../include/event.h" #include "../include/ui.h" #include "../include/mks_file.h" extern std::string str_manual_level_offset; extern std::string printer_webhooks_state; extern std::string printer_webhooks_state_message; /* 共振补偿值 */ extern std::string page_syntony_shaper_freq_x; extern std::string page_syntony_shaper_freq_y; extern bool all_level_saving; std::string filament_message; //4.4.2 CLL 修改调平无需手动设置zoffset extern bool step_1; extern bool step_2; extern bool step_3; extern bool step_4; //4.4.2 CLL 新增息屏功能 extern int current_page_id; extern int previous_page_id; extern bool previous_caselight_value; extern std::string printer_idle_timeout_state; // extern std::string mks_babystep_value; // 获取调平补偿值后保存babystep //4.4.3 CLL 修改网页打印信息订阅 nlohmann::json output_metadata; extern bool jump_to_print; extern bool jump_to_memory_warning; extern std::string printer_print_stats_state; extern std::string error_message; extern bool jump_to_resume_print; void parse_gcode_response(nlohmann::json params) { std::cout << params << std::endl; if (params != nlohmann::detail::value_t::null) { std::string params0 = params[0]; //4.4.2 CLL 新增息屏功能 if (current_page_id == TJC_PAGE_SCREEN_SLEEP) { // SCREEN_SLEEP中没有刷新函数,跳转不会出现冲突 page_to(previous_page_id); if (previous_caselight_value == true) { led_on_off(); previous_caselight_value = false; } } // std::cout << params0.substr(0, 23) << std::endl; // bltouch: z_offset: 1.000 if (params0 == "// Klipper state: Ready") { printer_idle_timeout_state = "Ready"; MKSLOG("重启Klipper已准备就绪,发送订阅内容"); printer_webhooks_state = "ready"; printer_webhooks_state_message = "Klipper state: Ready"; // if (all_level_saving == false) { sleep(5); sub_object_status(); sleep(2); get_object_status(); // printer_set_babystep(); // sleep(1); init_mks_status(); // 重启后初始化之前保存的参数 if (all_level_saving == false) { all_level_saving = true; } // printer_webhooks_state_message = "Klipper state: Ready"; MKSLOG_YELLOW("重启之后打印下 %s", printer_webhooks_state.c_str()); } else if (params0 == "// Klipper state: Disconnect") { sub_object_status(); // sleep(2); // get_object_status(); // Klipper state: Disconnect } else if (params0.substr(0, 19) == "// PID parameters: ") { MKSLOG_RED("// PID parameters: "); std::string str{"(\\d+\\.\\d+)"}; // 匹配小数 std::smatch matchResult; std::regex re(str); if (std::regex_match(params0, matchResult, re)) { std::cout << "pid_Kp == " << matchResult[0] << std::endl; std::cout << "pid_Ki == " << matchResult[1] << std::endl; std::cout << "pid_Kd == " << matchResult[2] << std::endl; } // 匹配到的pid转化为字符串尝试一下 std::cout << (std::string)matchResult[0] << std::endl; std::cout << (std::string)matchResult[1] << std::endl; std::cout << (std::string)matchResult[2] << std::endl; std::cout << "成功获得PID的数值" << std::endl; } else if (params0.substr(0, 20) == "// probe: z_offset: ") { MKSLOG_RED("得到z_offset: %s", params0.substr(20).c_str()); float temp; std::stringstream ss; ss << params0.substr(20); ss >> temp; temp = -temp; temp = temp - 0.15; // 按照要求减去0.15mm std::string value = std::to_string(temp); std::string babystep = value.substr(0, value.find(".") + 4); set_mks_babystep(babystep); // 设置babystep到我们的配置文件里面去 } else if (params0.substr(0, 22) == "// bltouch: z_offset: ") { MKSLOG_RED("得到z_offset: %s", params0.substr(22).c_str()); float temp; std::stringstream ss; ss << params0.substr(22); ss >> temp; temp = -temp; std::string value = std::to_string(temp); std::string babystep = value.substr(0, value.find(".") + 4); set_mks_babystep(babystep); // 设置babystep到我们的配置文件里面去 } else if (params0 == "// action:cancel") { //back_to_main(); } else if (params0.substr(0, 28) == "// Klipper state: Disconnect") { // printer_webhooks_state_message = "Restarting ..."; } else if (params0.substr(0, 23) == "!! Must home axis first") { move_home_tips(); } else if (params0.substr(0, 29) == "!! Extrude below minimum temp") { filament_tips(); } else if (params0.substr(0, 31) == "// Recommended shaper_type_x = ") { std::string str{"(\\d+\\.\\d+)"}; // 匹配小数 std::smatch matchResult; std::regex re(str); std::string temp = params0.substr(31); if (std::regex_search(temp, matchResult, re)) { page_syntony_shaper_freq_x = matchResult[0]; } std::cout << "得到共振补偿的界面" << std::endl; // page_syntony_shaper_freq_x = params0.substr(52); MKSLOG_YELLOW("Shaper_freq_x = %s", page_syntony_shaper_freq_x.c_str()); } else if (params0.substr(0, 31) == "// Recommended shaper_type_y = ") { std::string str{"(\\d+\\.\\d+)"}; std::smatch matchResult; std::regex re(str); std::string temp = params0.substr(31); if (std::regex_search(temp, matchResult, re)) { page_syntony_shaper_freq_y = matchResult[0]; } std::cout << "得到共振补偿的界面" << std::endl; MKSLOG_YELLOW("Shaper_freq_y = %s", page_syntony_shaper_freq_y.c_str()); // page_syntony_shaper_freq_y = params0.substr(51); } else if (params0.substr(0, 14) == "// Z position:") { int start = params0.find(">") + 1; int end = params0.substr(start).find("<") - 1; str_manual_level_offset = params0.substr(start, end); std::cout << params0.substr(start, end) << std::endl; } else if (params0.substr(0, 21) == "!! Move out of range:") { move_tips(); } else if (params0.substr(0, 52) == "!! Can not update MCU 'mcu' config as it is shutdown") { printer_webhooks_state_message = "Can not update MCU 'mcu' config as it is shutdown"; } else if (params0.substr(0, 33) == "// accelerometer values (x, y, z)") { } else if (params0.substr(0, 12) == "// Lost comm") { } else if (params0 == "Can not update") { } else if (params0.find("Result is z=") != -1) { //4.4.3 CLL 修改自动取zoffset值时等打印机变为就绪状态时再保存数据 if (current_page_id == TJC_PAGE_AUTO_MOVING || current_page_id == TJC_PAGE_OPEN_CALIBRATE) { // set_mks_babystep(params0.substr(15)); // save_current_zoffset(); } } else if (params0 == "!! Insufficient disk space, unable to read the file.") { jump_to_memory_warning = true; } else if (params0.substr(0, 2) == "!!") { error_message = params0; detect_error(); } else if (params0.find("// Filament dia (measured mm):") != -1 || params0.find("// Filament NOT present") != -1 || params0.find("echo: Filament run out") != -1) { //4.4.2 CLL 使mates和霍尔宽度检测器适配 filament_message = params0; check_filament_width(); } else if (params0.substr(0, 12) == "// metadata=") { //4.1.7 CLL 修改网页打印信息订阅 已弃用 /* std::string str_metadata = params0.substr(12); output_metadata = string2json(str_metadata); std::cout << output_metadata << std::endl; parse_file_estimated_time_send(output_metadata); printer_print_stats_state = "printing"; MKSLOG_BLUE("跳转至打印"); */ } else if (params0.find("echo: Position init complete") != -1) { // CLL 收到echo:前缀的返回信息即是自定义的返回信息 if (current_page_id == TJC_PAGE_OPEN_CALIBRATE || current_page_id == TJC_PAGE_AUTO_MOVING) { step_1 = true; } } else if (params0.find("echo: Bed mesh calibrate complete") != -1) { if (current_page_id == TJC_PAGE_OPEN_CALIBRATE) { step_2 = true; printer_webhooks_state = "shutdown"; } if (current_page_id == TJC_PAGE_AUTO_MOVING) { step_4 = true; } } else if (params0.find("echo: Input shaping complete") != -1) { if (current_page_id == TJC_PAGE_OPEN_CALIBRATE) { step_3 = true; } if (current_page_id == TJC_PAGE_SYNTONY_MOVE) { step_1 = true; } } else if (params0.find("echo: Nozzle cleared") != -1) { if (current_page_id == TJC_PAGE_AUTO_MOVING) { step_2 = true; } } else if (params0.find("echo: Nozzle cooled") != -1) { if (current_page_id == TJC_PAGE_AUTO_MOVING) { step_3 = true; } } else if (params0.find("echo: Heat up complete") != -1) { if (current_page_id == TJC_PAGE_FILAMENT_POP_2 || current_page_id == TJC_PAGE_FILAMENT_POP_3 || current_page_id == TJC_PAGE_AUTO_UNLOAD) { step_1 = true; } } else if (params0.find("echo: Unload finish") != -1) { if (current_page_id == TJC_PAGE_AUTO_UNLOAD) { step_2 = true; } } else if (params0.find("echo: Load finish") != -1) { if (current_page_id == TJC_PAGE_FILAMENT_POP_3 || current_page_id == TJC_PAGE_FILAMENT_POP_2) { step_2 = true; } } else if (params0.find("echo: Detected unexpected interruption during the last print.") != -1 || params0.find("echo: Yes: RESUME_INTERRUPTED") != -1 || params0.find("echo: No: CLEAR_LAST_FILE") != -1) { jump_to_resume_print = true; } } }