From 5b6fb9e49b1dbbe7cb6787d5c8825bbe9955425e Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 22 Jul 2018 15:05:24 +0200 Subject: [PATCH 1/3] Use Timer class for button blanking. Save 74B FLASH and 1B RAM. --- Firmware/lcd.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index f564be869..e78b855bb 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -675,7 +675,7 @@ lcd_charsetup_func_t lcd_charsetup_func = 0; lcd_lcdupdate_func_t lcd_lcdupdate_func = 0; -uint32_t lcd_button_blanking_time = millis(); +static ShortTimer buttonBlanking; ShortTimer longPressTimer; @@ -763,9 +763,8 @@ void lcd_buttons_update(void) if (READ(BTN_ENC) == 0) { //button is pressed lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; - if (millis() > lcd_button_blanking_time) - { - lcd_button_blanking_time = millis() + BUTTON_BLANKING_TIME; + if (!buttonBlanking.running() || buttonBlanking.expired(BUTTON_BLANKING_TIME)) { + buttonBlanking.start(); if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0)) { longPressTimer.start(); @@ -786,7 +785,7 @@ void lcd_buttons_update(void) { //button not pressed if (lcd_button_pressed) { //button was released - lcd_button_blanking_time = millis() + BUTTON_BLANKING_TIME; + buttonBlanking.start(); if (lcd_long_press_active == 0) { //button released before long press gets activated newbutton |= EN_C; From 565a6db3e499bff1274d95c74b5c770e7c7e3948 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 22 Jul 2018 16:26:12 +0200 Subject: [PATCH 2/3] use timer class --- Firmware/cardreader.cpp | 2 +- Firmware/lcd.cpp | 7 ++--- Firmware/lcd.h | 4 ++- Firmware/ultralcd.cpp | 66 ++++++++++++++++++++++++++--------------- Firmware/ultralcd.h | 1 + 5 files changed, 50 insertions(+), 30 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 06a47a744..e59b964cb 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -979,7 +979,7 @@ void CardReader::presort() { #endif lcd_update(2); KEEPALIVE_STATE(NOT_BUSY); - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); } void CardReader::flush_presort() { diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index e78b855bb..06755d7bb 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -662,7 +662,7 @@ int8_t lcd_encoder_diff = 0; uint8_t lcd_buttons = 0; uint8_t lcd_button_pressed = 0; uint8_t lcd_update_enabled = 1; -uint32_t lcd_timeoutToStatus = 0; +LongTimer lcd_timeoutToStatus; uint32_t lcd_next_update_millis = 0; uint8_t lcd_status_update_delay = 0; @@ -712,7 +712,6 @@ void lcd_quick_feedback(void) - void lcd_update(uint8_t lcdDrawUpdateOverride) { if (lcd_draw_update < lcdDrawUpdateOverride) @@ -735,7 +734,7 @@ void lcd_update_enable(uint8_t enabled) lcd_encoder_diff = 0; // Enabling the normal LCD update procedure. // Reset the timeout interval. - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); // Force the keypad update now. lcd_next_update_millis = millis() - 1; // Full update. @@ -762,7 +761,7 @@ void lcd_buttons_update(void) { //if we are in non-modal mode, long press can be used and short press triggers with button release if (READ(BTN_ENC) == 0) { //button is pressed - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); if (!buttonBlanking.running() || buttonBlanking.expired(BUTTON_BLANKING_TIME)) { buttonBlanking.start(); if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0)) diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 4cbac4b85..573205d71 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -80,7 +80,9 @@ extern void lcd_print(double, int = 2); #define LCD_UPDATE_INTERVAL 100 -#define LCD_TIMEOUT_TO_STATUS 30000 +#define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action. +#define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms. + typedef void (*lcd_longpress_func_t)(void); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index ff44205b6..313599086 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8,7 +8,6 @@ #include "stepper.h" #include "ConfigurationStore.h" #include -#include "Timer.h" #include "lcd.h" @@ -176,7 +175,7 @@ bool printer_connected = true; unsigned long display_time; //just timer for showing pid finished message on lcd; float pid_temp = DEFAULT_PID_TEMP; - +static bool forceMenuExpire = false; bool menuExiting = false; @@ -1186,7 +1185,7 @@ void lcd_commands() float extr = count_e(0.2, width, length); float extr_short_segment = count_e(0.2, width, width); - if (lcd_commands_step>1) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen + if (lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen if (lcd_commands_step == 0) { lcd_commands_step = 10; @@ -1212,7 +1211,7 @@ void lcd_commands() } if (lcd_commands_step == 9 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 Z0.250 F7200.000")); enquecommand_P(PSTR("G1 X50.0 E80.0 F1000.0")); enquecommand_P(PSTR("G1 X160.0 E20.0 F1000.0")); @@ -1236,7 +1235,7 @@ void lcd_commands() } if (lcd_commands_step == 8 && !blocks_queued() && cmd_buffer_empty()) //draw meander { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 X50 Y155")); @@ -1261,7 +1260,7 @@ void lcd_commands() if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); strcpy(cmd1, "G1 X50 Y35 E"); strcat(cmd1, ftostr43(extr)); enquecommand(cmd1); @@ -1294,7 +1293,7 @@ void lcd_commands() if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 4; i < 8; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1323,7 +1322,7 @@ void lcd_commands() if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 8; i < 12; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1352,7 +1351,7 @@ void lcd_commands() if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 12; i < 16; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1381,7 +1380,7 @@ void lcd_commands() if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 E-0.07500 F2100.00000")); enquecommand_P(PSTR("G4 S0")); enquecommand_P(PSTR("G1 E-4 F2100.00000")); @@ -1404,7 +1403,7 @@ void lcd_commands() } if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("G1 X0 Y1 E3.0000")); enquecommand_P(PSTR("G1 X50 Y1 E-5.0000")); @@ -1450,7 +1449,7 @@ void lcd_commands() float length = 20 - width; float extr = count_e(0.2, width, length); float extr_short_segment = count_e(0.2, width, width); - if(lcd_commands_step>1) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen + if(lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen if (lcd_commands_step == 0) { lcd_commands_step = 9; @@ -1490,7 +1489,7 @@ void lcd_commands() } if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty()) //draw meander { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); //just opposite direction @@ -1538,7 +1537,7 @@ void lcd_commands() if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 0; i < 4; i++) { strcpy(cmd1, "G1 X70 Y"); @@ -1568,7 +1567,7 @@ void lcd_commands() if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 4; i < 8; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1597,7 +1596,7 @@ void lcd_commands() if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 8; i < 12; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1626,7 +1625,7 @@ void lcd_commands() if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); for (int i = 12; i < 16; i++) { strcpy(cmd1, "G1 X70 Y"); strcat(cmd1, ftostr32(35 - i*width * 2)); @@ -1655,7 +1654,7 @@ void lcd_commands() if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty()) { - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); enquecommand_P(PSTR("M107")); //turn off printer fan #ifdef SNMM_V2 enquecommand_P(PSTR("M702 C")); @@ -1667,7 +1666,7 @@ void lcd_commands() enquecommand_P(PSTR("G1 Z10 F1300.000")); enquecommand_P(PSTR("G1 X10 Y180 F4000")); //home X axis enquecommand_P(PSTR("M84"));// disable motors - lcd_timeoutToStatus = millis() - 1; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen + forceMenuExpire = true; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen lcd_commands_step = 1; } if (lcd_commands_step == 1 && !blocks_queued() && cmd_buffer_empty()) @@ -4145,7 +4144,7 @@ void menu_setlang(unsigned char lang) lcd_update_enable(true); lcd_clear(); menu_goto(lcd_language_menu, 0, true, true); - lcd_timeoutToStatus = -1; //infinite timeout + lcd_timeoutToStatus.stop(); //infinite timeout lcd_draw_update = 2; } } @@ -4380,7 +4379,7 @@ void lcd_language() lcd_update_enable(true); lcd_clear(); menu_goto(lcd_language_menu, 0, true, true); - lcd_timeoutToStatus = -1; //infinite timeout + lcd_timeoutToStatus.stop(); //infinite timeout lcd_draw_update = 2; while ((menu_menu != lcd_status_screen) && (!lang_is_selected())) { @@ -7532,6 +7531,25 @@ void menu_lcd_charsetup_func(void) lcd_set_custom_characters_arrows(); } +static inline bool z_menu_expired() +{ + return (currentMenu == lcd_babystep_z + && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z)); +} +static inline bool other_menu_expired() +{ + return (currentMenu != lcd_status_screen + && currentMenu != lcd_babystep_z + && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); +} +static inline bool forced_menu_expire() +{ + bool retval = (currentMenu != lcd_status_screen + && forceMenuExpire); + forceMenuExpire = false; + return retval; +} + void menu_lcd_lcdupdate_func(void) { #if (SDCARDDETECT > 0) @@ -7561,14 +7579,14 @@ void menu_lcd_lcdupdate_func(void) lcd_draw_update = 1; lcd_encoder += lcd_encoder_diff / ENCODER_PULSES_PER_STEP; lcd_encoder_diff = 0; - lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + lcd_timeoutToStatus.start(); } - if (LCD_CLICKED) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + if (LCD_CLICKED) lcd_timeoutToStatus.start(); (*menu_menu)(); - if (lcd_timeoutToStatus < millis() && menu_menu != lcd_status_screen) + if (z_menu_expired() || other_menu_expired() || forced_menu_expire()) { // Exiting a menu. Let's call the menu function the last time with menuExiting flag set to true // to give it a chance to save its state. diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 358c8c37c..5cd56e355 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -4,6 +4,7 @@ #include "Marlin.h" #include "lcd.h" #include "conv2str.h" +#include "Timer.h" extern int lcd_puts_P(const char* str); extern int lcd_printf_P(const char* format, ...); From efd03b426f66d57f5ab19b48c6d2689802facc94 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 23 Jul 2018 09:14:22 +0200 Subject: [PATCH 3/3] final edits to fit changes on upstream --- Firmware/lcd.cpp | 2 +- Firmware/lcd.h | 3 ++- Firmware/ultralcd.cpp | 10 +++++----- Firmware/ultralcd.h | 2 -- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 06755d7bb..6f45b4a70 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -662,7 +662,6 @@ int8_t lcd_encoder_diff = 0; uint8_t lcd_buttons = 0; uint8_t lcd_button_pressed = 0; uint8_t lcd_update_enabled = 1; -LongTimer lcd_timeoutToStatus; uint32_t lcd_next_update_millis = 0; uint8_t lcd_status_update_delay = 0; @@ -677,6 +676,7 @@ lcd_lcdupdate_func_t lcd_lcdupdate_func = 0; static ShortTimer buttonBlanking; ShortTimer longPressTimer; +LongTimer lcd_timeoutToStatus; uint8_t lcd_clicked(void) diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 573205d71..27ebfed6d 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -4,6 +4,7 @@ #include #include +#include "Timer.h" @@ -108,7 +109,7 @@ extern uint8_t lcd_button_pressed; extern uint8_t lcd_update_enabled; -extern uint32_t lcd_timeoutToStatus; +extern LongTimer lcd_timeoutToStatus; extern uint32_t lcd_next_update_millis; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 313599086..220008478 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2840,7 +2840,7 @@ static void _lcd_babystep(int axis, const char *msg) //SERIAL_ECHO("Z baby step: "); //SERIAL_ECHO(menuData.babyStep.babystepMem[2]); // Wait 90 seconds before closing the live adjust dialog. - lcd_timeoutToStatus = millis() + 90000; + lcd_timeoutToStatus.start(); } if (lcd_encoder != 0) @@ -7533,18 +7533,18 @@ void menu_lcd_charsetup_func(void) static inline bool z_menu_expired() { - return (currentMenu == lcd_babystep_z + return (menu_menu == lcd_babystep_z && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z)); } static inline bool other_menu_expired() { - return (currentMenu != lcd_status_screen - && currentMenu != lcd_babystep_z + return (menu_menu != lcd_status_screen + && menu_menu != lcd_babystep_z && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); } static inline bool forced_menu_expire() { - bool retval = (currentMenu != lcd_status_screen + bool retval = (menu_menu != lcd_status_screen && forceMenuExpire); forceMenuExpire = false; return retval; diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 5cd56e355..bb6be3489 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -4,7 +4,6 @@ #include "Marlin.h" #include "lcd.h" #include "conv2str.h" -#include "Timer.h" extern int lcd_puts_P(const char* str); extern int lcd_printf_P(const char* format, ...); @@ -104,7 +103,6 @@ extern void menu_lcd_lcdupdate_func(void); #define LCD_COMMAND_PID_EXTRUDER 7 #define LCD_COMMAND_V2_CAL 8 - extern unsigned long lcd_timeoutToStatus; extern int lcd_commands_type; extern uint8_t farm_mode;