From 3267bd31124d3ba98ed3b2980db17b360eec9786 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 9 Apr 2020 22:39:29 +0200 Subject: [PATCH] Update hasp_attributes with hash function --- src/hasp.cpp | 38 --- src/hasp.h | 1 - src/hasp_attr_get.cpp | 6 +- src/hasp_attribute.cpp | 565 ++++++++++++++++++++++------------------- src/hasp_attribute.h | 214 ++++++++++++++++ 5 files changed, 521 insertions(+), 303 deletions(-) diff --git a/src/hasp.cpp b/src/hasp.cpp index f277718b..eb2280e9 100644 --- a/src/hasp.cpp +++ b/src/hasp.cpp @@ -250,44 +250,6 @@ static inline void hasp_send_obj_attribute_txt(lv_obj_t * obj, const char * txt) //////////////////////////////////////////////////////////////////////////////////////////////////// -bool check_obj_type(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) -{ - lvobjtype += 3; // skip "lv_" - - switch(haspobjtype) { - 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_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_CONTAINER: - return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) - default: - return false; - } -} - // Used in the dispatcher void hasp_process_attribute(uint8_t pageid, uint8_t objid, const char * attr, const char * payload) { diff --git a/src/hasp.h b/src/hasp.h index 095dcfaa..35912f64 100644 --- a/src/hasp.h +++ b/src/hasp.h @@ -86,7 +86,6 @@ void haspWakeUp(void); bool haspGetConfig(const JsonObject & settings); bool haspSetConfig(const JsonObject & settings); -bool check_obj_type(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype); lv_obj_t * hasp_find_obj_from_id(lv_obj_t * parent, uint8_t objid); void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event); diff --git a/src/hasp_attr_get.cpp b/src/hasp_attr_get.cpp index d85d3a45..50514811 100644 --- a/src/hasp_attr_get.cpp +++ b/src/hasp_attr_get.cpp @@ -1,8 +1,6 @@ -#include "Arduino.h" -#include "ArduinoLog.h" - #include "lvgl.h" #include "hasp.h" +#include "hasp_attribute.h" //#include "hasp_attr_get.h" #define LVGL7 1 @@ -47,6 +45,6 @@ bool haspGetObjAttribute(lv_obj_t * obj, String strAttr, std::string & strPayloa if(check_obj_type(list.type[0], LV_HASP_LED)) strPayload = String(lv_led_get_bright(obj)).c_str(); if(check_obj_type(list.type[0], LV_HASP_SWITCH)) strPayload = String(lv_switch_get_state(obj)).c_str(); } - } + } return false; } \ No newline at end of file diff --git a/src/hasp_attribute.cpp b/src/hasp_attribute.cpp index c527d7eb..28b5bbfd 100644 --- a/src/hasp_attribute.cpp +++ b/src/hasp_attribute.cpp @@ -1,5 +1,5 @@ -#include "ArduinoLog.h" #include "ArduinoJson.h" +#include "ArduinoLog.h" #include "lvgl.h" #include "lv_conf.h" @@ -13,12 +13,22 @@ extern lv_font_t * haspFonts[8]; static inline bool is_true(const char * s); static inline bool only_digits(const char * s); -static inline void hasp_out_int(lv_obj_t * obj, const char * attr, uint32_t val); -static inline void hasp_out_str(lv_obj_t * obj, const char * attr, const char * data); -static inline void hasp_out_color(lv_obj_t * obj, const char * attr, lv_color_t color); -// this function is missing in lvgl -// OK +/* 16-bit hashing function http://www.cse.yorku.ca/~oz/hash.html */ +static uint16_t sdbm(const char * str) +{ + uint16_t hash = 0; + char c; + + // while(c = *str++) hash = c + (hash << 6) + (hash << 16) - hash; + while(c = (*str++)) { + hash = tolower(c) + (hash << 6) - hash; + } + + return hash; +} + +// OK - this function is missing in lvgl static uint8_t lv_roller_get_visible_row_count(lv_obj_t * roller) { const lv_font_t * font = lv_obj_get_style_text_font(roller, LV_ROLLER_PART_BG); @@ -186,14 +196,138 @@ static inline bool haspGetLabelText(lv_obj_t * obj, char * text) return false; } +static void hasp_attribute_get_part_state(lv_obj_t * obj, const char * attr_in, char * attr_out, uint8_t & part, + uint8_t & state) +{ + int len = strlen(attr_in); + if(len > 0 && len < 32) { + // Check Trailing partnumber + if(attr_in[len - 1] == '1') { + part = LV_TABLE_PART_CELL1; + } else if(attr_in[len - 1] == '2') { + part = LV_TABLE_PART_CELL2; + } else if(attr_in[len - 1] == '3') { + part = LV_TABLE_PART_CELL3; + } else if(attr_in[len - 1] == '4') { + part = LV_TABLE_PART_CELL4; + } + + // Remove Trailing part digit + char attr[128]; + if(part != LV_TABLE_PART_BG && len > 0) { + len--; + } + strncpy(attr_out, attr_in, len + 1); + attr_out[len] = 0; + } else { + attr_out[0] = 0; + } +} + +static void hasp_local_style_attr_bg(lv_obj_t * obj, const char * attr_p, const char * payload, bool update) +{ + char attr[32]; + uint8_t part = LV_TABLE_PART_BG; + uint8_t state = LV_STATE_DEFAULT; + int16_t var = atoi(payload); + + hasp_attribute_get_part_state(obj, attr_p, attr, part, state); + + /* ***** WARNING **************************************************** + * when using hasp_out use attr_p for the original attribute name + * *************************************************************** */ + + if(!strcmp_P(attr, PSTR("bg_blend_mode"))) + return attribute_bg_blend_mode(obj, part, state, update, attr_p, (lv_blend_mode_t)var); + + if(!strcmp_P(attr, PSTR("bg_main_stop"))) + return attribute_bg_main_stop(obj, part, state, update, attr_p, (lv_style_int_t)var); + + if(!strcmp_P(attr, PSTR("bg_grad_stop"))) + return attribute_bg_grad_stop(obj, part, state, update, attr_p, (lv_style_int_t)var); + + if(!strcmp_P(attr, PSTR("bg_grad_dir"))) + return attribute_bg_grad_dir(obj, part, state, update, attr_p, (lv_grad_dir_t)var); + + if(!strcmp_P(attr, PSTR("bg_color"))) { + lv_color_t color = haspPayloadToColor(payload); + if(part != 64) + return lv_obj_set_style_local_bg_color(obj, part, state, color); + else + return lv_obj_set_style_local_bg_color(obj, LV_PAGE_PART_SCRL, LV_STATE_CHECKED, color); + } + if(!strcmp_P(attr, PSTR("bg_grad_color"))) { + lv_color_t color = haspPayloadToColor(payload); + return lv_obj_set_style_local_bg_grad_color(obj, part, state, color); + } + + if(!strcmp_P(attr, PSTR("bg_opa"))) return attribute_bg_opa(obj, part, state, update, attr_p, (lv_opa_t)var); + + Log.warning(F("HASP: Unknown property %s"), attr_p); +} + +static void hasp_local_style_attr_pad(lv_obj_t * obj, const char * attr_p, const char * payload, bool update) +{ + char attr[32]; + uint8_t part = LV_TABLE_PART_BG; + uint8_t state = LV_STATE_DEFAULT; + int16_t var = atoi(payload); + + hasp_attribute_get_part_state(obj, attr_p, attr, part, state); + + /* ***** WARNING **************************************************** + * when using hasp_out use attr_p for the original attribute name + * *************************************************************** */ + + if(!strcmp_P(attr, PSTR("pad_top"))) + return attribute_pad_top(obj, part, state, update, attr_p, (lv_blend_mode_t)var); + + if(!strcmp_P(attr, PSTR("pad_bottom"))) + return attribute_pad_bottom(obj, part, state, update, attr_p, (lv_style_int_t)var); + + if(!strcmp_P(attr, PSTR("pad_left"))) + return attribute_pad_left(obj, part, state, update, attr_p, (lv_style_int_t)var); + + if(!strcmp_P(attr, PSTR("pad_right"))) + return attribute_pad_right(obj, part, state, update, attr_p, (lv_grad_dir_t)var); + + if(!strcmp_P(attr, PSTR("pad_inner"))) { + return attribute_pad_inner(obj, part, state, update, attr_p, (lv_opa_t)var); + } + + Log.warning(F("HASP: Unknown property %s"), attr_p); +} + static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, const char * payload, bool update) { + + if(attr_p == strstr_P(attr_p, PSTR("bg_"))) { // startsWith command/ + return hasp_local_style_attr_bg(obj, attr_p, payload, update); + + } else if(attr_p == strstr_P(attr_p, PSTR("pad_"))) { + return hasp_local_style_attr_pad(obj, attr_p, payload, update); + /* } else if(attr_p == strstr_P(attr_p, PSTR("text_"))) { + return hasp_local_style_attr_text(obj, attr_p, payload, update); + } else if(attr_p == strstr_P(attr_p, PSTR("line_"))) { + return hasp_local_style_attr_line(obj, attr_p, payload, update); + } else if(attr_p == strstr_P(attr_p, PSTR("value_"))) { + return hasp_local_style_attr_value(obj, attr_p, payload, update); + } else if(attr_p == strstr_P(attr_p, PSTR("border_"))) { + return hasp_local_style_attr_border(obj, attr_p, payload, update); + } else if(attr_p == strstr_P(attr_p, PSTR("shadow_"))) { + return hasp_local_style_attr_shadow(obj, attr_p, payload, update); + } else if(attr_p == strstr_P(attr_p, PSTR("outline_"))) { + return hasp_local_style_attr_outline(obj, attr_p, payload, update); + } else if(attr_p == strstr_P(attr_p, PSTR("pattern_"))) { + return hasp_local_style_attr_pattern(obj, attr_p, payload, update);*/ + } + uint8_t part = LV_TABLE_PART_BG; uint8_t state = LV_STATE_DEFAULT; int16_t var = atoi(payload); int len = strlen(attr_p); - if(len > 0 && len < 128) { + if(len > 0 && len < 32) { // Check Trailing partnumber if(attr_p[len - 1] == '1') { part = LV_TABLE_PART_CELL1; @@ -208,7 +342,7 @@ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, const cha } // Remove Trailing part digit - char attr[128]; + char attr[32]; if(part != LV_TABLE_PART_BG && len > 0) { len--; } @@ -216,30 +350,19 @@ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, const cha attr[len] = 0; // debugPrintln(strAttr + "&" + part); - uint8_t t8 = 0; /* ***** WARNING **************************************************** * when using hasp_out use attr_p for the original attribute name * *************************************************************** */ if(!strcmp_P(attr, PSTR("radius"))) { - if(update) { - return lv_obj_set_style_local_radius(obj, part, state, (lv_style_int_t)var); - } else { - lv_obj_get_style_local_radius(obj, part, state, &var); - return hasp_out_int(obj, attr_p, var); - } + return attribute_radius(obj, part, state, update, attr_p, var); } else if(!strcmp_P(attr, PSTR("clip_corner"))) { - if(update) { - return lv_obj_set_style_local_clip_corner(obj, part, state, (bool)var); - } else { - lv_obj_get_style_local_clip_corner(obj, part, state, &t8); - return hasp_out_int(obj, attr_p, t8); - } + return attribute_clip_corner(obj, part, state, update, attr_p, var); } else if(!strcmp_P(attr, PSTR("size"))) { - return lv_obj_set_style_local_size(obj, part, state, (lv_style_int_t)var); + return attribute_size(obj, part, state, update, attr_p, var); } else if(!strcmp_P(attr, PSTR("transform_width"))) { return lv_obj_set_style_local_transform_width(obj, part, state, (lv_style_int_t)var); @@ -250,44 +373,6 @@ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, const cha } else if(!strcmp_P(attr, PSTR("opa_scale"))) { return lv_obj_set_style_local_opa_scale(obj, part, state, (lv_opa_t)var); - } else if(!strcmp_P(attr, PSTR("pad_top"))) { - return lv_obj_set_style_local_pad_top(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("pad_bottom"))) { - return lv_obj_set_style_local_pad_bottom(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("pad_left"))) { - return lv_obj_set_style_local_pad_left(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("pad_right"))) { - return lv_obj_set_style_local_pad_right(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("pad_inner"))) { - return lv_obj_set_style_local_pad_inner(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("bg_blend_mode"))) { - return lv_obj_set_style_local_bg_blend_mode(obj, part, state, (lv_blend_mode_t)var); - - } else if(!strcmp_P(attr, PSTR("bg_main_stop"))) { - return lv_obj_set_style_local_bg_main_stop(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("bg_grad_stop"))) { - return lv_obj_set_style_local_bg_grad_stop(obj, part, state, (lv_style_int_t)var); - - } else if(!strcmp_P(attr, PSTR("bg_grad_dir"))) { - return lv_obj_set_style_local_bg_grad_dir(obj, part, state, (lv_grad_dir_t)var); - - } else if(!strcmp_P(attr, PSTR("bg_color"))) { - lv_color_t color = haspPayloadToColor(payload); - if(part != 64) - return lv_obj_set_style_local_bg_color(obj, part, state, color); - else - return lv_obj_set_style_local_bg_color(obj, LV_PAGE_PART_SCRL, LV_STATE_CHECKED, color); - } else if(!strcmp_P(attr, PSTR("bg_grad_color"))) { - lv_color_t color = haspPayloadToColor(payload); - return lv_obj_set_style_local_bg_grad_color(obj, part, state, color); - } else if(!strcmp_P(attr, PSTR("bg_opa"))) { - return lv_obj_set_style_local_bg_opa(obj, part, state, (lv_opa_t)var); } else if(!strcmp_P(attr, PSTR("border_width"))) { return lv_obj_set_style_local_border_width(obj, part, state, (lv_style_int_t)var); } else if(!strcmp_P(attr, PSTR("border_side"))) { @@ -581,216 +666,130 @@ static void hasp_process_obj_attribute_range(lv_obj_t * obj, const char * attr, } } -// OK -static void hasp_process_obj_attribute1(lv_obj_t * obj, const char * attr, const char * payload, bool update) -{ - int16_t val = atoi(payload); - - if(!strcmp_P(attr, PSTR("x"))) { - return update ? lv_obj_set_x(obj, val) : hasp_out_int(obj, attr, lv_obj_get_x(obj)); - } - if(!strcmp_P(attr, PSTR("y"))) { - return update ? lv_obj_set_y(obj, val) : hasp_out_int(obj, attr, lv_obj_get_y(obj)); - } - if(!strcmp_P(attr, PSTR("w"))) { - return update ? lv_obj_set_width(obj, val) : hasp_out_int(obj, attr, lv_obj_get_width(obj)); - } - if(!strcmp_P(attr, PSTR("h"))) { - return update ? lv_obj_set_height(obj, val) : hasp_out_int(obj, attr, lv_obj_get_height(obj)); - } - - hasp_local_style_attr(obj, attr, payload, update); -} - -// OK -static void hasp_process_obj_attribute2(lv_obj_t * obj, const char * attr, const char * payload, bool update) -{ - int16_t val = atoi(payload); - - if(!strcmp_P(attr, PSTR("id"))) { - return update ? (void)(obj->user_data = (uint8_t)val) : hasp_out_int(obj, attr, obj->user_data); - } - - hasp_local_style_attr(obj, attr, payload, update); -} - -// OK -static void hasp_process_obj_attribute3(lv_obj_t * obj, const char * attr, const char * payload, bool update) -{ - // int16_t val = atoi(payload); - - if(!strcmp_P(attr, PSTR("vis"))) { - return update ? lv_obj_set_hidden(obj, !is_true(payload)) : hasp_out_int(obj, attr, !lv_obj_get_hidden(obj)); - } - if(!strcmp_P(attr, PSTR("txt"))) { // In order of likelihood to occur - return hasp_process_obj_attribute_txt(obj, attr, payload, update); - } - if(!strcmp_P(attr, PSTR("val"))) { // In order of likelihood to occur - return hasp_process_obj_attribute_val(obj, attr, payload, update); - } - if(!strcmp_P(attr, PSTR("min"))) { // In order of likelihood to occur - return hasp_process_obj_attribute_range(obj, attr, payload, update, true, false); - } - if(!strcmp_P(attr, PSTR("max"))) { // In order of likelihood to occur - return hasp_process_obj_attribute_range(obj, attr, payload, update, false, true); - } - - hasp_local_style_attr(obj, attr, payload, update); -} - -static void hasp_process_obj_attribute4(lv_obj_t * obj, const char * attr, const char * payload, bool update) -{ - int16_t val = atoi(payload); - - if(!strcmp_P(attr, PSTR("rows"))) { - lv_obj_type_t list; - lv_obj_get_type(obj, &list); - const char * objtype = list.type[0]; - - if(check_obj_type(objtype, LV_HASP_ROLLER)) { - return update ? lv_roller_set_visible_row_count(obj, (uint8_t)val) - : hasp_out_int(obj, attr, lv_roller_get_visible_row_count(obj)); - } - } - - // if(!strcmp_P(attr, PSTR("page"))) { - // return lv_obj_set_parent; - // } - - /* Attributes depending on objecttype */ - lv_obj_type_t list; - lv_obj_get_type(obj, &list); - const char * objtype = list.type[0]; - - if(!strcmp_P(attr, PSTR("rect"))) { - if(check_obj_type(objtype, LV_HASP_CPICKER)) { - lv_cpicker_set_type(obj, is_true(payload) ? LV_CPICKER_TYPE_RECT : LV_CPICKER_TYPE_DISC); - return; - } - } - - if(!strcmp_P(attr, PSTR("mode"))) { - if(check_obj_type(objtype, LV_HASP_BUTTON)) { - lv_obj_t * label = FindButtonLabel(obj); - if(label) { - hasp_process_label_long_mode(label, payload, update); - lv_obj_set_width(label, lv_obj_get_width(obj)); - } - return; - } - - if(check_obj_type(objtype, LV_HASP_LABEL)) { - hasp_process_label_long_mode(obj, payload, update); - return; - } - } - - hasp_local_style_attr(obj, attr, payload, update); -} - -// OK -static void hasp_process_obj_attribute6(lv_obj_t * obj, const char * attr, const char * payload, bool update) -{ - // int16_t val = atoi(payload); - - if(!strcmp_P(attr, PSTR("hidden"))) { - return update ? lv_obj_set_hidden(obj, is_true(payload)) : hasp_out_int(obj, attr, lv_obj_get_hidden(obj)); - } - - /* Attributes depending on objecttype */ - lv_obj_type_t list; - lv_obj_get_type(obj, &list); - const char * objtype = list.type[0]; - - if(!strcmp_P(attr, PSTR("toggle"))) { - if(check_obj_type(objtype, LV_HASP_BUTTON)) { - if(update) { - bool toggle = is_true(payload); - lv_btn_set_checkable(obj, toggle); - lv_obj_set_event_cb(obj, toggle ? toggle_event_handler : btn_event_handler); - } else { - hasp_out_int(obj, attr, lv_btn_get_checkable(obj)); - } - return; - } - } - - hasp_local_style_attr(obj, attr, payload, update); -} - -// OK -static void hasp_process_obj_attribute7(lv_obj_t * obj, const char * attr, const char * payload, bool update) -{ - int16_t val = atoi(payload); - - if(!strcmp_P(attr, PSTR("opacity"))) { - return update ? lv_obj_set_style_local_opa_scale(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, val) - : hasp_out_int(obj, attr, lv_obj_get_style_opa_scale(obj, LV_OBJ_PART_MAIN)); - } - - if(!strcmp_P(attr, PSTR("enabled"))) { - return update ? lv_obj_set_click(obj, is_true(payload)) : hasp_out_int(obj, attr, lv_obj_get_click(obj)); - } - - if(!strcmp_P(attr, PSTR("options"))) { - /* Attributes depending on objecttype */ - lv_obj_type_t list; - lv_obj_get_type(obj, &list); - const char * objtype = list.type[0]; - - if(check_obj_type(objtype, LV_HASP_DDLIST)) { - if(update) { - lv_dropdown_set_options(obj, payload); - } else { - hasp_out_str(obj, attr, lv_dropdown_get_options(obj)); - } - return; - - } else if(check_obj_type(objtype, LV_HASP_ROLLER)) { - if(update) { - lv_roller_ext_t * ext = (lv_roller_ext_t *)lv_obj_get_ext_attr(obj); - lv_roller_set_options(obj, payload, ext->mode); - } else { - hasp_out_str(obj, attr, lv_roller_get_options(obj)); - } - return; - } - } - - hasp_local_style_attr(obj, attr, payload, update); -} - // OK // @param update bool: change the value if true, dispatch value if false void hasp_process_obj_attribute(lv_obj_t * obj, const char * attr_p, const char * payload, bool update) { if(!obj) return Log.warning(F("HASP: Unknown object")); + int16_t val = atoi(payload); char * attr = (char *)attr_p; if(*attr == '.') attr++; // strip leading '.' - switch(strlen(attr)) { - case 1: - hasp_process_obj_attribute1(obj, attr, payload, update); + Log.trace("ATTR: %s => %d", attr, sdbm(attr)); + + /* 16-bit Hash Lookup Table */ + switch(sdbm(attr)) { + case ATTR_X: + return update ? lv_obj_set_x(obj, val) : hasp_out_int(obj, attr, lv_obj_get_x(obj)); + + case ATTR_Y: + return update ? lv_obj_set_y(obj, val) : hasp_out_int(obj, attr, lv_obj_get_y(obj)); + + case ATTR_W: + return update ? lv_obj_set_width(obj, val) : hasp_out_int(obj, attr, lv_obj_get_width(obj)); + + case ATTR_H: + return update ? lv_obj_set_height(obj, val) : hasp_out_int(obj, attr, lv_obj_get_height(obj)); + + case ATTR_ID: + return update ? (void)(obj->user_data = (uint8_t)val) : hasp_out_int(obj, attr, obj->user_data); + + case ATTR_VIS: + return update ? lv_obj_set_hidden(obj, !is_true(payload)) + : hasp_out_int(obj, attr, !lv_obj_get_hidden(obj)); + + case ATTR_TXT: + return hasp_process_obj_attribute_txt(obj, attr, payload, update); + + case ATTR_VAL: + return hasp_process_obj_attribute_val(obj, attr, payload, update); + + case ATTR_MIN: + return hasp_process_obj_attribute_range(obj, attr, payload, update, true, false); + + case ATTR_MAX: + return hasp_process_obj_attribute_range(obj, attr, payload, update, false, true); + + case ATTR_HIDDEN: + return update ? lv_obj_set_hidden(obj, is_true(payload)) : hasp_out_int(obj, attr, lv_obj_get_hidden(obj)); + + case ATTR_ROWS: + if(check_obj_type(obj, LV_HASP_ROLLER)) { + return update ? lv_roller_set_visible_row_count(obj, (uint8_t)val) + : hasp_out_int(obj, attr, lv_roller_get_visible_row_count(obj)); + } break; - case 2: - hasp_process_obj_attribute2(obj, attr, payload, update); + + case ATTR_RECT: + if(check_obj_type(obj, LV_HASP_CPICKER)) { + lv_cpicker_set_type(obj, is_true(payload) ? LV_CPICKER_TYPE_RECT : LV_CPICKER_TYPE_DISC); + return; + } break; - case 4: - hasp_process_obj_attribute4(obj, attr, payload, update); + + case ATTR_MODE: + if(check_obj_type(obj, LV_HASP_BUTTON)) { + lv_obj_t * label = FindButtonLabel(obj); + if(label) { + hasp_process_label_long_mode(label, payload, update); + lv_obj_set_width(label, lv_obj_get_width(obj)); + } + return; + } + + if(check_obj_type(obj, LV_HASP_LABEL)) { + hasp_process_label_long_mode(obj, payload, update); + return; + } break; - case 3: - hasp_process_obj_attribute3(obj, attr, payload, update); - break; - case 6: - hasp_process_obj_attribute6(obj, attr, payload, update); - break; - case 7: - hasp_process_obj_attribute7(obj, attr, payload, update); - break; - default: - hasp_local_style_attr(obj, attr, payload, update); // all other lengths + + case ATTR_TOGGLE: + if(check_obj_type(obj, LV_HASP_BUTTON)) { + if(update) { + bool toggle = is_true(payload); + lv_btn_set_checkable(obj, toggle); + lv_obj_set_event_cb(obj, toggle ? toggle_event_handler : btn_event_handler); + } else { + hasp_out_int(obj, attr, lv_btn_get_checkable(obj)); + } + return; + } + break; // not a toggle object + + case ATTR_OPACITY: + return update ? lv_obj_set_style_local_opa_scale(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, val) + : hasp_out_int(obj, attr, lv_obj_get_style_opa_scale(obj, LV_OBJ_PART_MAIN)); + + case ATTR_ENABLED: + return update ? lv_obj_set_click(obj, is_true(payload)) : hasp_out_int(obj, attr, lv_obj_get_click(obj)); + + case ATTR_OPTIONS: + if(check_obj_type(obj, LV_HASP_DDLIST)) { + if(update) { + lv_dropdown_set_options(obj, payload); + } else { + hasp_out_str(obj, attr, lv_dropdown_get_options(obj)); + } + return; + } + + if(check_obj_type(obj, LV_HASP_ROLLER)) { + if(update) { + lv_roller_ext_t * ext = (lv_roller_ext_t *)lv_obj_get_ext_attr(obj); + lv_roller_set_options(obj, payload, ext->mode); + } else { + hasp_out_str(obj, attr, lv_roller_get_options(obj)); + } + return; + } + break; // not a options object + + // default: + // hasp_local_style_attr(obj, attr, payload, update); } + + hasp_local_style_attr(obj, attr, payload, update); } /* ************************** @@ -812,17 +811,63 @@ static inline bool only_digits(const char * s) return strlen(s) == digits; } -static inline void hasp_out_int(lv_obj_t * obj, const char * attr, uint32_t val) +static void hasp_out_int(lv_obj_t * obj, const char * attr, uint32_t val) { hasp_send_obj_attribute_int(obj, attr, val); } -static inline void hasp_out_str(lv_obj_t * obj, const char * attr, const char * data) +static void hasp_out_str(lv_obj_t * obj, const char * attr, const char * data) { hasp_send_obj_attribute_str(obj, attr, data); } -static inline void hasp_out_color(lv_obj_t * obj, const char * attr, lv_color_t color) +static void hasp_out_color(lv_obj_t * obj, const char * attr, lv_color_t color) { hasp_send_obj_attribute_color(obj, attr, color); } + +bool check_obj_type(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) +{ + lvobjtype += 3; // skip "lv_" + + switch(haspobjtype) { + 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_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_CONTAINER: + return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) + default: + return false; + } +} + +bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype) +{ + lv_obj_type_t list; + lv_obj_get_type(obj, &list); + const char * objtype = list.type[0]; + return check_obj_type(objtype, haspobjtype); +} \ No newline at end of file diff --git a/src/hasp_attribute.h b/src/hasp_attribute.h index 6af6e0e5..7d389ae2 100644 --- a/src/hasp_attribute.h +++ b/src/hasp_attribute.h @@ -2,6 +2,7 @@ #define HASP_ATTR_SET_H #include "lvgl.h" +#include "hasp.h" #ifdef __cplusplus extern "C" { @@ -13,4 +14,217 @@ void hasp_process_obj_attribute(lv_obj_t * obj, const char * attr_p, const char } /* extern "C" */ #endif +static void hasp_out_int(lv_obj_t * obj, const char * attr, uint32_t val); +static void hasp_out_str(lv_obj_t * obj, const char * attr, const char * data); +static void hasp_out_color(lv_obj_t * obj, const char * attr, lv_color_t color); + +bool check_obj_type(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype); +bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype); + +#define _HASP_ATTRIBUTE(prop_name, func_name, value_type) \ + static inline void attribute_##func_name(lv_obj_t * obj, uint8_t part, lv_state_t state, bool update, \ + const char * attr, value_type val) \ + { \ + if(update) { \ + return lv_obj_set_style_local_##func_name(obj, part, state, (value_type)val); \ + } else { \ + value_type temp; \ + lv_obj_get_style_local_##func_name(obj, part, state, &temp); \ + return hasp_out_int(obj, attr, temp); \ + } \ + } + +_HASP_ATTRIBUTE(RADIUS, radius, lv_style_int_t) +_HASP_ATTRIBUTE(CLIP_CORNER, clip_corner, bool) +_HASP_ATTRIBUTE(SIZE, size, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSFORM_WIDTH, transform_width, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSFORM_HEIGHT, transform_height, lv_style_int_t) +_HASP_ATTRIBUTE(OPA_SCALE, opa_scale, lv_opa_t) +_HASP_ATTRIBUTE(PAD_TOP, pad_top, lv_style_int_t) +_HASP_ATTRIBUTE(PAD_BOTTOM, pad_bottom, lv_style_int_t) +_HASP_ATTRIBUTE(PAD_LEFT, pad_left, lv_style_int_t) +_HASP_ATTRIBUTE(PAD_RIGHT, pad_right, lv_style_int_t) +_HASP_ATTRIBUTE(PAD_INNER, pad_inner, lv_style_int_t) +_HASP_ATTRIBUTE(BG_BLEND_MODE, bg_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(BG_MAIN_STOP, bg_main_stop, lv_style_int_t) +_HASP_ATTRIBUTE(BG_GRAD_STOP, bg_grad_stop, lv_style_int_t) +_HASP_ATTRIBUTE(BG_GRAD_DIR, bg_grad_dir, lv_grad_dir_t) +//_HASP_ATTRIBUTE(BG_COLOR, bg_color, lv_color_t, _color, nonscalar) +//_HASP_ATTRIBUTE(BG_GRAD_COLOR, bg_grad_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(BG_OPA, bg_opa, lv_opa_t) +_HASP_ATTRIBUTE(BORDER_WIDTH, border_width, lv_style_int_t) +_HASP_ATTRIBUTE(BORDER_SIDE, border_side, lv_border_side_t) +_HASP_ATTRIBUTE(BORDER_BLEND_MODE, border_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(BORDER_POST, border_post, bool) +//_HASP_ATTRIBUTE(BORDER_COLOR, border_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(BORDER_OPA, border_opa, lv_opa_t) +_HASP_ATTRIBUTE(OUTLINE_WIDTH, outline_width, lv_style_int_t) +_HASP_ATTRIBUTE(OUTLINE_PAD, outline_pad, lv_style_int_t) +_HASP_ATTRIBUTE(OUTLINE_BLEND_MODE, outline_blend_mode, lv_blend_mode_t) +//_HASP_ATTRIBUTE(OUTLINE_COLOR, outline_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(OUTLINE_OPA, outline_opa, lv_opa_t) +_HASP_ATTRIBUTE(SHADOW_WIDTH, shadow_width, lv_style_int_t) +_HASP_ATTRIBUTE(SHADOW_OFS_X, shadow_ofs_x, lv_style_int_t) +_HASP_ATTRIBUTE(SHADOW_OFS_Y, shadow_ofs_y, lv_style_int_t) +_HASP_ATTRIBUTE(SHADOW_SPREAD, shadow_spread, lv_style_int_t) +_HASP_ATTRIBUTE(SHADOW_BLEND_MODE, shadow_blend_mode, lv_blend_mode_t) +//_HASP_ATTRIBUTE(SHADOW_COLOR, shadow_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(SHADOW_OPA, shadow_opa, lv_opa_t) +_HASP_ATTRIBUTE(PATTERN_REPEAT, pattern_repeat, bool) +_HASP_ATTRIBUTE(PATTERN_BLEND_MODE, pattern_blend_mode, lv_blend_mode_t) +//_HASP_ATTRIBUTE(PATTERN_RECOLOR, pattern_recolor, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(PATTERN_OPA, pattern_opa, lv_opa_t) +_HASP_ATTRIBUTE(PATTERN_RECOLOR_OPA, pattern_recolor_opa, lv_opa_t) +//_HASP_ATTRIBUTE(PATTERN_IMAGE, pattern_image, const void *, _data_ptr, scalar) +_HASP_ATTRIBUTE(VALUE_LETTER_SPACE, value_letter_space, lv_style_int_t) +_HASP_ATTRIBUTE(VALUE_LINE_SPACE, value_line_space, lv_style_int_t) +_HASP_ATTRIBUTE(VALUE_BLEND_MODE, value_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(VALUE_OFS_X, value_ofs_x, lv_style_int_t) +_HASP_ATTRIBUTE(VALUE_OFS_Y, value_ofs_y, lv_style_int_t) +_HASP_ATTRIBUTE(VALUE_ALIGN, value_align, lv_align_t) +//_HASP_ATTRIBUTE(VALUE_COLOR, value_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(VALUE_OPA, value_opa, lv_opa_t) +//_HASP_ATTRIBUTE(VALUE_FONT, value_font, const lv_font_t *, _data_ptr, scalar) +//_HASP_ATTRIBUTE(VALUE_STR, value_str, const char *, _data_ptr, scalar) +_HASP_ATTRIBUTE(TEXT_LETTER_SPACE, text_letter_space, lv_style_int_t) +_HASP_ATTRIBUTE(TEXT_LINE_SPACE, text_line_space, lv_style_int_t) +_HASP_ATTRIBUTE(TEXT_DECOR, text_decor, lv_text_decor_t) +_HASP_ATTRIBUTE(TEXT_BLEND_MODE, text_blend_mode, lv_blend_mode_t) +//_HASP_ATTRIBUTE(TEXT_COLOR, text_color, lv_color_t, _color, nonscalar) +//_HASP_ATTRIBUTE(TEXT_SEL_COLOR, text_sel_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(TEXT_OPA, text_opa, lv_opa_t) +//_HASP_ATTRIBUTE(TEXT_FONT, text_font, const lv_font_t *, _data_ptr, scalar) +_HASP_ATTRIBUTE(LINE_WIDTH, line_width, lv_style_int_t) +_HASP_ATTRIBUTE(LINE_BLEND_MODE, line_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(LINE_DASH_WIDTH, line_dash_width, lv_style_int_t) +_HASP_ATTRIBUTE(LINE_DASH_GAP, line_dash_gap, lv_style_int_t) +_HASP_ATTRIBUTE(LINE_ROUNDED, line_rounded, bool) +//_HASP_ATTRIBUTE(LINE_COLOR, line_color, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(LINE_OPA, line_opa, lv_opa_t) +_HASP_ATTRIBUTE(IMAGE_BLEND_MODE, image_blend_mode, lv_blend_mode_t) +//_HASP_ATTRIBUTE(IMAGE_RECOLOR, image_recolor, lv_color_t, _color, nonscalar) +_HASP_ATTRIBUTE(IMAGE_OPA, image_opa, lv_opa_t) +_HASP_ATTRIBUTE(IMAGE_RECOLOR_OPA, image_recolor_opa, lv_opa_t) +_HASP_ATTRIBUTE(TRANSITION_TIME, transition_time, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_DELAY, transition_delay, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_PROP_1, transition_prop_1, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_PROP_2, transition_prop_2, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_PROP_3, transition_prop_3, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_PROP_4, transition_prop_4, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_PROP_5, transition_prop_5, lv_style_int_t) +_HASP_ATTRIBUTE(TRANSITION_PROP_6, transition_prop_6, lv_style_int_t) + +_HASP_ATTRIBUTE(SCALE_WIDTH, scale_width, lv_style_int_t) +_HASP_ATTRIBUTE(SCALE_BORDER_WIDTH, scale_border_width, lv_style_int_t) +_HASP_ATTRIBUTE(SCALE_END_BORDER_WIDTH, scale_end_border_width, lv_style_int_t) +_HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t) +//_HASP_ATTRIBUTE(SCALE_GRAD_COLOR, scale_grad_color, lv_color_t, _color, nonscalar) +//_HASP_ATTRIBUTE(SCALE_END_COLOR, scale_end_color, lv_color_t, _color, nonscalar) + +/* attribute hashes */ +#define ATTR_SIZE 16417 +#define ATTR_BG_OPA 48966 +#define ATTR_RADIUS 20786 +#define ATTR_PAD_TOP 59081 +#define ATTR_LINE_OPA 24501 +#define ATTR_BG_COLOR 64969 +#define ATTR_PAD_LEFT 43123 +#define ATTR_TEXT_OPA 37166 +#define ATTR_IMAGE_OPA 58140 +#define ATTR_OPA_SCALE 64875 +#define ATTR_PAD_INNER 9930 +#define ATTR_PAD_RIGHT 65104 +#define ATTR_BORDER_OPA 2061 +#define ATTR_VALUE_OPA 50482 +#define ATTR_LINE_WIDTH 25467 +#define ATTR_LINE_COLOR 22200 +#define ATTR_PAD_BOTTOM 3767 +#define ATTR_TEXT_FONT 22465 +#define ATTR_VALUE_STR 1091 +#define ATTR_SHADOW_OPA 38401 +#define ATTR_TEXT_COLOR 23473 +#define ATTR_TEXT_DECOR 1971 +#define ATTR_BORDER_SIDE 53962 +#define ATTR_VALUE_FONT 9405 +#define ATTR_CLIP_CORNER 9188 +#define ATTR_PATTERN_OPA 43633 +#define ATTR_OUTLINE_OPA 23011 +#define ATTR_BORDER_POST 49491 +#define ATTR_OUTLINE_PAD 26038 +#define ATTR_SCALE_WIDTH 36017 +#define ATTR_BG_GRAD_DIR 41782 +#define ATTR_VALUE_ALIGN 27895 +#define ATTR_VALUE_COLOR 52661 +#define ATTR_BG_GRAD_STOP 4025 +#define ATTR_VALUE_OFS_X 21415 +#define ATTR_VALUE_OFS_Y 21416 +#define ATTR_BG_MAIN_STOP 63118 +#define ATTR_BORDER_WIDTH 24531 +#define ATTR_LINE_ROUNDED 15042 +#define ATTR_BORDER_COLOR 21264 +#define ATTR_BG_BLEND_MODE 31147 +#define ATTR_BG_GRAD_COLOR 44140 +#define ATTR_SHADOW_WIDTH 13255 +#define ATTR_IMAGE_RECOLOR 52204 +#define ATTR_SHADOW_COLOR 9988 +#define ATTR_LINE_DASH_GAP 49332 +#define ATTR_OUTLINE_WIDTH 9897 +#define ATTR_SHADOW_OFS_X 44278 +#define ATTR_SHADOW_OFS_Y 44279 +#define ATTR_PATTERN_IMAGE 61292 +#define ATTR_SHADOW_SPREAD 21138 +#define ATTR_OUTLINE_COLOR 6630 +#define ATTR_TEXT_SEL_COLOR 32076 +#define ATTR_LINE_DASH_WIDTH 32676 +#define ATTR_PATTERN_REPEAT 31338 +#define ATTR_LINE_BLEND_MODE 60284 +#define ATTR_TEXT_LINE_SPACE 54829 +#define ATTR_TEXT_BLEND_MODE 32195 +#define ATTR_TRANSITION_PROP_1 49343 +#define ATTR_TRANSITION_PROP_2 49344 +#define ATTR_SCALE_END_COLOR 44074 +#define ATTR_TRANSITION_PROP_3 49345 +#define ATTR_TRANSFORM_WIDTH 48627 +#define ATTR_TRANSITION_PROP_4 49346 +#define ATTR_TRANSITION_PROP_5 49347 +#define ATTR_TRANSITION_PROP_6 49348 +#define ATTR_TRANSITION_TIME 26263 +#define ATTR_PATTERN_RECOLOR 7745 +#define ATTR_TRANSITION_PATH 43343 +#define ATTR_IMAGE_BLEND_MODE 11349 +#define ATTR_VALUE_LINE_SPACE 26921 +#define ATTR_BORDER_BLEND_MODE 23844 +#define ATTR_VALUE_BLEND_MODE 4287 +#define ATTR_IMAGE_RECOLOR_OPA 43949 +#define ATTR_TRANSITION_DELAY 64537 +#define ATTR_SCALE_GRAD_COLOR 47239 +#define ATTR_SHADOW_BLEND_MODE 64048 +#define ATTR_TRANSFORM_HEIGHT 55994 +#define ATTR_TEXT_LETTER_SPACE 62079 +#define ATTR_OUTLINE_BLEND_MODE 25038 +#define ATTR_PATTERN_BLEND_MODE 43456 +#define ATTR_SCALE_BORDER_WIDTH 2440 +#define ATTR_VALUE_LETTER_SPACE 51067 +#define ATTR_PATTERN_RECOLOR_OPA 35074 +#define ATTR_SCALE_END_LINE_WIDTH 30324 +#define ATTR_SCALE_END_BORDER_WIDTH 34380 +#define ATTR_X 120 +#define ATTR_Y 121 +#define ATTR_W 119 +#define ATTR_H 104 +#define ATTR_OPTIONS 29886 +#define ATTR_ENABLED 28193 +#define ATTR_OPACITY 10155 +#define ATTR_TOGGLE 38580 +#define ATTR_HIDDEN 11082 +#define ATTR_VIS 16320 +#define ATTR_MODE 45891 +#define ATTR_RECT 11204 +#define ATTR_ROWS 52153 +#define ATTR_MIN 46130 +#define ATTR_MAX 45636 +#define ATTR_VAL 15809 +#define ATTR_TXT 9328 +#define ATTR_ID 6715 + #endif