From d99e848e194235009bdb68ffc3c4229887252e4d Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Sun, 11 Jul 2021 13:48:04 +0200 Subject: [PATCH] Add service and theme commands for testing purposes --- src/hasp/hasp.cpp | 184 +++++++++++++++++++------------------ src/hasp/hasp.h | 1 + src/hasp/hasp_dispatch.cpp | 84 ++++++++++++++++- 3 files changed, 176 insertions(+), 93 deletions(-) diff --git a/src/hasp/hasp.cpp b/src/hasp/hasp.cpp index 1b31c8b8..d4a173c6 100644 --- a/src/hasp/hasp.cpp +++ b/src/hasp/hasp.cpp @@ -26,6 +26,7 @@ #include "lv_fs_if.h" #include "hasp_gui.h" #include "hasp_config.h" +#include "font/hasp_font_loader.h" //#include "hasp_filesystem.h" included in hasp_conf.h #endif @@ -84,15 +85,15 @@ lv_style_t style_mbox_bg; /*Black bg. style with opacity*/ lv_obj_t* kb; // lv_font_t * defaultFont; -static lv_font_t* haspFonts[4] = {nullptr, nullptr, nullptr, nullptr}; -uint8_t current_page = 1; +static lv_font_t* haspFonts[12] = {nullptr}; +uint8_t current_page = 1; /** * Get Font ID */ lv_font_t* hasp_get_font(uint8_t fontid) { - if(fontid >= 4) { + if(fontid >= sizeof(haspFonts) / sizeof(haspFonts[0])) { return nullptr; } else { return haspFonts[fontid]; @@ -300,6 +301,84 @@ static void custom_font_apply_cb(lv_theme_t* th, lv_obj_t* obj, lv_theme_style_t } */ } +void hasp_set_theme(uint8_t themeid) +{ + lv_theme_t* th = NULL; + lv_color_t color_primary = lv_color_hsv_to_rgb(haspThemeHue, 100, 100); + lv_color_t color_secondary = lv_color_hsv_to_rgb(haspThemeHue, 100, 100); + + /* ********** Theme Initializations ********** */ + if(themeid == 8) themeid = 1; // update old HASP id + if(themeid == 9) themeid = 5; // update old material id + if(themeid < 0 || themeid > 5) return; // check bounds + +#if(LV_USE_THEME_HASP == 1) + uint32_t hasp_flags = LV_THEME_HASP_FLAG_LIGHT; +#endif + +#if(LV_USE_THEME_MATERIAL == 1) + // LV_THEME_MATERIAL_FLAG_NO_TRANSITION : disable transitions(state change animations) + // LV_THEME_MATERIAL_FLAG_NO_FOCUS: disable indication of focused state) + uint32_t material_flags = LV_THEME_MATERIAL_FLAG_LIGHT + LV_THEME_MATERIAL_FLAG_NO_TRANSITION; +#endif + + switch(themeid) { +#if(LV_USE_THEME_EMPTY == 1) + case 0: + th = lv_theme_empty_init(lv_color_hsv_to_rgb(haspThemeHue, 100, 100), + lv_color_hsv_to_rgb(haspThemeHue, 100, 100), LV_THEME_DEFAULT_FLAGS, haspFonts[0], + haspFonts[1], haspFonts[2], haspFonts[3]); + break; +#endif + +#if(LV_USE_THEME_HASP == 1) + case 2: // Dark + hasp_flags = LV_THEME_HASP_FLAG_DARK; + case 1: // Light + case 8: // Light (old id) + th = lv_theme_hasp_init(color_primary, color_secondary, hasp_flags + LV_THEME_HASP_FLAG_NO_FOCUS, + haspFonts[0], haspFonts[1], haspFonts[2], haspFonts[3]); + break; +#endif + +#if(LV_USE_THEME_MONO == 1) + case 3: + th = lv_theme_mono_init(color_primary, color_secondary, LV_THEME_DEFAULT_FLAGS, haspFonts[0], haspFonts[1], + haspFonts[2], haspFonts[3]); + break; +#endif + +#if LV_USE_THEME_MATERIAL == 1 + case 5: // Dark + material_flags = LV_THEME_MATERIAL_FLAG_DARK + LV_THEME_MATERIAL_FLAG_NO_TRANSITION; + case 4: // Light + case 9: // Light (old id) + th = + lv_theme_material_init(color_primary, color_secondary, material_flags + LV_THEME_MATERIAL_FLAG_NO_FOCUS, + haspFonts[0], haspFonts[1], haspFonts[2], haspFonts[3]); + break; +#endif + +#if LV_USE_THEME_TEMPLATE == 1 + case 7: + th = lv_theme_template_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, haspFonts[0], + haspFonts[1], haspFonts[2], haspFonts[3]); + break; +#endif + + default: + + LOG_ERROR(TAG_HASP, F("Unknown theme selected")); + } + + if(th) { + lv_theme_set_act(th); + LOG_INFO(TAG_HASP, F("Custom theme loaded")); + } else { + LOG_ERROR(TAG_HASP, F("Theme could not be loaded")); + } +} + /** * Create a demo application */ @@ -362,99 +441,17 @@ void haspSetup(void) #endif #endif - if(haspFonts[0] == nullptr) haspFonts[0] = LV_THEME_DEFAULT_FONT_SMALL; - if(haspFonts[1] == nullptr) haspFonts[1] = LV_THEME_DEFAULT_FONT_NORMAL; - if(haspFonts[2] == nullptr) haspFonts[2] = LV_THEME_DEFAULT_FONT_SUBTITLE; - if(haspFonts[3] == nullptr) haspFonts[3] = LV_THEME_DEFAULT_FONT_TITLE; + if(haspFonts[0] == nullptr) haspFonts[0] = &HASP_FONT_1; // LV_THEME_DEFAULT_FONT_SMALL; + if(haspFonts[1] == nullptr) haspFonts[1] = &HASP_FONT_2; // LV_THEME_DEFAULT_FONT_NORMAL; + if(haspFonts[2] == nullptr) haspFonts[2] = &HASP_FONT_3; // LV_THEME_DEFAULT_FONT_SUBTITLE; + if(haspFonts[3] == nullptr) haspFonts[3] = &HASP_FONT_4; // LV_THEME_DEFAULT_FONT_TITLE; // haspFonts[0] = lv_font_load("E:/font_1.fnt"); // haspFonts[2] = lv_font_load("E:/font_2.fnt"); - // haspFonts[3] = lv_font_load("E:/font_3.fnt"); - /* ********** Theme Initializations ********** */ - if(haspThemeId == 8) haspThemeId = 1; // update old HASP id - if(haspThemeId == 9) haspThemeId = 5; // update old material id - if(haspThemeId < 0 || haspThemeId > 5) haspThemeId = 1; // check bounds + // haspFonts[3] = hasp_font_load("L:/robotocondensed_60_latin1.bin"); - lv_theme_t* th = NULL; -#if(LV_USE_THEME_HASP == 1) - lv_theme_hasp_flag_t hasp_flags = LV_THEME_HASP_FLAG_LIGHT; -#endif -#if(LV_USE_THEME_MATERIAL == 1) - lv_theme_material_flag_t material_flags = LV_THEME_MATERIAL_FLAG_LIGHT; -#endif - - switch(haspThemeId) { -#if(LV_USE_THEME_EMPTY == 1) - case 0: - th = lv_theme_empty_init(lv_color_hsv_to_rgb(haspThemeHue, 100, 100), - lv_color_hsv_to_rgb(haspThemeHue, 100, 100), LV_THEME_DEFAULT_FLAGS, haspFonts[0], - haspFonts[1], haspFonts[2], haspFonts[3]); - break; -#endif - -#if(LV_USE_THEME_HASP == 1) - case 2: // Dark - hasp_flags = LV_THEME_HASP_FLAG_DARK; - case 1: // Light - case 8: // Light (old id) - th = lv_theme_hasp_init( - lv_color_hsv_to_rgb(haspThemeHue, 100, 100), lv_color_hsv_to_rgb(haspThemeHue, 100, 100), - hasp_flags + LV_THEME_HASP_FLAG_NO_FOCUS, haspFonts[0], haspFonts[1], haspFonts[2], haspFonts[3]); - break; -#endif - -#if LV_USE_THEME_ALIEN == 1 - case 1: - th = lv_theme_alien_init(haspThemeHue, defaultFont); - break; -#endif - -#if LV_USE_THEME_NIGHT == 1 - case 2: - th = lv_theme_night_init(haspThemeHue, defaultFont); // heavy - break; -#endif - -#if(LV_USE_THEME_MONO == 1) - case 3: - th = lv_theme_mono_init(LV_COLOR_PURPLE, LV_COLOR_BLACK, LV_THEME_DEFAULT_FLAGS, haspFonts[0], haspFonts[1], - haspFonts[2], haspFonts[3]); - break; -#endif - - // LV_THEME_MATERIAL_FLAG_NO_TRANSITION : disable transitions(state change animations) - // LV_THEME_MATERIAL_FLAG_NO_FOCUS: disable indication of focused state) -#if LV_USE_THEME_MATERIAL == 1 - case 5: // Dark - material_flags = LV_THEME_MATERIAL_FLAG_DARK; - case 4: // Light - case 9: // Light (old id) - th = lv_theme_material_init( - lv_color_hsv_to_rgb(haspThemeHue, 100, 100), lv_color_hsv_to_rgb(haspThemeHue, 100, 100), - material_flags + LV_THEME_MATERIAL_FLAG_NO_FOCUS + LV_THEME_MATERIAL_FLAG_NO_TRANSITION, haspFonts[0], - haspFonts[1], haspFonts[2], haspFonts[3]); - break; -#endif - -#if LV_USE_THEME_TEMPLATE == 1 - case 7: - th = lv_theme_template_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, haspFonts[0], - haspFonts[1], haspFonts[2], haspFonts[3]); - break; -#endif - - default: - - LOG_ERROR(TAG_HASP, F("Unknown theme selected")); - } - - if(th) { - lv_theme_set_act(th); - LOG_INFO(TAG_HASP, F("Custom theme loaded")); - } else { - LOG_ERROR(TAG_HASP, F("Theme could not be loaded")); - } + hasp_set_theme(haspThemeId); /* Create all screens using the theme */ @@ -467,6 +464,11 @@ void haspSetup(void) hasp_init(); hasp_load_json(); haspPages.set(haspStartPage, LV_SCR_LOAD_ANIM_FADE_ON); + + // lv_obj_t* obj = lv_datetime_create(haspPages.get_obj(haspPages.get()), NULL); + // obj->user_data.objid = LV_HASP_DATETIME; + // obj->user_data.id = 199; + // lv_datetime_set_text_fmt(obj,"%A, %B %d"); } /********************** diff --git a/src/hasp/hasp.h b/src/hasp/hasp.h index c230115e..68812a1e 100644 --- a/src/hasp/hasp.h +++ b/src/hasp/hasp.h @@ -75,6 +75,7 @@ void hasp_init(void); void hasp_load_json(void); void hasp_get_info(JsonDocument& info); +void hasp_set_theme(uint8_t themeid); /********************** * MACROS diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 8670ce4a..0772771d 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -40,7 +40,7 @@ dispatch_conf_t dispatch_setings = {.teleperiod = 300}; uint16_t dispatchSecondsToNextTeleperiod = 0; uint8_t nCommands = 0; -haspCommand_t commands[22]; +haspCommand_t commands[24]; moodlight_t moodlight = {.brightness = 255}; @@ -468,7 +468,7 @@ void dispatch_config(const char* topic, const char* payload) mdnsGetConfig(settings); } #endif -#if HASP_USE_HTTP > 0 +#if HASP_USE_HTTP > 0 || HASP_USE_HTTP_ASYNC > 0 else if(strcasecmp_P(topic, PSTR("http")) == 0) { if(update) httpSetConfig(settings); @@ -866,6 +866,64 @@ void dispatch_reboot(bool saveConfig) /******************************************* Command Wrapper Functions *********************************/ +// Periodically publish a JSON string indicating system status +void dispatch_send_sensordata(const char*, const char*) +{ +#if HASP_USE_MQTT > 0 + + StaticJsonDocument<1024> doc; + + time_t rawtime; + time(&rawtime); + char buffer[80]; + struct tm* timeinfo = localtime(&rawtime); + + strftime(buffer, sizeof(buffer), "%FT%T", timeinfo); + doc[F("time")] = buffer; + + long uptime = haspDevice.get_uptime(); + doc[F("uptimeSec")] = (uint32_t)uptime; + + uint32_t seconds = uptime % 60; + uint32_t minutes = uptime / 60; + uint32_t hours = minutes / 60; + uint32_t days = hours / 24; + minutes = minutes % 60; + hours = hours % 24; + snprintf_P(buffer, sizeof(buffer), PSTR("%dT%02d:%02d:%02d"), days, hours, minutes, seconds); + doc[F("uptime")] = buffer; + + haspDevice.get_sensors(doc); + + // JsonObject input = doc.createNestedObject(F("input")); + // JsonArray relay = doc.createNestedArray(F("power")); + // JsonArray led = doc.createNestedArray(F("light")); + // JsonArray dimmer = doc.createNestedArray(F("dim")); + + // #if HASP_USE_GPIO > 0 + // gpio_discovery(input, relay, led, dimmer); + // #endif + + char data[1024]; + size_t len = serializeJson(doc, data); + + switch(mqtt_send_discovery(data, len)) { + case MQTT_ERR_OK: + LOG_TRACE(TAG_MQTT_PUB, F(MQTT_TOPIC_DISCOVERY " => %s"), data); + break; + case MQTT_ERR_PUB_FAIL: + LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " " MQTT_TOPIC_DISCOVERY " => %s"), data); + break; + case MQTT_ERR_NO_CONN: + LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_CONNECTED)); + break; + default: + LOG_ERROR(TAG_MQTT, F(D_ERROR_UNKNOWN)); + } + +#endif +} + // Periodically publish a JSON string indicating system status void dispatch_send_discovery(const char*, const char*) { @@ -1038,6 +1096,25 @@ void dispatch_factory_reset(const char*, const char*) dispatch_reboot(false); // don't save running config } +void dispatch_theme(const char*, const char* themeid) +{ + hasp_set_theme(atoi(themeid)); +} + +void dispatch_service(const char*, const char* payload) +{ + if(!strcmp_P(payload, "start telnet")) { + telnetStart(); + } else if(!strcmp_P(payload, "stop telnet")) { + telnetStop(); + } else if(!strcmp_P(payload, "start http")) { + httpStart(); + } else if(!strcmp_P(payload, "stop http")) { + httpStop(); + } else { + } +} + /******************************************* Commands builder *******************************************/ static void dispatch_add_command(const char* p_cmdstr, void (*func)(const char*, const char*)) @@ -1073,6 +1150,8 @@ void dispatchSetup() dispatch_add_command(PSTR("dim"), dispatch_backlight_obsolete); // dim dispatch_add_command(PSTR("brightness"), dispatch_backlight_obsolete); // dim dispatch_add_command(PSTR("light"), dispatch_backlight_obsolete); + dispatch_add_command(PSTR("theme"), dispatch_theme); + dispatch_add_command(PSTR("service"), dispatch_service); dispatch_add_command(PSTR("wakeup"), dispatch_wakeup_obsolete); dispatch_add_command(PSTR("calibrate"), dispatch_calibrate); dispatch_add_command(PSTR("update"), dispatch_web_update); @@ -1106,6 +1185,7 @@ void dispatchEverySecond() } else if(dispatch_setings.teleperiod > 0 && mqttIsConnected()) { dispatch_statusupdate(NULL, NULL); dispatch_send_discovery(NULL, NULL); + dispatch_send_sensordata(NULL, NULL); dispatchSecondsToNextTeleperiod = dispatch_setings.teleperiod; } }