From 25e0d23efe56ea7de0039e32e0c64434d158a98b Mon Sep 17 00:00:00 2001 From: leptun Date: Thu, 17 Oct 2019 13:11:32 +0300 Subject: [PATCH] Backlight overhaul and UI changes --- Firmware/backlight.cpp | 60 ++++++++++++++++++++++-------------------- Firmware/backlight.h | 12 ++++++++- Firmware/eeprom.h | 6 +++-- Firmware/ultralcd.cpp | 35 +++++++++++++++++++++++- 4 files changed, 80 insertions(+), 33 deletions(-) diff --git a/Firmware/backlight.cpp b/Firmware/backlight.cpp index 72850d2c..59f08b6f 100644 --- a/Firmware/backlight.cpp +++ b/Firmware/backlight.cpp @@ -8,49 +8,41 @@ #include "pins.h" #include "fastio.h" #include "Timer.h" -// #include "Configuration.h" #ifdef LCD_BL_PIN -bool backlightSupport = 0; -int16_t backlightLevel = 0; -int16_t backlightLevel_old = 0; +bool backlightSupport = 0; //only if it's true will any of the settings be visible to the user +int16_t backlightLevel_HIGH = 0; +int16_t backlightLevel_LOW = 0; +uint8_t backlightMode = BACKLIGHT_MODE_BRIGHT; unsigned long backlightTimer_period = 10000ul; -bool backlightIsDimmed = true; LongTimer backlightTimer; -static void backlightDim() +void backlight_save() //saves all backlight data to eeprom. { - // if (backlightIsDimmed) return; - backlightLevel /= 4; //make the display dimmer. - backlightIsDimmed = true; + eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH, (uint8_t)backlightLevel_HIGH); + eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_LOW, (uint8_t)backlightLevel_LOW); + eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_MODE, backlightMode); } -static void backlightWake() -{ - // if (!backlightIsDimmed) return; - backlightLevel = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL); - backlightIsDimmed = false; -} - -void backlightTimer_reset() //used for resetting the timer and waking the display +void backlightTimer_reset() //used for resetting the timer and waking the display. Triggered on events such as knob click, rotate and on full screen notifications. { + if (!backlightSupport) return; backlightTimer.start(); - if (backlightIsDimmed) backlightWake(); } void backlight_update() { if (!backlightSupport) return; - if (backlightTimer.expired(backlightTimer_period)) backlightDim(); - if (backlightLevel != backlightLevel_old) //update pwm duty cycle + if (backlightMode == BACKLIGHT_MODE_AUTO) { - analogWrite(LCD_BL_PIN, backlightLevel); - backlightLevel_old = backlightLevel; - - if (!backlightIsDimmed) eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL, backlightLevel); //update eeprom value + if (backlightTimer.expired(backlightTimer_period)) analogWrite(LCD_BL_PIN, backlightLevel_LOW); + else if (backlightTimer.running()) analogWrite(LCD_BL_PIN, backlightLevel_HIGH); + else {/*do nothing*/;} //display is dimmed. } + else if (backlightMode == BACKLIGHT_MODE_DIM) analogWrite(LCD_BL_PIN, backlightLevel_LOW); + else analogWrite(LCD_BL_PIN, backlightLevel_HIGH); } void backlight_init() @@ -60,13 +52,23 @@ void backlight_init() WRITE(LCD_BL_PIN,HIGH); _delay(10); backlightSupport = !READ(LCD_BL_PIN); - if (backlightSupport == 0) return; + if (!backlightSupport) return; -//initialize backlight pin +//initialize backlight + backlightMode = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_MODE); + if (backlightMode == 0xFF) //set default values + { + backlightMode = BACKLIGHT_MODE_AUTO; + backlightLevel_HIGH = 130; + backlightLevel_LOW = 50; + backlight_save(); + } + backlightLevel_HIGH = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH); + backlightLevel_LOW = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_LOW); + SET_OUTPUT(LCD_BL_PIN); - WRITE(LCD_BL_PIN,0); - backlightTimer_reset(); //initializes eeprom data and starts backlightTimer - backlight_update(); //actually sets the backlight to the correct level + backlightTimer_reset(); + backlight_update(); //sets brightness } #endif //LCD_BL_PIN \ No newline at end of file diff --git a/Firmware/backlight.h b/Firmware/backlight.h index 84a2a17e..f3e2ee60 100644 --- a/Firmware/backlight.h +++ b/Firmware/backlight.h @@ -4,12 +4,22 @@ #include -extern int16_t backlightLevel; +enum Backlight_Mode +{ + BACKLIGHT_MODE_BRIGHT = 0, + BACKLIGHT_MODE_DIM = 1, + BACKLIGHT_MODE_AUTO = 2, +}; + +extern int16_t backlightLevel_HIGH; +extern int16_t backlightLevel_LOW; +extern uint8_t backlightMode; extern bool backlightSupport; extern void backlight_update(); extern void backlight_init(); extern void backlightTimer_reset(); +extern void backlight_save(); #endif //_BACKLIGHT_H diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index a8bab523..f47a2333 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -201,10 +201,12 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #define EEPROM_SHEETS_BASE (EEPROM_CHECK_GCODE - EEPROM_SHEETS_SIZEOF) // Sheets static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE); -#define EEPROM_BACKLIGHT_LEVEL (EEPROM_SHEETS_BASE-1) // uint8 +#define EEPROM_BACKLIGHT_LEVEL_HIGH (EEPROM_SHEETS_BASE-1) // uint8 +#define EEPROM_BACKLIGHT_LEVEL_LOW (EEPROM_BACKLIGHT_LEVEL_HIGH-1) // uint8 +#define EEPROM_BACKLIGHT_MODE (EEPROM_BACKLIGHT_LEVEL_LOW-1) // uint8 //This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items. -#define EEPROM_LAST_ITEM EEPROM_BACKLIGHT_LEVEL +#define EEPROM_LAST_ITEM EEPROM_BACKLIGHT_MODE // !!!!! // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!! // !!!!! diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 715719ca..04718cf6 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -56,6 +56,7 @@ char longFilenameOLD[LONG_FILENAME_LENGTH]; static void lcd_sd_updir(); static void lcd_mesh_bed_leveling_settings(); +static void lcd_backlight_menu(); int8_t ReInitLCD = 0; @@ -5776,7 +5777,7 @@ static void lcd_settings_menu() #ifdef LCD_BL_PIN if (backlightSupport) { - MENU_ITEM_EDIT_int3_P(_i("Backlight"), &backlightLevel, 0, 255); + MENU_ITEM_SUBMENU_P(_i("Brightness"), lcd_backlight_menu); } #endif //LCD_BL_PIN @@ -7165,6 +7166,38 @@ static void lcd_mesh_bed_leveling_settings() //SETTINGS_MBL_MODE; } +static void backlight_mode_toggle() +{ + switch (backlightMode) + { + case BACKLIGHT_MODE_BRIGHT: backlightMode = BACKLIGHT_MODE_DIM; break; + case BACKLIGHT_MODE_DIM: backlightMode = BACKLIGHT_MODE_AUTO; break; + case BACKLIGHT_MODE_AUTO: backlightMode = BACKLIGHT_MODE_BRIGHT; break; + default: backlightMode = BACKLIGHT_MODE_BRIGHT; break; + } + backlight_save(); +} + +static void lcd_backlight_menu() +{ + MENU_BEGIN(); + ON_MENU_LEAVE( + backlight_save(); + ); + + MENU_ITEM_BACK_P(_T(MSG_BACK)); + MENU_ITEM_EDIT_int3_P(_i("Level Bright"), &backlightLevel_HIGH, 0, 255); + MENU_ITEM_EDIT_int3_P(_i("Level Dimmed"), &backlightLevel_LOW, 0, 255); + switch (backlightMode) + { + case BACKLIGHT_MODE_BRIGHT: MENU_ITEM_FUNCTION_P(_i("Mode [Always on]"), backlight_mode_toggle); break; + case BACKLIGHT_MODE_DIM: MENU_ITEM_FUNCTION_P(_i("Mode [Always off]"), backlight_mode_toggle); break; + default: MENU_ITEM_FUNCTION_P(_i("Mode [Auto]"), backlight_mode_toggle); break; + } + + MENU_END(); +} + static void lcd_control_temperature_menu() { #ifdef PIDTEMP