From 300a944af6c2aa325a41fa19f2bff44ee7bccb66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 22 Nov 2020 18:44:17 -0600 Subject: [PATCH] Allow Status Message without LCD (#20246) --- Marlin/src/gcode/temp/M303.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 4 + Marlin/src/lcd/marlinui.cpp | 221 ++++++++++++++++-------------- Marlin/src/lcd/marlinui.h | 47 +++---- 4 files changed, 147 insertions(+), 127 deletions(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 52e34fc473..a066ddc88d 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -77,7 +77,7 @@ void GcodeSuite::M303() { KEEPALIVE_STATE(NOT_BUSY); #endif - ui.set_status_P(GET_TEXT(MSG_PID_AUTOTUNE)); + LCD_MESSAGEPGM(MSG_PID_AUTOTUNE); thermalManager.PID_autotune(temp, e, c, u); ui.reset_status(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 952ff2bbd6..9c080ee286 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -472,6 +472,10 @@ #endif #endif +#if EITHER(HAS_DISPLAY, GLOBAL_STATUS_MESSAGE) + #define HAS_STATUS_MESSAGE 1 +#endif + #if IS_ULTIPANEL && DISABLED(NO_LCD_MENUS) #define HAS_LCD_MENU 1 #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index acf35afb18..241d3a1712 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1332,59 +1332,16 @@ void MarlinUI::update() { #endif // HAS_WIRED_LCD -#if HAS_DISPLAY +#if HAS_STATUS_MESSAGE + + //////////////////////////////////////////// + ////////////// Status Message ////////////// + //////////////////////////////////////////// #if ENABLED(EXTENSIBLE_UI) #include "extui/ui_api.h" #endif - //////////////////////////////////////////// - /////////////// Status Line //////////////// - //////////////////////////////////////////// - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - void MarlinUI::advance_status_scroll() { - // Advance by one UTF8 code-word - if (status_scroll_offset < utf8_strlen(status_message)) - while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); - else - status_scroll_offset = 0; - } - char* MarlinUI::status_and_len(uint8_t &len) { - char *out = status_message + status_scroll_offset; - len = utf8_strlen(out); - return out; - } - #endif - - void MarlinUI::finish_status(const bool persist) { - - #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) - UNUSED(persist); - #endif - - #if ENABLED(LCD_PROGRESS_BAR) || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - const millis_t ms = millis(); - #endif - - #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL - progress_bar_ms = ms; - #if PROGRESS_MSG_EXPIRE > 0 - expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; - #endif - #endif - - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - next_filament_display = ms + 5000UL; // Show status message for 5s - #endif - - #if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING) - status_scroll_offset = 0; - #endif - - TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); - } - bool MarlinUI::has_status() { return (status_message[0] != '\0'); } void MarlinUI::set_status(const char * const message, const bool persist) { @@ -1414,16 +1371,45 @@ void MarlinUI::update() { finish_status(persist); } - #include + /** + * Reset the status message + */ + void MarlinUI::reset_status(const bool no_welcome) { + #if SERVICE_INTERVAL_1 > 0 + static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); + #endif + #if SERVICE_INTERVAL_2 > 0 + static PGMSTR(service2, "> " SERVICE_NAME_2 "!"); + #endif + #if SERVICE_INTERVAL_3 > 0 + static PGMSTR(service3, "> " SERVICE_NAME_3 "!"); + #endif + PGM_P msg; + if (printingIsPaused()) + msg = GET_TEXT(MSG_PRINT_PAUSED); + #if ENABLED(SDSUPPORT) + else if (IS_SD_PRINTING()) + return set_status(card.longest_filename(), true); + #endif + else if (print_job_timer.isRunning()) + msg = GET_TEXT(MSG_PRINTING); - void MarlinUI::status_printf_P(const uint8_t level, PGM_P const fmt, ...) { - if (level < alert_level) return; - alert_level = level; - va_list args; - va_start(args, fmt); - vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, fmt, args); - va_end(args); - finish_status(level > 0); + #if SERVICE_INTERVAL_1 > 0 + else if (print_job_timer.needsService(1)) msg = service1; + #endif + #if SERVICE_INTERVAL_2 > 0 + else if (print_job_timer.needsService(2)) msg = service2; + #endif + #if SERVICE_INTERVAL_3 > 0 + else if (print_job_timer.needsService(3)) msg = service3; + #endif + + else if (!no_welcome) + msg = GET_TEXT(WELCOME_MSG); + else + return; + + set_status_P(msg, -1); } void MarlinUI::set_status_P(PGM_P const message, int8_t level) { @@ -1459,51 +1445,76 @@ void MarlinUI::update() { TERN_(HAS_LCD_MENU, return_to_status()); } - PGM_P print_paused = GET_TEXT(MSG_PRINT_PAUSED); + #include - /** - * Reset the status message - */ - void MarlinUI::reset_status(const bool no_welcome) { - PGM_P printing = GET_TEXT(MSG_PRINTING); - PGM_P welcome = GET_TEXT(WELCOME_MSG); - #if SERVICE_INTERVAL_1 > 0 - static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); - #endif - #if SERVICE_INTERVAL_2 > 0 - static PGMSTR(service2, "> " SERVICE_NAME_2 "!"); - #endif - #if SERVICE_INTERVAL_3 > 0 - static PGMSTR(service3, "> " SERVICE_NAME_3 "!"); - #endif - PGM_P msg; - if (printingIsPaused()) - msg = print_paused; - #if ENABLED(SDSUPPORT) - else if (IS_SD_PRINTING()) - return set_status(card.longest_filename(), true); - #endif - else if (print_job_timer.isRunning()) - msg = printing; - - #if SERVICE_INTERVAL_1 > 0 - else if (print_job_timer.needsService(1)) msg = service1; - #endif - #if SERVICE_INTERVAL_2 > 0 - else if (print_job_timer.needsService(2)) msg = service2; - #endif - #if SERVICE_INTERVAL_3 > 0 - else if (print_job_timer.needsService(3)) msg = service3; - #endif - - else if (!no_welcome) - msg = welcome; - else - return; - - set_status_P(msg, -1); + void MarlinUI::status_printf_P(const uint8_t level, PGM_P const fmt, ...) { + if (level < alert_level) return; + alert_level = level; + va_list args; + va_start(args, fmt); + vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, fmt, args); + va_end(args); + finish_status(level > 0); } + void MarlinUI::finish_status(const bool persist) { + + #if HAS_SPI_LCD + + #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) + UNUSED(persist); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + const millis_t ms = millis(); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) + progress_bar_ms = ms; + #if PROGRESS_MSG_EXPIRE > 0 + expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; + #endif + #endif + + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + next_filament_display = ms + 5000UL; // Show status message for 5s + #endif + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + status_scroll_offset = 0; + #endif + + #endif + + TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); + } + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + + void MarlinUI::advance_status_scroll() { + // Advance by one UTF8 code-word + if (status_scroll_offset < utf8_strlen(status_message)) + while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); + else + status_scroll_offset = 0; + } + + char* MarlinUI::status_and_len(uint8_t &len) { + char *out = status_message + status_scroll_offset; + len = utf8_strlen(out); + return out; + } + + #endif + +#endif + +#if HAS_DISPLAY + + #if ENABLED(SDSUPPORT) + extern bool wait_for_user, wait_for_heatup; + #endif + void MarlinUI::abort_print() { #if ENABLED(SDSUPPORT) wait_for_heatup = wait_for_user = false; @@ -1514,7 +1525,7 @@ void MarlinUI::update() { #endif TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR)); print_job_timer.stop(); - set_status_P(GET_TEXT(MSG_PRINT_ABORTED)); + LCD_MESSAGEPGM(MSG_PRINT_ABORTED); TERN_(HAS_LCD_MENU, return_to_status()); } @@ -1530,7 +1541,7 @@ void MarlinUI::update() { TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("UI Pause"), PSTR("Resume"))); - set_status_P(print_paused); + LCD_MESSAGEPGM(MSG_PRINT_PAUSED); #if ENABLED(PARK_HEAD_ON_PAUSE) TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress @@ -1615,6 +1626,10 @@ void MarlinUI::update() { #if ENABLED(SDSUPPORT) + #if ENABLED(EXTENSIBLE_UI) + #include "extui/ui_api.h" + #endif + void MarlinUI::media_changed(const uint8_t old_status, const uint8_t status) { if (old_status == status) { TERN_(EXTENSIBLE_UI, ExtUI::onMediaError()); // Failed to mount/unmount @@ -1629,7 +1644,7 @@ void MarlinUI::update() { quick_feedback(); goto_screen(MEDIA_MENU_GATEWAY); #else - set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); + LCD_MESSAGEPGM(MSG_MEDIA_INSERTED); #endif } } @@ -1637,7 +1652,7 @@ void MarlinUI::update() { if (old_status < 2) { TERN_(EXTENSIBLE_UI, ExtUI::onMediaRemoved()); // ExtUI response #if PIN_EXISTS(SD_DETECT) - set_status_P(GET_TEXT(MSG_MEDIA_REMOVED)); + LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); #if HAS_LCD_MENU if (!defer_return_to_status) return_to_status(); #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 3311f55ed5..ccf995bd71 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -373,17 +373,9 @@ public: static constexpr uint8_t get_progress_percent() { return 0; } #endif - #if HAS_DISPLAY - - static void init(); - static void update(); - static void set_alert_status_P(PGM_P const message); - + #if HAS_STATUS_MESSAGE static char status_message[]; - static bool has_status(); - static uint8_t alert_level; // Higher levels block lower levels - static inline void reset_alert_level() { alert_level = 0; } #if ENABLED(STATUS_MESSAGE_SCROLLING) static uint8_t status_scroll_offset; @@ -391,6 +383,28 @@ public: static char* status_and_len(uint8_t &len); #endif + static bool has_status(); + static void reset_status(const bool no_welcome=false); + static void set_status(const char* const message, const bool persist=false); + static void set_status_P(PGM_P const message, const int8_t level=0); + static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); + static void set_alert_status_P(PGM_P const message); + static inline void reset_alert_level() { alert_level = 0; } + #else + static constexpr bool has_status() { return false; } + static inline void reset_status(const bool=false) {} + static void set_status(const char* message, const bool=false); + static void set_status_P(PGM_P message, const int8_t=0); + static void status_printf_P(const uint8_t, PGM_P message, ...); + static inline void set_alert_status_P(PGM_P const) {} + static inline void reset_alert_level() {} + #endif + + #if HAS_DISPLAY + + static void init(); + static void update(); + static void abort_print(); static void pause_print(); static void resume_print(); @@ -481,25 +495,12 @@ public: static bool get_blink(); static void kill_screen(PGM_P const lcd_error, PGM_P const lcd_component); static void draw_kill_screen(); - static void set_status(const char* const message, const bool persist=false); - static void set_status_P(PGM_P const message, const int8_t level=0); - static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); - static void reset_status(const bool no_welcome=false); #else // No LCD - // Send status to host as a notification - static void set_status(const char* message, const bool=false); - static void set_status_P(PGM_P message, const int8_t=0); - static void status_printf_P(const uint8_t, PGM_P message, ...); - static inline void init() {} static inline void update() {} static inline void return_to_status() {} - static inline void set_alert_status_P(PGM_P const) {} - static inline void reset_status(const bool=false) {} - static inline void reset_alert_level() {} - static constexpr bool has_status() { return false; } #endif @@ -702,7 +703,7 @@ public: private: - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE static void finish_status(const bool persist); #endif