2019-10-11 16:06:37 +00:00
//backlight.cpp
# include "backlight.h"
# include <avr/eeprom.h>
# include <Arduino.h>
# include "eeprom.h"
# include "Marlin.h"
# include "pins.h"
# include "fastio.h"
2019-10-13 11:31:43 +00:00
# include "Timer.h"
2019-10-11 16:06:37 +00:00
2019-10-11 16:23:38 +00:00
# ifdef LCD_BL_PIN
2019-10-17 10:11:32 +00:00
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 ;
2019-10-18 07:32:41 +00:00
int16_t backlightTimer_period = 10 ;
2019-10-13 11:31:43 +00:00
LongTimer backlightTimer ;
2019-10-18 09:18:43 +00:00
void force_bl_on ( bool section_start )
{
if ( section_start )
{
backlightMode = BACKLIGHT_MODE_BRIGHT ;
if ( backlightLevel_HIGH < 30 ) backlightLevel_HIGH = 30 ;
}
else
{
backlightMode = eeprom_read_byte ( ( uint8_t * ) EEPROM_BACKLIGHT_MODE ) ;
backlightLevel_HIGH = eeprom_read_byte ( ( uint8_t * ) EEPROM_BACKLIGHT_LEVEL_HIGH ) ;
}
backlight_update ( ) ;
}
2019-10-17 10:11:32 +00:00
void backlight_save ( ) //saves all backlight data to eeprom.
2019-10-13 11:31:43 +00:00
{
2019-10-17 10:11:32 +00:00
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 ) ;
2019-10-18 07:32:41 +00:00
eeprom_update_word ( ( uint16_t * ) EEPROM_BACKLIGHT_TIMEOUT , backlightTimer_period ) ;
2019-10-13 11:31:43 +00:00
}
2019-10-17 10:11:32 +00:00
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.
2019-10-13 11:31:43 +00:00
{
2019-10-17 10:11:32 +00:00
if ( ! backlightSupport ) return ;
2019-10-13 11:31:43 +00:00
backlightTimer . start ( ) ;
}
2019-10-11 16:06:37 +00:00
void backlight_update ( )
{
2019-10-16 11:40:45 +00:00
if ( ! backlightSupport ) return ;
2019-10-13 11:31:43 +00:00
2019-10-17 10:11:32 +00:00
if ( backlightMode = = BACKLIGHT_MODE_AUTO )
2019-10-11 16:06:37 +00:00
{
2019-10-18 07:32:41 +00:00
if ( backlightTimer . expired ( ( uint32_t ) backlightTimer_period * 1000ul ) ) analogWrite ( LCD_BL_PIN , backlightLevel_LOW ) ;
2019-10-17 10:11:32 +00:00
else if ( backlightTimer . running ( ) ) analogWrite ( LCD_BL_PIN , backlightLevel_HIGH ) ;
else { /*do nothing*/ ; } //display is dimmed.
2019-10-11 16:06:37 +00:00
}
2019-10-17 10:11:32 +00:00
else if ( backlightMode = = BACKLIGHT_MODE_DIM ) analogWrite ( LCD_BL_PIN , backlightLevel_LOW ) ;
else analogWrite ( LCD_BL_PIN , backlightLevel_HIGH ) ;
2019-10-11 16:06:37 +00:00
}
void backlight_init ( )
{
2019-10-16 11:40:45 +00:00
//check for backlight support on lcd
SET_INPUT ( LCD_BL_PIN ) ;
WRITE ( LCD_BL_PIN , HIGH ) ;
_delay ( 10 ) ;
backlightSupport = ! READ ( LCD_BL_PIN ) ;
2019-10-17 10:11:32 +00:00
if ( ! backlightSupport ) return ;
2019-10-16 11:40:45 +00:00
2019-10-17 10:11:32 +00:00
//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 ;
2019-10-18 07:32:41 +00:00
backlightTimer_period = 10 ; //in seconds
2019-10-17 10:11:32 +00:00
backlight_save ( ) ;
}
backlightLevel_HIGH = eeprom_read_byte ( ( uint8_t * ) EEPROM_BACKLIGHT_LEVEL_HIGH ) ;
backlightLevel_LOW = eeprom_read_byte ( ( uint8_t * ) EEPROM_BACKLIGHT_LEVEL_LOW ) ;
2019-10-18 07:32:41 +00:00
backlightTimer_period = eeprom_read_word ( ( uint16_t * ) EEPROM_BACKLIGHT_TIMEOUT ) ;
2019-10-17 10:11:32 +00:00
2019-10-11 16:06:37 +00:00
SET_OUTPUT ( LCD_BL_PIN ) ;
2019-10-17 10:11:32 +00:00
backlightTimer_reset ( ) ;
backlight_update ( ) ; //sets brightness
2019-10-11 16:06:37 +00:00
}
2019-10-11 16:23:38 +00:00
# endif //LCD_BL_PIN