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 }