diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 1cf7be2c..c8d74006 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -9928,6 +9928,18 @@ if(0) #endif check_axes_activity(); mmu_loop(); + + // handle longpress + if(lcd_longpress_trigger) + { + // long press is not possible in modal mode, wait until ready + if (lcd_longpress_func && lcd_update_enabled) + { + lcd_longpress_func(); + lcd_longpress_trigger = 0; + } + } + #if defined(AUTO_REPORT) host_autoreport(); #endif //AUTO_REPORT diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index c3f2921d..37b70f1a 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -728,6 +728,10 @@ void lcd_update_enable(uint8_t enabled) } } +bool lcd_longpress_trigger = 0; + +// WARNING: this function is called from the temperature ISR. +// Only update flags, but do not perform any menu/lcd operation! void lcd_buttons_update(void) { static uint8_t lcd_long_press_active = 0; @@ -749,9 +753,7 @@ void lcd_buttons_update(void) else if (longPressTimer.expired(LONG_PRESS_TIME)) { lcd_long_press_active = 1; - //long press is not possible in modal mode - if (lcd_longpress_func && lcd_update_enabled) - lcd_longpress_func(); + lcd_longpress_trigger = 1; } } } diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 12b162e7..65bb9dc9 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -110,6 +110,7 @@ extern uint32_t lcd_next_update_millis; extern uint8_t lcd_status_update_delay; extern lcd_longpress_func_t lcd_longpress_func; +extern bool lcd_longpress_trigger; extern lcd_charsetup_func_t lcd_charsetup_func;