Improve backlight handling and idle can be set to a state

This commit is contained in:
fvanroie 2022-04-06 20:18:23 +02:00
parent 372150b7b6
commit 5ccf73695e
3 changed files with 54 additions and 18 deletions

View File

@ -73,9 +73,10 @@ LV_IMG_DECLARE(img_bubble_pattern)
**********************/ **********************/
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
uint8_t hasp_sleep_state = HASP_SLEEP_OFF; // Used in hasp_drv_touch.cpp uint8_t hasp_sleep_state = HASP_SLEEP_OFF; // Used in hasp_drv_touch.cpp
static uint16_t sleepTimeShort = 60; // 1 second resolution static uint16_t sleepTimeShort = 60; // 1 second resolution
static uint16_t sleepTimeLong = 120; // 1 second resolution static uint16_t sleepTimeLong = 120; // 1 second resolution
static uint32_t sleepTimeOffset = 0; // 1 second resolution
uint8_t haspStartDim = 255; uint8_t haspStartDim = 255;
uint8_t haspStartPage = 1; uint8_t haspStartPage = 1;
@ -109,6 +110,7 @@ lv_font_t* hasp_get_font(uint8_t fontid)
HASP_ATTRIBUTE_FAST_MEM void hasp_update_sleep_state() HASP_ATTRIBUTE_FAST_MEM void hasp_update_sleep_state()
{ {
uint32_t idle = lv_disp_get_inactive_time(lv_disp_get_default()) / 1000; uint32_t idle = lv_disp_get_inactive_time(lv_disp_get_default()) / 1000;
idle += sleepTimeOffset; // To force a specific state
if(sleepTimeLong > 0 && idle >= (sleepTimeShort + sleepTimeLong)) { if(sleepTimeLong > 0 && idle >= (sleepTimeShort + sleepTimeLong)) {
if(hasp_sleep_state != HASP_SLEEP_LONG) { if(hasp_sleep_state != HASP_SLEEP_LONG) {
@ -135,6 +137,20 @@ HASP_ATTRIBUTE_FAST_MEM void hasp_update_sleep_state()
void hasp_set_sleep_state(uint8_t state) void hasp_set_sleep_state(uint8_t state)
{ {
switch(state) {
case HASP_SLEEP_LONG:
sleepTimeOffset = (sleepTimeShort + sleepTimeLong);
break;
case HASP_SLEEP_SHORT:
sleepTimeOffset = sleepTimeShort;
break;
case HASP_SLEEP_OFF:
sleepTimeOffset = 0;
break;
default:
return;
}
lv_disp_trig_activity(NULL);
hasp_sleep_state = state; hasp_sleep_state = state;
} }

View File

@ -31,6 +31,7 @@ extern "C" {
#define HASP_SLEEP_OFF 0 #define HASP_SLEEP_OFF 0
#define HASP_SLEEP_SHORT 1 #define HASP_SLEEP_SHORT 1
#define HASP_SLEEP_LONG 2 #define HASP_SLEEP_LONG 2
#define HASP_SLEEP_LAST 3
/********************** /**********************
* TYPEDEFS * TYPEDEFS

View File

@ -904,7 +904,8 @@ void dispatch_backlight_obsolete(const char* topic, const char* payload, uint8_t
void dispatch_backlight(const char*, const char* payload, uint8_t source) void dispatch_backlight(const char*, const char* payload, uint8_t source)
{ {
bool power = haspDevice.get_backlight_power(); bool power = haspDevice.get_backlight_power();
uint8_t level = haspDevice.get_backlight_level();
// Set the current state // Set the current state
if(strlen(payload) != 0) { if(strlen(payload) != 0) {
@ -917,18 +918,25 @@ void dispatch_backlight(const char*, const char* payload, uint8_t source)
json.shrinkToFit(); json.shrinkToFit();
if(jsonError) { // Couldn't parse incoming payload as json if(jsonError) { // Couldn't parse incoming payload as json
power = Parser::is_true(payload); if(Parser::is_only_digits(payload)) {
uint8_t temp_level = atoi(payload);
if(temp_level <= 1)
power = temp_level == 1;
else
level = temp_level;
} else {
power = Parser::is_true(payload);
}
} else { } else {
// plain numbers are parsed as valid json object // plain numbers are parsed as valid json object
if(json.is<uint8_t>()) { if(json.is<uint8_t>()) {
uint8_t level = json.as<uint8_t>(); uint8_t temp_level = json.as<uint8_t>();
if(temp_level <= 1)
if(level <= 1) power = temp_level == 1;
power = level;
else else
haspDevice.set_backlight_level(level); level = temp_level;
// true and false are parsed as valid json object // true and false are parsed as valid json object
} else if(json.is<bool>()) { } else if(json.is<bool>()) {
@ -939,16 +947,18 @@ void dispatch_backlight(const char*, const char* payload, uint8_t source)
JsonVariant brightness = json[F("brightness")]; JsonVariant brightness = json[F("brightness")];
if(!state.isNull()) power = Parser::is_true(state); if(!state.isNull()) power = Parser::is_true(state);
if(!brightness.isNull()) haspDevice.set_backlight_level(brightness.as<uint8_t>()); if(!brightness.isNull()) level = brightness.as<uint8_t>();
} }
} }
} }
// toggle power and wakeup touch if changed // toggle power and wakeup touch if changed
if(power) haspDevice.set_backlight_level(level); // set level before power on
if(haspDevice.get_backlight_power() != power) { if(haspDevice.get_backlight_power() != power) {
haspDevice.set_backlight_power(power); haspDevice.set_backlight_power(power);
hasp_set_wakeup_touch(!power); hasp_set_wakeup_touch(!power);
} }
if(!power) haspDevice.set_backlight_level(level); // set level after power off
// Return the current state // Return the current state
char topic[10]; char topic[10];
@ -1249,18 +1259,27 @@ void dispatch_sleep(const char*, const char*, uint8_t source)
void dispatch_idle(const char*, const char* payload, uint8_t source) void dispatch_idle(const char*, const char* payload, uint8_t source)
{ {
char topic[6]; char topic[8];
char buffer[6]; char buffer[8];
// idle off command // idle off command
if(payload && strlen(payload) && !Parser::is_true(payload)) { if(payload && strlen(payload)) {
hasp_set_wakeup_touch(false); uint8_t state = HASP_SLEEP_LAST;
hasp_set_sleep_state(HASP_SLEEP_OFF); if(!strcmp_P(payload, "off")) {
lv_disp_trig_activity(NULL); hasp_set_wakeup_touch(false);
state = HASP_SLEEP_OFF;
} else if(!strcmp_P(payload, "short")) {
state = HASP_SLEEP_SHORT;
} else if(!strcmp_P(payload, "long")) {
state = HASP_SLEEP_LONG;
} else {
state = HASP_SLEEP_LAST;
}
hasp_set_sleep_state(state);
} }
// idle state // idle state
memcpy_P(topic, PSTR("idle"), 5); memcpy_P(topic, PSTR("idle"), 8);
hasp_get_sleep_state(buffer); hasp_get_sleep_state(buffer);
dispatch_state_subtopic(topic, buffer); dispatch_state_subtopic(topic, buffer);
} }