diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp index 7a6c65ffa9..a12cbdb25b 100644 --- a/Marlin/src/Marlin.cpp +++ b/Marlin/src/Marlin.cpp @@ -346,7 +346,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { // Prevent steppers timing-out in the middle of M600 #if ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) - #define MOVE_AWAY_TEST !move_away_flag + #define MOVE_AWAY_TEST !did_pause_print #else #define MOVE_AWAY_TEST true #endif diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index f41e346ef5..92f4f9d6be 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -54,7 +54,6 @@ static float resume_position[XYZE]; #if ENABLED(SDSUPPORT) #include "../sd/cardreader.h" - static bool sd_print_paused = false; #endif #if HAS_BUZZER @@ -107,12 +106,12 @@ void do_pause_e_move(const float &length, const float fr) { // public: -bool move_away_flag = false; +uint8_t did_pause_print = 0; bool pause_print(const float &retract, const point_t &park_point, const float &unload_length/*=0*/, const int8_t max_beep_count/*=0*/, const bool show_lcd/*=false*/ ) { - if (move_away_flag) return false; // already paused + if (did_pause_print) return false; // already paused #ifdef ACTION_ON_PAUSE SERIAL_ECHOLNPGM("//action:" ACTION_ON_PAUSE); @@ -132,13 +131,13 @@ bool pause_print(const float &retract, const point_t &park_point, const float &u } // Indicate that the printer is paused - move_away_flag = true; + ++did_pause_print; // Pause the print job and timer #if ENABLED(SDSUPPORT) if (IS_SD_PRINTING) { card.pauseSDPrint(); - sd_print_paused = true; + ++did_pause_print; } #endif print_job_timer.pause(); @@ -256,7 +255,7 @@ void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { void resume_print(const float &load_length/*=0*/, const float &initial_extrude_length/*=0*/, const int8_t max_beep_count/*=0*/) { bool nozzle_timed_out = false; - if (!move_away_flag) return; + if (!did_pause_print) return; // Re-enable the heaters if they timed out HOTEND_LOOP() { @@ -350,14 +349,14 @@ void resume_print(const float &load_length/*=0*/, const float &initial_extrude_l SERIAL_ECHOLNPGM("//action:" ACTION_ON_RESUME); #endif + --did_pause_print; + #if ENABLED(SDSUPPORT) - if (sd_print_paused) { + if (did_pause_print) { card.startFileprint(); - sd_print_paused = false; + --did_pause_print; } #endif - - move_away_flag = false; } #endif // ADVANCED_PAUSE_FEATURE || PARK_HEAD_ON_PAUSE diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 2eb4eb44a8..c17a7a44da 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -30,7 +30,7 @@ #include "../libs/nozzle.h" -extern bool move_away_flag; +extern bool did_pause_print; bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const int8_t max_beep_count=0, const bool show_lcd=false diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index b8834efda8..ddd74a4721 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -491,7 +491,7 @@ void GcodeSuite::G33() { // Report settings - const char *checkingac = PSTR("Checking... AC"); // TODO: Make translatable string + PGM_P checkingac = PSTR("Checking... AC"); // TODO: Make translatable string serialprintPGM(checkingac); if (verbose_level == 0) SERIAL_PROTOCOLPGM(" (DRY-RUN)"); SERIAL_EOL(); @@ -673,7 +673,7 @@ void GcodeSuite::G33() { } } else { // dry run - const char *enddryrun = PSTR("End DRY-RUN"); + PGM_P enddryrun = PSTR("End DRY-RUN"); serialprintPGM(enddryrun); SERIAL_PROTOCOL_SP(35); SERIAL_PROTOCOLPGM("std dev:"); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 48db56c8ba..0bd42289d3 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -164,6 +164,8 @@ uint16_t max_display_update_time = 0; extern bool powersupply_on; #endif + bool no_reentry = false; + //////////////////////////////////////////// ///////////////// Menu Tree //////////////// //////////////////////////////////////////// @@ -572,14 +574,13 @@ uint16_t max_display_update_time = 0; // done. ** This blocks the command queue! ** // void _lcd_synchronize() { - static bool no_reentry = false; if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, sync_message); if (no_reentry) return; // Make this the current handler till all moves are done no_reentry = true; const screenFunc_t old_screen = currentScreen; lcd_goto_screen(_lcd_synchronize); - stepper.synchronize(); + stepper.synchronize(); // idle() is called until moves complete no_reentry = false; lcd_goto_screen(old_screen); } @@ -1741,6 +1742,20 @@ void kill_screen(const char* lcd_msg) { lcd_return_to_status(); } + #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(PID_AUTOTUNE_MENU) || ENABLED(ADVANCED_PAUSE_FEATURE) + + /** + * If the queue is full, the command will fail, so we have to loop + * with idle() to make sure the command has been enqueued. + */ + void lcd_enqueue_command_sram(char * const cmd) { + no_reentry = true; + while (enqueue_and_echo_command(cmd)) idle(); + no_reentry = false; + } + + #endif + #if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART) void lcd_autostart_sd() { @@ -1917,7 +1932,6 @@ void kill_screen(const char* lcd_msg) { * Step 5: Initiate a move to the next point */ void _lcd_level_goto_next_point() { - // Set the menu to display ahead of blocking call lcd_goto_screen(_lcd_level_bed_moving); // G29 Records Z, moves, and signals when it pauses @@ -2065,10 +2079,10 @@ void kill_screen(const char* lcd_msg) { enqueue_and_echo_commands_P(PSTR("G28")); #if HAS_TEMP_BED sprintf_P(UBL_LCD_GCODE, PSTR("M190 S%i"), custom_bed_temp); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); #endif sprintf_P(UBL_LCD_GCODE, PSTR("M109 S%i"), custom_hotend_temp); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); enqueue_and_echo_commands_P(PSTR("G29 P1")); } @@ -2099,7 +2113,7 @@ void kill_screen(const char* lcd_msg) { const int ind = ubl_height_amount > 0 ? 9 : 10; strcpy_P(UBL_LCD_GCODE, PSTR("G29 P6 C -")); sprintf_P(&UBL_LCD_GCODE[ind], PSTR(".%i"), abs(ubl_height_amount)); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); } /** @@ -2149,8 +2163,9 @@ void kill_screen(const char* lcd_msg) { 0 #endif ; - sprintf_P(UBL_LCD_GCODE, PSTR("G28\nG26 C B%i H%i P"), temp, custom_hotend_temp); - enqueue_and_echo_command(UBL_LCD_GCODE); + sprintf_P(UBL_LCD_GCODE, PSTR("G26 C B%i H%i P"), temp, custom_hotend_temp); + lcd_enqueue_command_sram("G28"); + lcd_enqueue_command_sram(UBL_LCD_GCODE); } /** @@ -2183,7 +2198,7 @@ void kill_screen(const char* lcd_msg) { void _lcd_ubl_grid_level_cmd() { char UBL_LCD_GCODE[10]; sprintf_P(UBL_LCD_GCODE, PSTR("G29 J%i"), side_points); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); } /** @@ -2224,16 +2239,7 @@ void kill_screen(const char* lcd_msg) { void _lcd_ubl_fillin_amount_cmd() { char UBL_LCD_GCODE[16]; sprintf_P(UBL_LCD_GCODE, PSTR("G29 P3 R C.%i"), ubl_fillin_amount); - enqueue_and_echo_command(UBL_LCD_GCODE); - } - - /** - * UBL Smart Fill-in Command - */ - void _lcd_ubl_smart_fillin_cmd() { - char UBL_LCD_GCODE[12]; - sprintf_P(UBL_LCD_GCODE, PSTR("G29 P3 T0")); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); } /** @@ -2250,7 +2256,7 @@ void kill_screen(const char* lcd_msg) { START_MENU(); MENU_BACK(MSG_UBL_BUILD_MESH_MENU); MENU_ITEM_EDIT_CALLBACK(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); - MENU_ITEM(function, MSG_UBL_SMART_FILLIN, _lcd_ubl_smart_fillin_cmd); + MENU_ITEM(gcode, MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); MENU_ITEM(gcode, MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); END_MENU(); @@ -2323,22 +2329,20 @@ void kill_screen(const char* lcd_msg) { * UBL Load Mesh Command */ void _lcd_ubl_load_mesh_cmd() { - char UBL_LCD_GCODE[25]; + char UBL_LCD_GCODE[10]; sprintf_P(UBL_LCD_GCODE, PSTR("G29 L%i"), ubl_storage_slot); - enqueue_and_echo_command(UBL_LCD_GCODE); - sprintf_P(UBL_LCD_GCODE, PSTR("M117 " MSG_MESH_LOADED "."), ubl_storage_slot); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); + enqueue_and_echo_commands_P(PSTR("M117 " MSG_MESH_LOADED ".")); } /** * UBL Save Mesh Command */ void _lcd_ubl_save_mesh_cmd() { - char UBL_LCD_GCODE[25]; + char UBL_LCD_GCODE[10]; sprintf_P(UBL_LCD_GCODE, PSTR("G29 S%i"), ubl_storage_slot); - enqueue_and_echo_command(UBL_LCD_GCODE); - sprintf_P(UBL_LCD_GCODE, PSTR("M117 " MSG_MESH_SAVED "."), ubl_storage_slot); - enqueue_and_echo_command(UBL_LCD_GCODE); + lcd_enqueue_command_sram(UBL_LCD_GCODE); + enqueue_and_echo_commands_P(PSTR("M117 " MSG_MESH_SAVED ".")); } /** @@ -2384,12 +2388,11 @@ void kill_screen(const char* lcd_msg) { * UBL LCD "radar" map point editing */ void _lcd_ubl_map_lcd_edit_cmd() { - char ubl_lcd_gcode [50], str[10], str2[10]; - + char UBL_LCD_GCODE[50], str[10], str2[10]; dtostrf(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]), 0, 2, str); dtostrf(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]), 0, 2, str2); - snprintf_P(ubl_lcd_gcode, sizeof(ubl_lcd_gcode), PSTR("G29 P4 X%s Y%s R%i"), str, str2, n_edit_pts); - enqueue_and_echo_command(ubl_lcd_gcode); + snprintf_P(UBL_LCD_GCODE, sizeof(UBL_LCD_GCODE), PSTR("G29 P4 X%s Y%s R%i"), str, str2, n_edit_pts); + lcd_enqueue_command_sram(UBL_LCD_GCODE); } /** @@ -2537,7 +2540,7 @@ void kill_screen(const char* lcd_msg) { START_MENU(); MENU_BACK(MSG_UBL_LEVEL_BED); MENU_ITEM(gcode, "1 " MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - MENU_ITEM(function, "2 " MSG_UBL_SMART_FILLIN, _lcd_ubl_smart_fillin_cmd); + MENU_ITEM(gcode, "2 " MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); MENU_ITEM(submenu, "3 " MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); MENU_ITEM(gcode, "4 " MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); MENU_ITEM(submenu, "5 " MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); @@ -2979,11 +2982,10 @@ void kill_screen(const char* lcd_msg) { #endif manual_move_to_current(axis); - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; } encoderPosition = 0; - if (lcdDrawUpdate && !processing_manual_move) { + if (lcdDrawUpdate) { const float pos = current_position[axis] #if IS_KINEMATIC + manual_move_offset @@ -3019,7 +3021,7 @@ void kill_screen(const char* lcd_msg) { } encoderPosition = 0; } - if (lcdDrawUpdate && !processing_manual_move) { + if (lcdDrawUpdate) { PGM_P pos_label; #if E_MANUAL == 1 pos_label = PSTR(MSG_MOVE_E); @@ -3283,7 +3285,7 @@ void kill_screen(const char* lcd_msg) { autotune_temp[e] #endif ); - enqueue_and_echo_command(cmd); + lcd_enqueue_command_sram(cmd); } #endif // PID_AUTOTUNE_MENU @@ -4719,7 +4721,7 @@ void lcd_update() { if (UBL_CONDITION && LCD_CLICKED) { if (!wait_for_unclick) { // If not waiting for a debounce release: wait_for_unclick = true; // Set debounce flag to ignore continous clicks - lcd_clicked = !wait_for_user; // Keep the click if not waiting for a user-click + lcd_clicked = !wait_for_user && !no_reentry; // Flag the click if allowed wait_for_user = false; // Any click clears wait for user lcd_quick_feedback(); // Always make a click sound }