From 2205de607d072640558b6afe9e5f4952eee710c2 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 1 Jan 2021 21:37:08 +0100 Subject: [PATCH] Add arc and gauge properties --- src/hasp/hasp_attribute.cpp | 66 ++++++++++++++++-- src/hasp/hasp_attribute.h | 3 +- src/hasp/hasp_dispatch.cpp | 6 +- src/hasp/hasp_object.cpp | 132 ++++++++++++++++++------------------ src/hasp/hasp_object.h | 19 +++--- src/svc/hasp_mqtt.cpp | 106 +++++++++++++++-------------- 6 files changed, 198 insertions(+), 134 deletions(-) diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index ddb6457a..03ffd0e6 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -5,9 +5,7 @@ #if LVGL_VERSION_MAJOR != 7 #include "../lv_components.h" #endif - #include "ArduinoLog.h" -//#include "hasp_conf.h" #include "hasp.h" #include "hasp_object.h" @@ -399,6 +397,26 @@ static lv_font_t * haspPayloadToFont(const char * payload) } } +static void gauge_format_10(lv_obj_t * gauge, char * buf, int bufsize, int32_t value) +{ + snprintf(buf, bufsize, PSTR("%d"), value / 10); +} + +static void gauge_format_100(lv_obj_t * gauge, char * buf, int bufsize, int32_t value) +{ + snprintf(buf, bufsize, PSTR("%d"), value / 100); +} + +static void gauge_format_1k(lv_obj_t * gauge, char * buf, int bufsize, int32_t value) +{ + snprintf(buf, bufsize, PSTR("%d"), value / 1000); +} + +static void gauge_format_10k(lv_obj_t * gauge, char * buf, int bufsize, int32_t value) +{ + snprintf_P(buf, bufsize, PSTR("%d"), value / 10000); +} + static void hasp_process_label_long_mode(lv_obj_t * obj, const char * payload, bool update) { if(update) { @@ -564,6 +582,18 @@ static void hasp_attribute_get_part_state(lv_obj_t * obj, const char * attr_in, return; } + if(check_obj_type(obj, LV_HASP_ARC)) { + if(index == 1) { + part = LV_ARC_PART_INDIC; + } else if(index == 2) { + part = LV_ARC_PART_KNOB; + } else { + part = LV_ARC_PART_BG; + } + state = LV_STATE_DEFAULT; + return; + } + if(check_obj_type(obj, LV_HASP_CHECKBOX)) { if(index == 1) { part = LV_CHECKBOX_PART_BULLET; @@ -857,8 +887,14 @@ static void hasp_process_arc_attribute(lv_obj_t * obj, const char * attr_p, uint return (update) ? lv_arc_set_rotation(obj, val) : hasp_out_int(obj, attr, lv_arc_get_rotation(obj)); case ATTR_ADJUSTABLE: - return (update) ? lv_arc_set_adjustable(obj, val != 0) - : hasp_out_int(obj, attr, lv_arc_get_adjustable(obj)); + if(update) { + bool toggle = is_true(payload); + lv_arc_set_adjustable(obj, toggle); + lv_obj_set_event_cb(obj, toggle ? slider_event_handler : btn_event_handler); + } else { + hasp_out_int(obj, attr, lv_arc_get_adjustable(obj)); + } + return; case ATTR_START_ANGLE: return (update) ? lv_arc_set_bg_start_angle(obj, val) @@ -876,6 +912,7 @@ static void hasp_process_arc_attribute(lv_obj_t * obj, const char * attr_p, uint Log.warning(TAG_ATTR, F("Unknown property %s"), attr_p); } + static void hasp_process_gauge_attribute(lv_obj_t * obj, const char * attr_p, uint16_t attr_hash, const char * payload, bool update) { @@ -903,6 +940,27 @@ static void hasp_process_gauge_attribute(lv_obj_t * obj, const char * attr_p, ui case ATTR_LABEL_COUNT: return (update) ? lv_gauge_set_scale(obj, angle, line_count, val) : hasp_out_int(obj, attr, label_count); + + case ATTR_FORMAT: + if(update) { + switch(val) { + case 10: + lv_gauge_set_formatter_cb(obj, gauge_format_10); + break; + case 100: + lv_gauge_set_formatter_cb(obj, gauge_format_100); + break; + case 1000: + lv_gauge_set_formatter_cb(obj, gauge_format_1k); + break; + case 10000: + lv_gauge_set_formatter_cb(obj, gauge_format_10k); + break; + default: + lv_gauge_set_formatter_cb(obj, NULL); + } + } + return; } Log.warning(TAG_ATTR, F("Unknown property %s"), attr_p); diff --git a/src/hasp/hasp_attribute.h b/src/hasp/hasp_attribute.h index 73e62124..aa58ca45 100644 --- a/src/hasp/hasp_attribute.h +++ b/src/hasp/hasp_attribute.h @@ -11,6 +11,7 @@ #include "hasp_conf.h" #include "hasp.h" +#include "hasp_object.h" #ifdef __cplusplus extern "C" { @@ -280,6 +281,6 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t) #define ATTR_START_ANGLE1 39067 #define ATTR_END_ANGLE1 33634 -// Buttonmatric +// Buttonmatrix #define ATTR_MAP 45628 #endif diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index be2943c2..5bb69314 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -519,14 +519,15 @@ void dispatch_parse_jsonl(std::istringstream & stream) size_t line = 1; DynamicJsonDocument jsonl(4 * 128u); // max ~256 characters per line DeserializationError err = deserializeJson(jsonl, stream); + stream.setTimeout(25); - guiStop(); + // guiStop(); while(err == DeserializationError::Ok) { hasp_new_object(jsonl.as(), savedPage); err = deserializeJson(jsonl, stream); line++; } - guiStart(); + // guiStart(); /* For debugging pourposes */ if(err == DeserializationError::EmptyInput) { @@ -550,6 +551,7 @@ void dispatch_parse_jsonl(const char *, const char * payload) { #if HASP_USE_CONFIG > 0 CharStream stream((char *)payload); + // stream.setTimeout(10); dispatch_parse_jsonl(stream); #else std::istringstream stream((char *)payload); diff --git a/src/hasp/hasp_object.cpp b/src/hasp/hasp_object.cpp index 63b7b3f5..ce603458 100644 --- a/src/hasp/hasp_object.cpp +++ b/src/hasp/hasp_object.cpp @@ -84,72 +84,72 @@ bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, uint8_t * objid) * @return true or false wether the types match * @note */ -bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) -{ - lvobjtype += 3; // skip "lv_" +// bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) +// { +// lvobjtype += 3; // skip "lv_" - switch(haspobjtype) { - case LV_HASP_BTNMATRIX: - return (strcmp_P(lvobjtype, PSTR("btnmatrix")) == 0); - case LV_HASP_TABLE: - return (strcmp_P(lvobjtype, PSTR("table")) == 0); - case LV_HASP_BUTTON: - return (strcmp_P(lvobjtype, PSTR("btn")) == 0); - case LV_HASP_LABEL: - return (strcmp_P(lvobjtype, PSTR("label")) == 0); - case LV_HASP_CHECKBOX: - return (strcmp_P(lvobjtype, PSTR("checkbox")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cb")) == 0); - case LV_HASP_DDLIST: - return (strcmp_P(lvobjtype, PSTR("dropdown")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_ddlist")) == 0); - case LV_HASP_CPICKER: - return (strcmp_P(lvobjtype, PSTR("cpicker")) == 0); - case LV_HASP_PRELOADER: - return (strcmp_P(lvobjtype, PSTR("spinner")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_preload")) == 0); - case LV_HASP_SLIDER: - return (strcmp_P(lvobjtype, PSTR("slider")) == 0); - case LV_HASP_GAUGE: - return (strcmp_P(lvobjtype, PSTR("gauge")) == 0); - case LV_HASP_ARC: - return (strcmp_P(lvobjtype, PSTR("arc")) == 0); - case LV_HASP_BAR: - return (strcmp_P(lvobjtype, PSTR("bar")) == 0); - case LV_HASP_LMETER: - return (strcmp_P(lvobjtype, PSTR("linemeter")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_lmeter")) == 0) - case LV_HASP_ROLLER: - return (strcmp_P(lvobjtype, PSTR("roller")) == 0); - case LV_HASP_SWITCH: - return (strcmp_P(lvobjtype, PSTR("switch")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_sw")) == 0) - case LV_HASP_LED: - return (strcmp_P(lvobjtype, PSTR("led")) == 0); - case LV_HASP_IMAGE: - return (strcmp_P(lvobjtype, PSTR("img")) == 0); - case LV_HASP_IMGBTN: - return (strcmp_P(lvobjtype, PSTR("imgbtn")) == 0); - case LV_HASP_CONTAINER: - return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) - case LV_HASP_OBJECT: - return (strcmp_P(lvobjtype, PSTR("page")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) - case LV_HASP_PAGE: - return (strcmp_P(lvobjtype, PSTR("obj")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) - case LV_HASP_TABVIEW: - return (strcmp_P(lvobjtype, PSTR("tabview")) == 0); - case LV_HASP_TILEVIEW: - return (strcmp_P(lvobjtype, PSTR("tileview")) == 0); - case LV_HASP_CHART: - return (strcmp_P(lvobjtype, PSTR("chart")) == 0); - case LV_HASP_CANVAS: - return (strcmp_P(lvobjtype, PSTR("canvas")) == 0); - case LV_HASP_CALENDER: - return (strcmp_P(lvobjtype, PSTR("calender")) == 0); - case LV_HASP_MSGBOX: - return (strcmp_P(lvobjtype, PSTR("msgbox")) == 0); - case LV_HASP_WINDOW: - return (strcmp_P(lvobjtype, PSTR("win")) == 0); +// switch(haspobjtype) { +// case LV_HASP_BTNMATRIX: +// return (strcmp_P(lvobjtype, PSTR("btnmatrix")) == 0); +// case LV_HASP_TABLE: +// return (strcmp_P(lvobjtype, PSTR("table")) == 0); +// case LV_HASP_BUTTON: +// return (strcmp_P(lvobjtype, PSTR("btn")) == 0); +// case LV_HASP_LABEL: +// return (strcmp_P(lvobjtype, PSTR("label")) == 0); +// case LV_HASP_CHECKBOX: +// return (strcmp_P(lvobjtype, PSTR("checkbox")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cb")) == 0); +// case LV_HASP_DDLIST: +// return (strcmp_P(lvobjtype, PSTR("dropdown")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_ddlist")) == 0); +// case LV_HASP_CPICKER: +// return (strcmp_P(lvobjtype, PSTR("cpicker")) == 0); +// case LV_HASP_PRELOADER: +// return (strcmp_P(lvobjtype, PSTR("spinner")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_preload")) == 0); +// case LV_HASP_SLIDER: +// return (strcmp_P(lvobjtype, PSTR("slider")) == 0); +// case LV_HASP_GAUGE: +// return (strcmp_P(lvobjtype, PSTR("gauge")) == 0); +// case LV_HASP_ARC: +// return (strcmp_P(lvobjtype, PSTR("arc")) == 0); +// case LV_HASP_BAR: +// return (strcmp_P(lvobjtype, PSTR("bar")) == 0); +// case LV_HASP_LMETER: +// return (strcmp_P(lvobjtype, PSTR("linemeter")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_lmeter")) == 0) +// case LV_HASP_ROLLER: +// return (strcmp_P(lvobjtype, PSTR("roller")) == 0); +// case LV_HASP_SWITCH: +// return (strcmp_P(lvobjtype, PSTR("switch")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_sw")) == 0) +// case LV_HASP_LED: +// return (strcmp_P(lvobjtype, PSTR("led")) == 0); +// case LV_HASP_IMAGE: +// return (strcmp_P(lvobjtype, PSTR("img")) == 0); +// case LV_HASP_IMGBTN: +// return (strcmp_P(lvobjtype, PSTR("imgbtn")) == 0); +// case LV_HASP_CONTAINER: +// return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) +// case LV_HASP_OBJECT: +// return (strcmp_P(lvobjtype, PSTR("page")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) +// case LV_HASP_PAGE: +// return (strcmp_P(lvobjtype, PSTR("obj")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) +// case LV_HASP_TABVIEW: +// return (strcmp_P(lvobjtype, PSTR("tabview")) == 0); +// case LV_HASP_TILEVIEW: +// return (strcmp_P(lvobjtype, PSTR("tileview")) == 0); +// case LV_HASP_CHART: +// return (strcmp_P(lvobjtype, PSTR("chart")) == 0); +// case LV_HASP_CANVAS: +// return (strcmp_P(lvobjtype, PSTR("canvas")) == 0); +// case LV_HASP_CALENDER: +// return (strcmp_P(lvobjtype, PSTR("calender")) == 0); +// case LV_HASP_MSGBOX: +// return (strcmp_P(lvobjtype, PSTR("msgbox")) == 0); +// case LV_HASP_WINDOW: +// return (strcmp_P(lvobjtype, PSTR("win")) == 0); - default: - return false; - } -} +// default: +// return false; +// } +// } /** * Check if an lvgl objecttype name corresponds to a given HASP object ID @@ -178,7 +178,7 @@ void hasp_object_tree(lv_obj_t * parent, uint8_t pageid, uint16_t level) lv_obj_type_t list; lv_obj_get_type(parent, &list); const char * objtype = list.type[0]; - Log.verbose(TAG_HASP, F("[%d] p[%d].b[%d] %s"), level, pageid, parent->user_data, objtype); + Log.verbose(TAG_HASP, F("[%d] p[%d].b[%d] %s"), level, pageid, parent->user_data.id, objtype); lv_obj_t * child; child = lv_obj_get_child(parent, NULL); @@ -427,7 +427,7 @@ static void ddlist_event_handler(lv_obj_t * obj, lv_event_t event) * @param obj pointer to a slider * @param event type of event that occured */ -static void slider_event_handler(lv_obj_t * obj, lv_event_t event) +void slider_event_handler(lv_obj_t * obj, lv_event_t event) { if(event == LV_EVENT_VALUE_CHANGED) hasp_send_obj_attribute_val(obj, lv_slider_get_value(obj)); } diff --git a/src/hasp/hasp_object.h b/src/hasp/hasp_object.h index 1cdf2d0a..1cacfdc9 100644 --- a/src/hasp/hasp_object.h +++ b/src/hasp/hasp_object.h @@ -12,14 +12,14 @@ enum lv_hasp_obj_type_t { LV_HASP_OBJECT = 91, LV_HASP_PAGE = 92, - LV_HASP_LABEL = 12, + LV_HASP_LABEL = 12, LV_HASP_DDLIST = 50, LV_HASP_ROLLER = 51, LV_HASP_BUTTON = 10, LV_HASP_CHECKBOX = 11, - LV_HASP_SWITCH = 40, - LV_HASP_LED = 41, + LV_HASP_SWITCH = 40, + LV_HASP_LED = 41, LV_HASP_SLIDER = 30, LV_HASP_GAUGE = 31, @@ -36,11 +36,11 @@ enum lv_hasp_obj_type_t { LV_HASP_BTNMATRIX = 1, LV_HASP_TABLE = 2, - LV_HASP_CALENDER = 81, - LV_HASP_CHART = 80, - LV_HASP_TILEVIEW = 70, - LV_HASP_TABVIEW = 71, - LV_HASP_TAB = 72, + LV_HASP_CALENDER = 81, + LV_HASP_CHART = 80, + LV_HASP_TILEVIEW = 70, + LV_HASP_TABVIEW = 71, + LV_HASP_TAB = 72, LV_HASP_WINDOW = 94, LV_HASP_MSGBOX = 93, }; @@ -50,7 +50,7 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id); lv_obj_t * hasp_find_obj_from_parent_id(lv_obj_t * parent, uint8_t objid); // lv_obj_t * hasp_find_obj_from_page_id(uint8_t pageid, uint8_t objid); bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, uint8_t * objid); -bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype); +//bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype); bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype); void hasp_object_tree(lv_obj_t * parent, uint8_t pageid, uint16_t level); @@ -63,6 +63,7 @@ void object_set_group_state(uint8_t groupid, uint8_t eventid, lv_obj_t * src_obj void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event); void IRAM_ATTR toggle_event_handler(lv_obj_t * obj, lv_event_t event); +void slider_event_handler(lv_obj_t * obj, lv_event_t event); void wakeup_event_handler(lv_obj_t * obj, lv_event_t event); #endif \ No newline at end of file diff --git a/src/svc/hasp_mqtt.cpp b/src/svc/hasp_mqtt.cpp index b0f37da0..57929e25 100644 --- a/src/svc/hasp_mqtt.cpp +++ b/src/svc/hasp_mqtt.cpp @@ -4,44 +4,44 @@ #include "hasp_conf.h" #if HASP_USE_MQTT > 0 -#include "PubSubClient.h" + #include "PubSubClient.h" -#include "hasp_mqtt.h" + #include "hasp_mqtt.h" -#if defined(ARDUINO_ARCH_ESP32) -#include + #if defined(ARDUINO_ARCH_ESP32) + #include WiFiClient mqttNetworkClient; -#elif defined(ARDUINO_ARCH_ESP8266) -#include -#include -#include + #elif defined(ARDUINO_ARCH_ESP8266) + #include + #include + #include WiFiClient mqttNetworkClient; -#else -#if defined(STM32F4xx) && HASP_USE_WIFI > 0 + #else + #if defined(STM32F4xx) && HASP_USE_WIFI > 0 // #include WiFiSpiClient mqttNetworkClient; -#else -#if defined(W5500_MOSI) && defined(W5500_MISO) && defined(W5500_SCLK) -#define W5500_LAN -#include -#else -#include -#endif + #else + #if defined(W5500_MOSI) && defined(W5500_MISO) && defined(W5500_SCLK) + #define W5500_LAN + #include + #else + #include + #endif EthernetClient mqttNetworkClient; -#endif -#endif + #endif + #endif -#include "hasp_hal.h" -#include "hasp_debug.h" -#include "hasp_config.h" + #include "hasp_hal.h" + #include "hasp_debug.h" + #include "hasp_config.h" -#include "../hasp/hasp_dispatch.h" -#include "../hasp/hasp.h" + #include "../hasp/hasp_dispatch.h" + #include "../hasp/hasp.h" -#ifdef USE_CONFIG_OVERRIDE -#include "user_config_override.h" -#endif + #ifdef USE_CONFIG_OVERRIDE + #include "user_config_override.h" + #endif /* String mqttGetSubtopic; // MQTT subtopic for incoming commands requesting .val @@ -65,41 +65,41 @@ char mqttNodeTopic[24]; char mqttGroupTopic[24]; bool mqttEnabled; -//////////////////////////////////////////////////////////////////////////////////////////////////// -// These defaults may be overwritten with values saved by the web interface -#ifdef MQTT_HOST + //////////////////////////////////////////////////////////////////////////////////////////////////// + // These defaults may be overwritten with values saved by the web interface + #ifdef MQTT_HOST char mqttServer[16] = MQTT_HOST; -#else + #else char mqttServer[16] = ""; -#endif -#ifdef MQTT_PORT + #endif + #ifdef MQTT_PORT uint16_t mqttPort = MQTT_PORT; -#else + #else uint16_t mqttPort = 1883; -#endif -#ifdef MQTT_USER + #endif + #ifdef MQTT_USER char mqttUser[23] = MQTT_USER; -#else + #else char mqttUser[23] = ""; -#endif -#ifdef MQTT_PASSW + #endif + #ifdef MQTT_PASSW char mqttPassword[32] = MQTT_PASSW; -#else + #else char mqttPassword[32] = ""; -#endif -#ifdef MQTT_NODENAME + #endif + #ifdef MQTT_NODENAME char mqttNodeName[16] = MQTT_NODENAME; -#else + #else char mqttNodeName[16] = ""; -#endif -#ifdef MQTT_GROUPNAME + #endif + #ifdef MQTT_GROUPNAME char mqttGroupName[16] = MQTT_GROUPNAME; -#else + #else char mqttGroupName[16] = ""; -#endif -#ifndef MQTT_PREFIX -#define MQTT_PREFIX "hasp" -#endif + #endif + #ifndef MQTT_PREFIX + #define MQTT_PREFIX "hasp" + #endif PubSubClient mqttClient(mqttNetworkClient); @@ -355,6 +355,8 @@ void mqttStart() mqttReconnectCount = 0; haspReconnect(); + haspProgressVal(255); + dispatch_output_current_page(); dispatch_output_statusupdate(NULL, NULL); } @@ -410,7 +412,7 @@ void mqttStop() } } -#if HASP_USE_CONFIG > 0 + #if HASP_USE_CONFIG > 0 bool mqttGetConfig(const JsonObject & settings) { bool changed = false; @@ -495,6 +497,6 @@ bool mqttSetConfig(const JsonObject & settings) return changed; } -#endif // HASP_USE_CONFIG + #endif // HASP_USE_CONFIG #endif // HASP_USE_MQTT