From 80c06bda5557e97a048a3264cf0c343853668cfd Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Thu, 22 Sep 2022 16:12:35 +0200 Subject: [PATCH 1/2] Improve warning behavior during thermal anomaly The current code forces any warning to return the user to the status screen in order to show the message. Thermal anomaly warnings can repeat at very short intervals, making menu navigation (to pause/tune the print) impossible. We now check if the message to be displayed is the same and only force a kickback for new messages. This partially reverts https://github.com/prusa3d/Prusa-Firmware/pull/3600 since we need the string to be null terminated for ease of comparison. We pad the status line at display time instead using the new lcd_print_pad() function which achieves the same effect. --- Firmware/lcd.cpp | 6 ++++++ Firmware/lcd.h | 1 + Firmware/ultralcd.cpp | 26 ++++++++++---------------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 7e8f6fda8..0c4652731 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -528,6 +528,12 @@ void lcd_print(const char* s) while (*s) lcd_write(*(s++)); } +void lcd_print_pad(const char* s, uint8_t len) +{ + while (len-- && *s) lcd_write(*(s++)); + lcd_space(len); +} + void lcd_print(char c, int base) { lcd_print((long) c, base); diff --git a/Firmware/lcd.h b/Firmware/lcd.h index c741fd700..50d6bde37 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -53,6 +53,7 @@ extern void lcd_printNumber(unsigned long n, uint8_t base); extern void lcd_printFloat(double number, uint8_t digits); extern void lcd_print(const char*); +extern void lcd_print_pad(const char*, uint8_t len); extern void lcd_print(char, int = 0); extern void lcd_print(unsigned char, int = 0); extern void lcd_print(int, int = 10); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 3ab065253..1296002ec 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -617,7 +617,7 @@ void lcdui_print_status_line(void) case CustomMsg::M117: // M117 Set the status line message on the LCD case CustomMsg::Status: // Nothing special, print status message normally case CustomMsg::M0Wait: // M0/M1 Wait command working even from SD - lcd_print(lcd_status_message); + lcd_print_pad(lcd_status_message, LCD_WIDTH); break; case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status if (custom_message_state > 10) { @@ -641,10 +641,10 @@ void lcdui_print_status_line(void) } break; case CustomMsg::FilamentLoading: // If loading filament, print status - lcd_print(lcd_status_message); + lcd_print_pad(lcd_status_message, LCD_WIDTH); break; case CustomMsg::PidCal: // PID tuning in progress - lcd_print(lcd_status_message); + lcd_print_pad(lcd_status_message, LCD_WIDTH); if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) { lcd_set_cursor(10, 3); lcd_print(itostr3(pid_cycle)); @@ -7482,16 +7482,6 @@ void menu_action_sddirectory(const char* filename) /** LCD API **/ -static void lcd_padstatus() { - int len = strlen(lcd_status_message); - if (len > 0) { - while (len < LCD_WIDTH) { - lcd_status_message[len++] = ' '; - } - } - lcd_status_message[LCD_WIDTH] = '\0'; -} - void ultralcd_init() { { @@ -7526,7 +7516,6 @@ void ultralcd_init() // Initialise status line strncpy_P(lcd_status_message, MSG_WELCOME, LCD_WIDTH); - lcd_padstatus(); } void lcd_ignore_click(bool b) @@ -7537,7 +7526,6 @@ void lcd_ignore_click(bool b) void lcd_finishstatus() { SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED); - lcd_padstatus(); lcd_draw_update = 2; } @@ -7583,12 +7571,18 @@ void lcd_setstatuspgm(const char* message) void lcd_setalertstatus_(const char* message, uint8_t severity, bool progmem) { if (lcd_message_check(severity)) { + bool same = !(progmem? + strcmp_P(lcd_status_message, message): + strcmp(lcd_status_message, message)); lcd_updatestatus(message, progmem); lcd_status_message_timeout.start(); lcd_status_message_level = severity; custom_message_type = CustomMsg::Status; custom_message_state = 0; - lcd_return_to_status(); + if (!same) { + // do not kick the user out of the menus if the message is unchanged + lcd_return_to_status(); + } } } From 26b091d50eff51beceaf809a37e7f878af34ffb1 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Fri, 23 Sep 2022 11:54:16 +0200 Subject: [PATCH 2/2] Remove unneeded lcd_finishstatus() --- Firmware/ultralcd.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1296002ec..98c41a6dd 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -242,9 +242,6 @@ static void lcd_cutter_enabled(); #endif static void lcd_babystep_z(); -//! Beware: has side effects - forces lcd_draw_update to 2, which means clear the display -void lcd_finishstatus(); - static void lcd_sdcard_menu(); static void lcd_sheet_menu(); @@ -7422,7 +7419,6 @@ static bool check_file(const char* filename) { card.printingHasFinished(); lcd_setstatuspgm(MSG_WELCOME); - lcd_finishstatus(); return result; } @@ -7524,11 +7520,6 @@ void lcd_ignore_click(bool b) wait_for_unclick = false; } -void lcd_finishstatus() { - SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED); - lcd_draw_update = 2; -} - static bool lcd_message_check(uint8_t priority) { // regular priority check @@ -7551,7 +7542,9 @@ static void lcd_updatestatus(const char *message, bool progmem = false) strncpy(lcd_status_message, message, LCD_WIDTH); lcd_status_message[LCD_WIDTH] = 0; - lcd_finishstatus(); + + SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED); + // hack lcd_draw_update to 1, i.e. without clear lcd_draw_update = 1; }