2019-10-11 16:06:37 +00:00
|
|
|
//backlight.cpp
|
|
|
|
|
|
|
|
#include "backlight.h"
|
2020-09-11 13:12:49 +00:00
|
|
|
#include "macros.h"
|
2019-10-11 16:06:37 +00:00
|
|
|
#include <avr/eeprom.h>
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include "eeprom.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-30 19:11:19 +00:00
|
|
|
#define BL_FLASH_DELAY_MS 25
|
|
|
|
|
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-31 17:07:20 +00:00
|
|
|
static void backlightTimer_reset() //used for resetting the timer and waking the display. Triggered on user interactions.
|
|
|
|
{
|
|
|
|
if (!backlightSupport) return;
|
|
|
|
backlightTimer.start();
|
|
|
|
backlight_update();
|
|
|
|
}
|
|
|
|
|
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-30 19:11:19 +00:00
|
|
|
void backlight_wake(const uint8_t flashNo)
|
|
|
|
{
|
|
|
|
if (!backlightSupport) return;
|
|
|
|
|
|
|
|
if (flashNo)
|
|
|
|
{
|
|
|
|
uint8_t backlightMode_bck = backlightMode;
|
|
|
|
for (uint8_t i = 0; i < (((backlightMode_bck == BACKLIGHT_MODE_AUTO) && !backlightTimer.running()) + (flashNo * 2)); i++)
|
|
|
|
{
|
|
|
|
backlightMode = !backlightMode; //toggles between BACKLIGHT_MODE_BRIGHT and BACKLIGHT_MODE_DIM
|
|
|
|
backlight_update();
|
|
|
|
_delay(BL_FLASH_DELAY_MS);
|
|
|
|
}
|
|
|
|
backlightMode = backlightMode_bck;
|
|
|
|
}
|
|
|
|
backlightTimer_reset();
|
|
|
|
}
|
|
|
|
|
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-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();
|
2019-10-11 16:06:37 +00:00
|
|
|
}
|
2019-10-11 16:23:38 +00:00
|
|
|
|
2019-10-31 17:07:20 +00:00
|
|
|
#else //LCD_BL_PIN
|
|
|
|
|
2020-09-11 17:04:06 +00:00
|
|
|
void force_bl_on(bool) {}
|
2019-10-31 17:07:20 +00:00
|
|
|
void backlight_update() {}
|
|
|
|
void backlight_init() {}
|
|
|
|
void backlight_save() {}
|
2020-09-11 17:04:06 +00:00
|
|
|
void backlight_wake(const uint8_t) {}
|
2019-10-31 17:07:20 +00:00
|
|
|
|
2020-09-15 12:56:41 +00:00
|
|
|
#endif //LCD_BL_PIN
|