From 4a4f410303c72b9971d37990f1bc7b824979a829 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Tue, 27 Apr 2021 01:19:17 +0200 Subject: [PATCH] Add dispatch_idle and rename dispatch_current_page --- src/hasp/hasp.cpp | 20 ++++++++-- src/hasp/hasp.h | 1 + src/hasp/hasp_dispatch.cpp | 82 ++++++++++++++------------------------ src/hasp/hasp_dispatch.h | 7 ++-- src/hasp/hasp_event.cpp | 4 +- src/hasp_debug.cpp | 2 +- 6 files changed, 56 insertions(+), 60 deletions(-) diff --git a/src/hasp/hasp.cpp b/src/hasp/hasp.cpp index 4035ed6c..fee77acc 100644 --- a/src/hasp/hasp.cpp +++ b/src/hasp/hasp.cpp @@ -116,24 +116,38 @@ bool hasp_update_sleep_state() if(sleepTimeLong > 0 && idle >= (sleepTimeShort + sleepTimeLong) * 1000U) { if(hasp_sleep_state != HASP_SLEEP_LONG) { - dispatch_output_idle_state(HASP_SLEEP_LONG); hasp_sleep_state = HASP_SLEEP_LONG; + dispatch_idle(NULL, NULL); } } else if(sleepTimeShort > 0 && idle >= sleepTimeShort * 1000U) { if(hasp_sleep_state != HASP_SLEEP_SHORT) { - dispatch_output_idle_state(HASP_SLEEP_SHORT); hasp_sleep_state = HASP_SLEEP_SHORT; + dispatch_idle(NULL, NULL); } } else { if(hasp_sleep_state != HASP_SLEEP_OFF) { - dispatch_output_idle_state(HASP_SLEEP_OFF); hasp_sleep_state = HASP_SLEEP_OFF; + dispatch_idle(NULL, NULL); } } return (hasp_sleep_state != HASP_SLEEP_OFF); } +void hasp_get_sleep_state(char* payload) +{ + switch(hasp_sleep_state) { + case HASP_SLEEP_LONG: + memcpy_P(payload, PSTR("long"), 5); + break; + case HASP_SLEEP_SHORT: + memcpy_P(payload, PSTR("short"), 6); + break; + default: + memcpy_P(payload, PSTR("off"), 4); + } +} + void hasp_enable_wakeup_touch() { lv_obj_set_click(lv_disp_get_layer_sys(NULL), true); // enable first touch diff --git a/src/hasp/hasp.h b/src/hasp/hasp.h index 76b57448..f190ed59 100644 --- a/src/hasp/hasp.h +++ b/src/hasp/hasp.h @@ -68,6 +68,7 @@ bool haspSetConfig(const JsonObject& settings); lv_font_t* hasp_get_font(uint8_t fontid); bool hasp_update_sleep_state(); +void hasp_get_sleep_state(char* payload); void hasp_get_sleep_time(uint16_t& short_time, uint16_t& long_time); void hasp_set_sleep_time(uint16_t short_time, uint16_t long_time); void hasp_enable_wakeup_touch(); diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index c4058e35..e5cf173b 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -38,13 +38,11 @@ #include "hasp_config.h" #endif -extern uint8_t hasp_sleep_state; - dispatch_conf_t dispatch_setings = {.teleperiod = 300}; uint32_t dispatchLastMillis = -3000000; // force discovery uint8_t nCommands = 0; -haspCommand_t commands[18]; +haspCommand_t commands[19]; struct moodlight_t { @@ -217,10 +215,8 @@ static void dispatch_gpio(const char* topic, const char* payload) pin = atoi(topic); if(strlen(payload) > 0) { - if(1) - val = atoi(payload); - else - val = Parser::is_true(payload); + val = atoi(payload); + if(val == 0) val = Parser::is_true(payload); gpio_set_value(pin, val); } else { @@ -238,6 +234,8 @@ void dispatch_command(const char* topic, const char* payload) { /* ================================= Standard payload commands ======================================= */ + if(dispatch_parse_button_attribute(topic, payload)) return; // matched pxby.attr + // check and execute commands from commands array for(int i = 0; i < nCommands; i++) { if(!strcasecmp_P(topic, commands[i].p_cmdstr)) { @@ -256,8 +254,6 @@ void dispatch_command(const char* topic, const char* payload) // } else if(strcasecmp_P(topic, PSTR("screenshot")) == 0) { // guiTakeScreenshot("/screenshot.bmp"); // Literal String - } else if((topic[0] == 'p' || topic[0] == 'P') && dispatch_parse_button_attribute(topic, payload)) { - return; // matched pxby.attr #if HASP_USE_CONFIG > 0 @@ -293,8 +289,6 @@ void dispatch_command(const char* topic, const char* payload) // Strip command/config prefix from the topic and process the payload void dispatch_topic_payload(const char* topic, const char* payload) { - // LOG_VERBOSE(TAG_MSGR,F("TOPIC: short topic: %s"), topic); - if(!strcmp_P(topic, PSTR("command"))) { dispatch_text_line((char*)payload); return; @@ -307,7 +301,7 @@ void dispatch_topic_payload(const char* topic, const char* payload) } #if HASP_USE_CONFIG > 0 - if(topic == strstr_P(topic, PSTR("config/"))) { // startsWith command/ + if(topic == strstr_P(topic, PSTR("config/"))) { // startsWith config/ topic += 7u; dispatch_config(topic, (char*)payload); return; @@ -354,31 +348,6 @@ void dispatch_text_line(const char* cmnd) } } -void dispatch_get_idle_state(uint8_t state, char* payload) -{ - switch(state) { - case HASP_SLEEP_LONG: - memcpy_P(payload, PSTR("long"), 5); - break; - case HASP_SLEEP_SHORT: - memcpy_P(payload, PSTR("short"), 6); - break; - default: - memcpy_P(payload, PSTR("off"), 4); - } -} - -// send idle state to the client -void dispatch_output_idle_state(uint8_t state) -{ - char topic[6]; - char payload[6]; - memcpy_P(topic, PSTR("idle"), 5); - - dispatch_get_idle_state(state, payload); - dispatch_state_subtopic(topic, payload); -} - // void dispatch_output_group_state(uint8_t groupid, uint16_t state) // { // char payload[64]; @@ -652,7 +621,7 @@ void dispatch_parse_jsonl(const char*, const char* payload) #endif } -void dispatch_output_current_page() +void dispatch_current_page() { char topic[8]; char payload[8]; @@ -666,19 +635,19 @@ void dispatch_output_current_page() void dispatch_page_next(lv_scr_load_anim_t animation) { haspPages.next(animation); - dispatch_output_current_page(); + dispatch_current_page(); } void dispatch_page_prev(lv_scr_load_anim_t animation) { haspPages.prev(animation); - dispatch_output_current_page(); + dispatch_current_page(); } void dispatch_page_back(lv_scr_load_anim_t animation) { haspPages.back(animation); - dispatch_output_current_page(); + dispatch_current_page(); } void dispatch_set_page(uint8_t pageid) @@ -689,13 +658,13 @@ void dispatch_set_page(uint8_t pageid) void dispatch_set_page(uint8_t pageid, lv_scr_load_anim_t animation) { haspPages.set(pageid, animation); - dispatch_output_current_page(); + dispatch_current_page(); } void dispatch_page(const char*, const char* page) { if(strlen(page) == 0) { - dispatch_output_current_page(); // No payload, send current page + dispatch_current_page(); // No payload, send current page return; } @@ -867,9 +836,9 @@ void dispatch_reboot(bool saveConfig) void dispatch_current_state() { - dispatch_output_statusupdate(NULL, NULL); - dispatch_output_idle_state(hasp_sleep_state); - dispatch_output_current_page(); + dispatch_statusupdate(NULL, NULL); + dispatch_idle(NULL, NULL); + dispatch_current_page(); } /******************************************* Command Wrapper Functions *********************************/ @@ -917,7 +886,7 @@ void dispatch_send_discovery(const char*, const char*) } // Periodically publish a JSON string indicating system status -void dispatch_output_statusupdate(const char*, const char*) +void dispatch_statusupdate(const char*, const char*) { #if HASP_USE_MQTT > 0 @@ -926,8 +895,8 @@ void dispatch_output_statusupdate(const char*, const char*) { char buffer[128]; + hasp_get_sleep_state(topic); haspGetVersion(buffer, sizeof(buffer)); - dispatch_get_idle_state(hasp_sleep_state, topic); snprintf_P(data, sizeof(data), PSTR("{\"node\":\"%s\",\"idle\":\"%s\",\"version\":\"%s\",\"uptime\":%lu,"), haspDevice.get_hostname(), topic, buffer, long(millis() / 1000)); // \"status\":\"available\", @@ -987,6 +956,16 @@ void dispatch_sleep(const char*, const char*) hasp_enable_wakeup_touch(); } +void dispatch_idle(const char*, const char*) +{ + char topic[6]; + char payload[6]; + memcpy_P(topic, PSTR("idle"), 5); + + hasp_get_sleep_state(payload); + dispatch_state_subtopic(topic, payload); +} + void dispatch_reboot(const char*, const char*) { dispatch_reboot(true); @@ -1024,10 +1003,11 @@ void dispatchSetup() dispatch_add_command(PSTR("page"), dispatch_page); dispatch_add_command(PSTR("wakeup"), dispatch_wakeup); dispatch_add_command(PSTR("sleep"), dispatch_sleep); - dispatch_add_command(PSTR("statusupdate"), dispatch_output_statusupdate); + dispatch_add_command(PSTR("statusupdate"), dispatch_statusupdate); dispatch_add_command(PSTR("clearpage"), dispatch_clear_page); dispatch_add_command(PSTR("jsonl"), dispatch_parse_jsonl); dispatch_add_command(PSTR("dim"), dispatch_dim); + dispatch_add_command(PSTR("idle"), dispatch_idle); dispatch_add_command(PSTR("brightness"), dispatch_dim); dispatch_add_command(PSTR("light"), dispatch_backlight); dispatch_add_command(PSTR("moodlight"), dispatch_moodlight); @@ -1053,7 +1033,7 @@ void dispatchEverySecond() { if(dispatch_setings.teleperiod > 0 && (millis() - dispatchLastMillis) >= dispatch_setings.teleperiod * 1000) { dispatchLastMillis += dispatch_setings.teleperiod * 1000; - dispatch_output_statusupdate(NULL, NULL); + dispatch_statusupdate(NULL, NULL); dispatch_send_discovery(NULL, NULL); } } @@ -1068,7 +1048,7 @@ void everySecond() if(elapsed.count() >= dispatch_setings.teleperiod) { std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); - dispatch_output_statusupdate(NULL, NULL); + dispatch_statusupdate(NULL, NULL); } } } diff --git a/src/hasp/hasp_dispatch.h b/src/hasp/hasp_dispatch.h index 21f634b9..5fbe8bdf 100644 --- a/src/hasp/hasp_dispatch.h +++ b/src/hasp/hasp_dispatch.h @@ -58,10 +58,11 @@ void dispatch_backlight(const char*, const char* payload); void dispatch_web_update(const char*, const char* espOtaUrl); void dispatch_reboot(bool saveConfig); -void dispatch_output_idle_state(uint8_t state); -void dispatch_output_statusupdate(const char*, const char*); +void dispatch_statusupdate(const char*, const char*); +void dispatch_idle(const char*, const char*); + void dispatch_current_state(); -void dispatch_output_current_page(); +void dispatch_current_page(); void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid); diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index 5524e353..3461010e 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -250,7 +250,7 @@ void swipe_event_handler(lv_obj_t* obj, lv_event_t event) default: return; } - dispatch_output_current_page(); + dispatch_current_page(); } } @@ -336,7 +336,7 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event) default: haspPages.set(obj->user_data.actionid, transitionid); } - dispatch_output_current_page(); + dispatch_current_page(); } } else { char data[40]; diff --git a/src/hasp_debug.cpp b/src/hasp_debug.cpp index 2d2be888..ad8d8c5f 100644 --- a/src/hasp_debug.cpp +++ b/src/hasp_debug.cpp @@ -104,7 +104,7 @@ static inline void debug_flush() void debugEverySecond() { // if(debugTelePeriod > 0 && (millis() - debugLastMillis) >= debugTelePeriod * 1000) { - // dispatch_output_statusupdate(NULL, NULL); + // dispatch_statusupdate(NULL, NULL); // debugLastMillis = millis(); // } // printLocalTime();