Backlight overhaul and UI changes

This commit is contained in:
leptun 2019-10-17 13:11:32 +03:00
parent 3b005ae38f
commit 25e0d23efe
4 changed files with 80 additions and 33 deletions

View File

@ -8,49 +8,41 @@
#include "pins.h" #include "pins.h"
#include "fastio.h" #include "fastio.h"
#include "Timer.h" #include "Timer.h"
// #include "Configuration.h"
#ifdef LCD_BL_PIN #ifdef LCD_BL_PIN
bool backlightSupport = 0; bool backlightSupport = 0; //only if it's true will any of the settings be visible to the user
int16_t backlightLevel = 0; int16_t backlightLevel_HIGH = 0;
int16_t backlightLevel_old = 0; int16_t backlightLevel_LOW = 0;
uint8_t backlightMode = BACKLIGHT_MODE_BRIGHT;
unsigned long backlightTimer_period = 10000ul; unsigned long backlightTimer_period = 10000ul;
bool backlightIsDimmed = true;
LongTimer backlightTimer; LongTimer backlightTimer;
static void backlightDim() void backlight_save() //saves all backlight data to eeprom.
{ {
// if (backlightIsDimmed) return; eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH, (uint8_t)backlightLevel_HIGH);
backlightLevel /= 4; //make the display dimmer. eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_LOW, (uint8_t)backlightLevel_LOW);
backlightIsDimmed = true; eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_MODE, backlightMode);
} }
static void backlightWake() 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 (!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
{ {
if (!backlightSupport) return;
backlightTimer.start(); backlightTimer.start();
if (backlightIsDimmed) backlightWake();
} }
void backlight_update() void backlight_update()
{ {
if (!backlightSupport) return; 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); if (backlightTimer.expired(backlightTimer_period)) analogWrite(LCD_BL_PIN, backlightLevel_LOW);
backlightLevel_old = backlightLevel; else if (backlightTimer.running()) analogWrite(LCD_BL_PIN, backlightLevel_HIGH);
else {/*do nothing*/;} //display is dimmed.
if (!backlightIsDimmed) eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL, backlightLevel); //update eeprom value
} }
else if (backlightMode == BACKLIGHT_MODE_DIM) analogWrite(LCD_BL_PIN, backlightLevel_LOW);
else analogWrite(LCD_BL_PIN, backlightLevel_HIGH);
} }
void backlight_init() void backlight_init()
@ -60,13 +52,23 @@ void backlight_init()
WRITE(LCD_BL_PIN,HIGH); WRITE(LCD_BL_PIN,HIGH);
_delay(10); _delay(10);
backlightSupport = !READ(LCD_BL_PIN); 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); SET_OUTPUT(LCD_BL_PIN);
WRITE(LCD_BL_PIN,0); backlightTimer_reset();
backlightTimer_reset(); //initializes eeprom data and starts backlightTimer backlight_update(); //sets brightness
backlight_update(); //actually sets the backlight to the correct level
} }
#endif //LCD_BL_PIN #endif //LCD_BL_PIN

View File

@ -4,12 +4,22 @@
#include <inttypes.h> #include <inttypes.h>
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 bool backlightSupport;
extern void backlight_update(); extern void backlight_update();
extern void backlight_init(); extern void backlight_init();
extern void backlightTimer_reset(); extern void backlightTimer_reset();
extern void backlight_save();
#endif //_BACKLIGHT_H #endif //_BACKLIGHT_H

View File

@ -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 #define EEPROM_SHEETS_BASE (EEPROM_CHECK_GCODE - EEPROM_SHEETS_SIZEOF) // Sheets
static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE); 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. //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 !!!!! // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
// !!!!! // !!!!!

View File

@ -56,6 +56,7 @@ char longFilenameOLD[LONG_FILENAME_LENGTH];
static void lcd_sd_updir(); static void lcd_sd_updir();
static void lcd_mesh_bed_leveling_settings(); static void lcd_mesh_bed_leveling_settings();
static void lcd_backlight_menu();
int8_t ReInitLCD = 0; int8_t ReInitLCD = 0;
@ -5776,7 +5777,7 @@ static void lcd_settings_menu()
#ifdef LCD_BL_PIN #ifdef LCD_BL_PIN
if (backlightSupport) 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 #endif //LCD_BL_PIN
@ -7165,6 +7166,38 @@ static void lcd_mesh_bed_leveling_settings()
//SETTINGS_MBL_MODE; //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() static void lcd_control_temperature_menu()
{ {
#ifdef PIDTEMP #ifdef PIDTEMP