diff --git a/include/lv_conf_v8.h b/include/lv_conf_v8.h index e6ea413f..32e47f2f 100644 --- a/include/lv_conf_v8.h +++ b/include/lv_conf_v8.h @@ -581,9 +581,15 @@ typedef void * lv_font_user_data_t; * LV_OBJ SETTINGS *==================*/ +typedef struct { + uint8_t objid:5; + uint8_t groupid:3; + uint8_t id; +} lv_obj_user_data_t; + #if LV_USE_USER_DATA /*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/ -typedef uint8_t lv_obj_user_data_t; +//typedef hasp_obj_user_data_t lv_obj_user_data_t; /*Provide a function to free user data*/ #define LV_USE_USER_DATA_FREE 0 #if LV_USE_USER_DATA_FREE diff --git a/platformio.ini b/platformio.ini index 8bc0f7a9..e802f77c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -58,23 +58,23 @@ build_flags = ;-D DISABLE_LOGGING ${override.build_flags} -D HASP_VERSION_MAJOR=0 - -D HASP_VERSION_MINOR=2 - -D HASP_VERSION_REVISION=1129 + -D HASP_VERSION_MINOR=3 + -D HASP_VERSION_REVISION=1207 ; -- Shared library dependencies in all environments +; Warning : don't put comments after github links => causes infinite download loop lib_deps = - https://github.com/fvanroie/lvgl.git#dev ; lvgl 8.0.0 dev - https://github.com/fvanroie/lv_components ;lvgl widgets 8.0.0 - - ;lvgl/lvgl @ ^7.7.2 ; from PIO library - bodmer/TFT_eSPI @ 2.3.4 ; Tft SPI drivers EXACT version 2.3.5 has compile error bxparks/AceButton @ ^1.7.1 ; GPIO button library bblanchon/ArduinoJson @ ^6.17.2 ; Json(l) parser bblanchon/StreamUtils @ 1.6.0 ; for EEPromStream knolleary/PubSubClient @ ^2.8.0 ; MQTT client - ;https://github.com/Bodmer/TFT_eSPI.git ; ^2.3.5 needed for DMA - https://github.com/fvanroie/ConsoleInput.git - https://github.com/andrethomas/TasmotaSlave.git + git+https://github.com/Bodmer/TFT_eSPI.git ; ztest + git+https://github.com/fvanroie/ConsoleInput.git + git+https://github.com/andrethomas/TasmotaSlave.git + git+https://github.com/fvanroie/lv_components.git + git+https://github.com/lvgl/lvgl.git#dev + ;lvgl/lvgl @ ^7.7.2 ; from PIO library + ;bodmer/TFT_eSPI @ 2.3.4 ; Tft SPI drivers EXACT version 2.3.5 has compile error ; ------ Unused / Test libraries ;https://github.com/netwizeBE/TFT_eSPI.git ;Syslog@^2.0.0 ; Obsoleted @@ -130,7 +130,7 @@ build_flags= -D ATOMIC_FS_UPDATE ; enabled compressed ota updates -D NO_GLOBAL_HTTPUPDATE ; dont instantiate httpUpdate ; -- lvgl build options ----------------------------- - -D LV_MEM_SIZE=10240U ; 10kB lvgl memory + -D LV_MEM_SIZE=16384U ; 16kB lvgl memory ; -- hasp-lvgl build options ------------------------ -D HASP_USE_WIFI=1 -D HASP_USE_MQTT=1 diff --git a/src/hasp.cpp b/src/hasp.cpp index 7c5d53b2..5ffbbab5 100644 --- a/src/hasp.cpp +++ b/src/hasp.cpp @@ -187,7 +187,7 @@ void haspReconnect() void haspProgressVal(uint8_t val) { lv_obj_t * layer = lv_disp_get_layer_sys(NULL); - lv_obj_t * bar = hasp_find_obj_from_id(255, 10); + lv_obj_t * bar = hasp_find_obj_from_parent_id(get_page_obj(255), (uint8_t)10); if(layer && bar) { if(val == 255) { if(!lv_obj_get_hidden(bar)) { @@ -212,7 +212,7 @@ void haspProgressVal(uint8_t val) // Sets the value string of the global progress bar void haspProgressMsg(const char * msg) { - lv_obj_t * bar = hasp_find_obj_from_id(255, 10); + lv_obj_t * bar = hasp_find_obj_from_parent_id(get_page_obj(255), (uint8_t)10); char value_str[10]; snprintf_P(value_str, sizeof(value_str), PSTR("value_str")); @@ -539,13 +539,14 @@ void haspSetPage(uint8_t pageid) } } +// TODO make this a recursicee function void hasp_set_group_objects(uint8_t groupid, uint8_t eventid, lv_obj_t * src_obj) { bool state = dispatch_get_event_state(eventid); for(uint8_t page = 0; page < HASP_NUM_PAGES; page++) { uint8_t startid = 100 + groupid * 10; // groups start at id 100 for(uint8_t objid = startid; objid < (startid + 10); objid++) { - lv_obj_t * obj = hasp_find_obj_from_id(page, objid); + lv_obj_t * obj = hasp_find_obj_from_parent_id(get_page_obj(page), objid); if(obj && obj != src_obj) { // skip source object, if set lv_obj_set_state(obj, state ? LV_STATE_PRESSED | LV_STATE_CHECKED : LV_STATE_DEFAULT); } diff --git a/src/hasp_attribute.cpp b/src/hasp_attribute.cpp index 4c5a5659..ba629dd1 100644 --- a/src/hasp_attribute.cpp +++ b/src/hasp_attribute.cpp @@ -5,7 +5,7 @@ #include "ArduinoLog.h" #if LVGL_VERSION_MAJOR != 7 -#include "../lv_components/lv_components.h" +#include "../lv_components.h" #endif #include "lvgl.h" #include "lv_conf.h" @@ -977,7 +977,7 @@ void hasp_process_obj_attribute(lv_obj_t * obj, const char * attr_p, const char } case ATTR_ID: - return update ? (void)(obj->user_data = (uint8_t)val) : hasp_out_int(obj, attr, obj->user_data); + return update ? (void)(obj->user_data.id = (uint8_t)val) : hasp_out_int(obj, attr, obj->user_data.id); case ATTR_VIS: return update ? lv_obj_set_hidden(obj, !is_true(payload)) diff --git a/src/hasp_object.cpp b/src/hasp_object.cpp index b470b39c..470d9d24 100644 --- a/src/hasp_object.cpp +++ b/src/hasp_object.cpp @@ -17,7 +17,7 @@ #include "lvgl.h" #if LVGL_VERSION_MAJOR != 7 -#include "../lv_components/lv_components.h" +#include "../lv_components.h" #endif #include "hasp.h" @@ -28,7 +28,7 @@ // ##################### Object Finders ######################################################## -lv_obj_t * hasp_find_obj_from_id(lv_obj_t * parent, uint8_t objid) +lv_obj_t * hasp_find_obj_from_parent_id(lv_obj_t * parent, uint8_t objid) { if(objid == 0 || parent == nullptr) return parent; @@ -36,10 +36,10 @@ lv_obj_t * hasp_find_obj_from_id(lv_obj_t * parent, uint8_t objid) child = lv_obj_get_child(parent, NULL); while(child) { /* child found, return it */ - if(child->user_data && (lv_obj_user_data_t)objid == child->user_data) return child; + if(objid == child->user_data.id) return child; /* check grandchildren */ - lv_obj_t * grandchild = hasp_find_obj_from_id(child, objid); + lv_obj_t * grandchild = hasp_find_obj_from_parent_id(child, objid); if(grandchild) return grandchild; /* grandchild found, return it */ /* check tabs */ @@ -52,7 +52,7 @@ lv_obj_t * hasp_find_obj_from_id(lv_obj_t * parent, uint8_t objid) if(tab->user_data && (lv_obj_user_data_t)objid == tab->user_data) return tab; /* tab found, return it */ /* check grandchildren */ - grandchild = hasp_find_obj_from_id(tab, objid); + grandchild = hasp_find_obj_from_parent_id(tab, objid); if(grandchild) return grandchild; /* grandchild found, return it */ } #endif @@ -64,16 +64,17 @@ lv_obj_t * hasp_find_obj_from_id(lv_obj_t * parent, uint8_t objid) return NULL; } -lv_obj_t * hasp_find_obj_from_id(uint8_t pageid, uint8_t objid) -{ - return hasp_find_obj_from_id(get_page_obj(pageid), objid); -} +// lv_obj_t * hasp_find_obj_from_page_id(uint8_t pageid, uint8_t objid) +// { +// return hasp_find_obj_from_parent_id(get_page_obj(pageid), objid); +// } -bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, lv_obj_user_data_t * objid) +bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, uint8_t * objid) { if(!get_page_id(obj, pageid)) return false; - if(!(obj->user_data > 0)) return false; - memcpy(objid, &obj->user_data, sizeof(lv_obj_user_data_t)); + if(!(obj->user_data.id > 0)) return false; + // memcpy(objid, &obj->user_data.id, sizeof(lv_obj_user_data_t)); + *objid = obj->user_data.id; return true; } @@ -180,7 +181,7 @@ void hasp_object_tree(lv_obj_t * parent, uint8_t pageid, uint16_t level) child = lv_obj_get_child(parent, NULL); while(child) { /* child found, process it */ - if(child->user_data) hasp_object_tree(child, pageid, level + 1); + hasp_object_tree(child, pageid, level + 1); /* try next sibling */ child = lv_obj_get_child(parent, child); @@ -265,33 +266,27 @@ static inline void hasp_send_obj_attribute_txt(lv_obj_t * obj, const char * txt) void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event) { uint8_t eventid; - char buffer[6]; switch(event) { case LV_EVENT_PRESSED: eventid = HASP_EVENT_DOWN; - memcpy_P(buffer, PSTR("DOWN"), sizeof(buffer)); break; case LV_EVENT_CLICKED: // UP = the same object was release then was pressed and press was not lost! eventid = HASP_EVENT_UP; - memcpy_P(buffer, PSTR("UP"), sizeof(buffer)); break; case LV_EVENT_SHORT_CLICKED: eventid = HASP_EVENT_SHORT; - memcpy_P(buffer, PSTR("SHORT"), sizeof(buffer)); break; case LV_EVENT_LONG_PRESSED: eventid = HASP_EVENT_LONG; - memcpy_P(buffer, PSTR("LONG"), sizeof(buffer)); break; case LV_EVENT_LONG_PRESSED_REPEAT: - eventid = HASP_EVENT_HOLD; - memcpy_P(buffer, PSTR("HOLD"), sizeof(buffer)); - break; + return; // we don't care about hold + // eventid = HASP_EVENT_HOLD; + // break; case LV_EVENT_PRESS_LOST: eventid = HASP_EVENT_LOST; - memcpy_P(buffer, PSTR("LOST"), sizeof(buffer)); break; case LV_EVENT_PRESSING: case LV_EVENT_FOCUSED: @@ -312,15 +307,20 @@ void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event) return; } - guiCheckSleep(); + guiCheckSleep(); // wakeup? + dispatch_send_object_event(haspGetPage(), (uint8_t)obj->user_data.id, eventid); +} +/** + * Called when a press on the system layer is detected + * @param obj pointer to a button matrix + * @param event type of event that occured + */ +void wakeup_event_handler(lv_obj_t * obj, lv_event_t event) +{ if(obj == lv_disp_get_layer_sys(NULL)) { -#if HASP_USE_MQTT > 0 - mqtt_send_state(F("wakeuptouch"), buffer); // TODO: enable wakeuptouch -#endif - } else { - // hasp_send_obj_attribute_event(obj, buffer); - dispatch_send_object_event(haspGetPage(), (uint8_t)obj->user_data, eventid); + guiCheckSleep(); // wakeup? + lv_obj_set_click(obj, false); // disable fist click } } @@ -331,7 +331,10 @@ void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event) */ static void btnmap_event_handler(lv_obj_t * obj, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) hasp_send_obj_attribute_val(obj, lv_btnmatrix_get_active_btn(obj)); + if(event == LV_EVENT_VALUE_CHANGED) { + guiCheckSleep(); // wakeup? + hasp_send_obj_attribute_val(obj, lv_btnmatrix_get_active_btn(obj)); + } } /** @@ -342,10 +345,10 @@ static void btnmap_event_handler(lv_obj_t * obj, lv_event_t event) static void table_event_handler(lv_obj_t * obj, lv_event_t event) { if(event == LV_EVENT_VALUE_CHANGED) { + guiCheckSleep(); // wakeup? + uint16_t row; uint16_t col; - guiCheckSleep(); - if(lv_table_get_pressed_cell(obj, &row, &col) == LV_RES_OK) hasp_send_obj_attribute_val(obj, row); } } @@ -358,10 +361,7 @@ static void table_event_handler(lv_obj_t * obj, lv_event_t event) void IRAM_ATTR toggle_event_handler(lv_obj_t * obj, lv_event_t event) { if(event == LV_EVENT_VALUE_CHANGED) { - // bool toggled = lv_btn_get_state(obj) == LV_BTN_STATE_CHECKED_PRESSED || - // lv_btn_get_state(obj) == LV_BTN_STATE_CHECKED_RELEASED; - guiCheckSleep(); - + guiCheckSleep(); // wakeup? hasp_send_obj_attribute_val(obj, lv_checkbox_is_checked(obj)); } } @@ -373,7 +373,10 @@ void IRAM_ATTR toggle_event_handler(lv_obj_t * obj, lv_event_t event) */ static void switch_event_handler(lv_obj_t * obj, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) hasp_send_obj_attribute_val(obj, lv_switch_get_state(obj)); + if(event == LV_EVENT_VALUE_CHANGED) { + guiCheckSleep(); // wakeup? + hasp_send_obj_attribute_val(obj, lv_switch_get_state(obj)); + } } /** @@ -444,7 +447,7 @@ static void roller_event_handler(lv_obj_t * obj, lv_event_t event) // Used in the dispatcher & hasp_new_object void hasp_process_attribute(uint8_t pageid, uint8_t objid, const char * attr, const char * payload) { - if(lv_obj_t * obj = hasp_find_obj_from_id(pageid, objid)) { + if(lv_obj_t * obj = hasp_find_obj_from_parent_id(get_page_obj(pageid), objid)) { hasp_process_obj_attribute(obj, attr, payload, strlen(payload) > 0); } else { Log.warning(TAG_HASP, F("Unknown object p[%d].b[%d]"), pageid, objid); @@ -478,7 +481,7 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) lv_obj_t * parent_obj = page; if(!config[F("parentid")].isNull()) { uint8_t parentid = config[F("parentid")].as(); - parent_obj = hasp_find_obj_from_id(page, parentid); + parent_obj = hasp_find_obj_from_parent_id(page, parentid); if(!parent_obj) { return Log.warning(TAG_HASP, F("Parent ID p[%u].b[%u] not found, skipping..."), pageid, parentid); // parent_obj = page; // don't create on the page instead ?? @@ -487,11 +490,12 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) } } - uint8_t objid = config[F("objid")].as(); - uint8_t id = config[F("id")].as(); + uint8_t groupid = config[F("groupid")].as(); + uint8_t objid = config[F("objid")].as(); + uint8_t id = config[F("id")].as(); /* Define Objects*/ - lv_obj_t * obj = hasp_find_obj_from_id(parent_obj, id); + lv_obj_t * obj = hasp_find_obj_from_parent_id(parent_obj, id); if(obj) { return Log.warning(TAG_HASP, F("Object ID %u already exists!"), id); } @@ -585,11 +589,11 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) if(obj) { lv_obj_t * tab; tab = lv_tabview_add_tab(obj, "tab 1"); - lv_obj_set_user_data(tab, id + 1); + // lv_obj_set_user_data(tab, id + 1); tab = lv_tabview_add_tab(obj, "tab 2"); - lv_obj_set_user_data(tab, id + 2); + // lv_obj_set_user_data(tab, id + 2); tab = lv_tabview_add_tab(obj, "tab 3"); - lv_obj_set_user_data(tab, id + 3); + // lv_obj_set_user_data(tab, id + 3); } break; } @@ -634,7 +638,7 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) #endif /* ----- Range Objects ------ */ case LV_HASP_SLIDER: { - // obj = lv_slider_create(parent_obj, NULL); + // obj = lv_slider_create(parent_obj, NULL); if(obj) { lv_slider_set_range(obj, 0, 100); lv_obj_set_event_cb(obj, slider_event_handler); @@ -725,7 +729,10 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) } /* id tag the object */ - lv_obj_set_user_data(obj, id); + // lv_obj_set_user_data(obj, id); + obj->user_data.id = id; + obj->user_data.objid = objid & 0b11111; + obj->user_data.groupid = groupid & 0b111; /* do not process these attributes */ config.remove(F("page")); @@ -742,7 +749,7 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) } /** testing start **/ - lv_obj_user_data_t temp; + uint8_t temp; if(!hasp_find_id_from_obj(obj, &pageid, &temp)) { return Log.error(TAG_HASP, F("Lost track of the created object, not found!")); } @@ -753,7 +760,7 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id) Log.verbose(TAG_HASP, F(" * p[%u].b[%u] = %s"), pageid, temp, list.type[0]); /* test double-check */ - lv_obj_t * test = hasp_find_obj_from_id(pageid, (uint8_t)temp); + lv_obj_t * test = hasp_find_obj_from_parent_id(get_page_obj(pageid), (uint8_t)temp); if(test != obj) { return Log.error(TAG_HASP, F("Objects DO NOT match!")); } diff --git a/src/hasp_object.h b/src/hasp_object.h index c6cfdf04..c914712e 100644 --- a/src/hasp_object.h +++ b/src/hasp_object.h @@ -50,9 +50,9 @@ enum lv_hasp_obj_type_t { void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id); -lv_obj_t * hasp_find_obj_from_id(lv_obj_t * parent, uint8_t objid); -lv_obj_t * hasp_find_obj_from_id(uint8_t pageid, uint8_t objid); -bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, lv_obj_user_data_t * objid); +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(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); @@ -64,5 +64,6 @@ void hasp_process_attribute(uint8_t pageid, uint8_t objid, const char * attr, co 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 wakeup_event_handler(lv_obj_t * obj, lv_event_t event); #endif \ No newline at end of file diff --git a/src/hasp_oobe.cpp b/src/hasp_oobe.cpp index d0b20ae5..f8578134 100644 --- a/src/hasp_oobe.cpp +++ b/src/hasp_oobe.cpp @@ -8,7 +8,7 @@ #include "lvgl.h" #if LVGL_VERSION_MAJOR != 7 -#include "../lv_components/lv_components.h" +#include "../lv_components.h" #endif #include "hasp_object.h" @@ -62,14 +62,14 @@ static void kb_event_cb(lv_obj_t * event_kb, lv_event_t event) char pass[32]; lv_obj_t * obj; - obj = hasp_find_obj_from_id(oobepage[1], 10); + obj = hasp_find_obj_from_parent_id(oobepage[1], (uint8_t)10); if(obj) { strncpy(ssid, lv_textarea_get_text(obj), sizeof(ssid)); settings[FPSTR(F_CONFIG_SSID)] = ssid; if(oobekb != NULL) lv_keyboard_set_textarea(oobekb, obj); } - obj = hasp_find_obj_from_id(oobepage[1], 20); + obj = hasp_find_obj_from_parent_id(oobepage[1],(uint8_t) 20); if(obj) { strncpy(pass, lv_textarea_get_text(obj), sizeof(pass)); settings[FPSTR(F_CONFIG_PASS)] = pass; @@ -106,9 +106,9 @@ static void ta_event_cb(lv_obj_t * ta, lv_event_t event) if(str[0] == '\n') { lv_obj_t * obj; - obj = hasp_find_obj_from_id(oobepage[1], 10); + obj = hasp_find_obj_from_parent_id(oobepage[1], (uint8_t)10); if(ta == obj) { // now ssid, goto pass - obj = hasp_find_obj_from_id(oobepage[1], 20); + obj = hasp_find_obj_from_parent_id(oobepage[1], (uint8_t)20); } if(oobekb && obj) { @@ -222,7 +222,8 @@ static void oobeSetupSsid(void) lv_textarea_set_pwd_mode(pwd_ta, true); lv_textarea_set_one_line(pwd_ta, true); lv_textarea_set_cursor_hidden(pwd_ta, true); - lv_obj_set_user_data(pwd_ta, 20); + lv_obj_user_data_t udata = (lv_obj_user_data_t){20, 1, 0}; + lv_obj_set_user_data(pwd_ta, udata); lv_obj_set_width(pwd_ta, disp->driver.hor_res - leftmargin - 20 - lv_obj_get_height(pwd_ta)); lv_obj_set_event_cb(pwd_ta, ta_event_cb); lv_obj_align(pwd_ta, NULL, LV_ALIGN_CENTER, leftmargin / 2 - lv_obj_get_height(pwd_ta) / 2, topmargin - voffset); @@ -242,7 +243,7 @@ static void oobeSetupSsid(void) lv_obj_set_style_local_text_font(oneline_ta, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, defaultfont); lv_textarea_set_pwd_mode(oneline_ta, false); - lv_obj_set_user_data(oneline_ta, 10); + lv_obj_set_user_data(oneline_ta, (lv_obj_user_data_t){10, 1, 0}); lv_obj_align(oneline_ta, pwd_ta, LV_ALIGN_OUT_TOP_MID, 0, topmargin); /* Create a label and position it above the text box */ diff --git a/src/lv_theme_hasp.cpp b/src/lv_theme_hasp.cpp index 2881d123..c8ed2e1c 100644 --- a/src/lv_theme_hasp.cpp +++ b/src/lv_theme_hasp.cpp @@ -10,7 +10,7 @@ #include "lv_conf.h" /*To see all the widgets*/ #include "lv_theme_hasp.h" /*To see all the widgets*/ #if LVGL_VERSION_MAJOR != 7 -#include "../lv_components/lv_components.h" +#include "../lv_components.h" #endif //#if LV_USE_THEME_HASP