diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 8d78d5a50..567f50f68 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -284,7 +284,8 @@ uint16_t max_display_update_time = 0; */ #define _MENU_ITEM_PART_1(TYPE, ...) \ if (_menuLineNr == _thisItemNr) { \ - if (lcd_clicked && encoderLine == _thisItemNr) { + if (encoderLine == _thisItemNr && lcd_clicked) { \ + lcd_clicked = false #define _MENU_ITEM_PART_2(TYPE, LABEL, ...) \ menu_action_ ## TYPE(__VA_ARGS__); \ @@ -488,6 +489,12 @@ uint16_t max_display_update_time = 0; float raw_Ki, raw_Kd; // place-holders for Ki and Kd edits #endif + inline bool use_click() { + const bool click = lcd_clicked; + lcd_clicked = false; + return click; + } + /** * General function to go directly to a screen */ @@ -667,7 +674,7 @@ void lcd_status_screen() { #if ENABLED(ULTIPANEL) - if (lcd_clicked) { + if (use_click()) { #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) previous_lcd_status_ms = millis(); // get status message to show up for a while #endif @@ -852,7 +859,7 @@ void kill_screen(const char* lcd_msg) { static void progress_bar_test() { static int8_t bar_percent = 0; - if (lcd_clicked) { + if (use_click()) { lcd_goto_previous_menu(); lcd_set_custom_characters(CHARSET_MENU); return; @@ -1079,7 +1086,7 @@ void kill_screen(const char* lcd_msg) { #if ENABLED(BABYSTEPPING) void _lcd_babystep(const AxisEnum axis, const char* msg) { - if (lcd_clicked) { return lcd_goto_previous_menu_no_defer(); } + if (use_click()) { return lcd_goto_previous_menu_no_defer(); } ENCODER_DIRECTION_NORMAL(); if (encoderPosition) { const int16_t babystep_increment = (int32_t)encoderPosition * (BABYSTEP_MULTIPLICATOR); @@ -1102,7 +1109,7 @@ void kill_screen(const char* lcd_msg) { #if ENABLED(BABYSTEP_ZPROBE_OFFSET) void lcd_babystep_zoffset() { - if (lcd_clicked) { return lcd_goto_previous_menu_no_defer(); } + if (use_click()) { return lcd_goto_previous_menu_no_defer(); } defer_return_to_status = true; ENCODER_DIRECTION_NORMAL(); if (encoderPosition) { @@ -1784,7 +1791,7 @@ void kill_screen(const char* lcd_msg) { void _lcd_level_bed_get_z() { ENCODER_DIRECTION_NORMAL(); - if (lcd_clicked) { + if (use_click()) { // // Save the current Z position and move @@ -1846,7 +1853,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 @@ -1864,7 +1870,7 @@ void kill_screen(const char* lcd_msg) { */ void _lcd_level_bed_homing_done() { if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING)); - if (lcd_clicked) { + if (use_click()) { manual_probe_index = 0; _lcd_level_goto_next_point(); } @@ -2355,7 +2361,7 @@ void kill_screen(const char* lcd_msg) { if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) return lcd_goto_screen(_lcd_ubl_map_homing); - if (lcd_clicked) return _lcd_ubl_map_lcd_edit_cmd(); + if (use_click()) return _lcd_ubl_map_lcd_edit_cmd(); ENCODER_DIRECTION_NORMAL(); if (encoderPosition) { @@ -2824,7 +2830,7 @@ void kill_screen(const char* lcd_msg) { */ void _lcd_move_xyz(const char* name, AxisEnum axis) { - if (lcd_clicked) { return lcd_goto_previous_menu(); } + if (use_click()) { return lcd_goto_previous_menu(); } ENCODER_DIRECTION_NORMAL(); if (encoderPosition && !processing_manual_move) { refresh_cmd_timeout(); @@ -2886,12 +2892,10 @@ void kill_screen(const char* lcd_msg) { if ((int32_t)encoderPosition > 0) NOMORE(current_position[axis], max); #endif - encoderPosition = 0; - manual_move_to_current(axis); - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; } + encoderPosition = 0; if (lcdDrawUpdate) { const float pos = current_position[axis] #if IS_KINEMATIC @@ -2909,7 +2913,7 @@ void kill_screen(const char* lcd_msg) { int8_t eindex=-1 #endif ) { - if (lcd_clicked) { return lcd_goto_previous_menu(); } + if (use_click()) { return lcd_goto_previous_menu(); } ENCODER_DIRECTION_NORMAL(); if (encoderPosition) { if (!processing_manual_move) { @@ -2991,7 +2995,7 @@ void kill_screen(const char* lcd_msg) { _manual_move_func_ptr = func; START_MENU(); if (LCD_HEIGHT >= 4) { - switch(axis) { + switch (axis) { case X_AXIS: STATIC_ITEM(MSG_MOVE_X, true, true); break; case Y_AXIS: @@ -3787,7 +3791,7 @@ void kill_screen(const char* lcd_msg) { * */ void lcd_info_stats_menu() { - if (lcd_clicked) { return lcd_goto_previous_menu(); } + if (use_click()) { return lcd_goto_previous_menu(); } char buffer[21]; printStatistics stats = print_job_timer.getStats(); @@ -3821,7 +3825,7 @@ void kill_screen(const char* lcd_msg) { * */ void lcd_info_thermistors_menu() { - if (lcd_clicked) { return lcd_goto_previous_menu(); } + if (use_click()) { return lcd_goto_previous_menu(); } START_SCREEN(); #define THERMISTOR_ID TEMP_SENSOR_0 #include "thermistornames.h" @@ -3882,7 +3886,7 @@ void kill_screen(const char* lcd_msg) { * */ void lcd_info_board_menu() { - if (lcd_clicked) { return lcd_goto_previous_menu(); } + if (use_click()) { return lcd_goto_previous_menu(); } START_SCREEN(); STATIC_ITEM(BOARD_NAME, true, true); // MyPrinterController STATIC_ITEM(MSG_INFO_BAUDRATE ": " STRINGIFY(BAUDRATE), true); // Baud: 250000 @@ -3903,7 +3907,7 @@ void kill_screen(const char* lcd_msg) { * */ void lcd_info_printer_menu() { - if (lcd_clicked) { return lcd_goto_previous_menu(); } + if (use_click()) { return lcd_goto_previous_menu(); } START_SCREEN(); STATIC_ITEM(MSG_MARLIN, true, true); // Marlin STATIC_ITEM(SHORT_BUILD_VERSION, true); // x.x.x-Branch @@ -4302,7 +4306,7 @@ void kill_screen(const char* lcd_msg) { if (liveEdit) (*callbackFunc)(); \ if (lcd_clicked) lcd_goto_previous_menu(); \ } \ - return lcd_clicked; \ + return use_click(); \ } \ void menu_edit_ ## _name() { _menu_edit_ ## _name(); } \ void menu_edit_callback_ ## _name() { if (_menu_edit_ ## _name()) (*callbackFunc)(); } \ @@ -4659,7 +4663,7 @@ void lcd_update() { #if ENABLED(DOGLCD) || drawing_screen #endif - ) { + ) { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; @@ -4763,12 +4767,13 @@ void lcd_update() { if ((lcdDrawUpdate || IS_DRAWING) && (!bbr2 || bbr2 > max_display_update_time)) { + // Change state of drawing flag between screen updates if (!IS_DRAWING) switch (lcdDrawUpdate) { case LCDVIEW_CALL_NO_REDRAW: lcdDrawUpdate = LCDVIEW_NONE; break; - case LCDVIEW_CLEAR_CALL_REDRAW: // set by handlers, then altered after (rarely occurs here) - case LCDVIEW_CALL_REDRAW_NEXT: // set by handlers, then altered after (never occurs here?) + case LCDVIEW_CLEAR_CALL_REDRAW: + case LCDVIEW_CALL_REDRAW_NEXT: lcdDrawUpdate = LCDVIEW_REDRAW_NOW; case LCDVIEW_REDRAW_NOW: // set above, or by a handler through LCDVIEW_CALL_REDRAW_NEXT case LCDVIEW_NONE: @@ -4780,7 +4785,7 @@ void lcd_update() { #endif #if ENABLED(ULTIPANEL) - #define CURRENTSCREEN() (*currentScreen)(), lcd_clicked = false + #define CURRENTSCREEN() (*currentScreen)() #else #define CURRENTSCREEN() lcd_status_screen() #endif @@ -4805,6 +4810,10 @@ void lcd_update() { CURRENTSCREEN(); #endif + #if ENABLED(ULTIPANEL) + lcd_clicked = false; + #endif + // Keeping track of the longest time for an individual LCD update. // Used to do screen throttling when the planner starts to fill up. NOLESS(max_display_update_time, millis() - ms); @@ -4820,17 +4829,16 @@ void lcd_update() { #endif // ULTIPANEL + // Change state of drawing flag between screen updates if (!IS_DRAWING) switch (lcdDrawUpdate) { case LCDVIEW_CLEAR_CALL_REDRAW: - lcd_implementation_clear(); - case LCDVIEW_CALL_REDRAW_NEXT: - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; - break; + lcd_implementation_clear(); break; case LCDVIEW_REDRAW_NOW: lcdDrawUpdate = LCDVIEW_NONE; - break; case LCDVIEW_NONE: - break; + case LCDVIEW_CALL_REDRAW_NEXT: + case LCDVIEW_CALL_NO_REDRAW: + default: break; } // switch } // ELAPSED(ms, next_lcd_update_ms)