mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-26 20:56:37 +00:00
Implement obj_get_type, code cleanup and msgbox fix
This commit is contained in:
parent
9bf154ccb0
commit
70b6f983e9
@ -17,12 +17,12 @@
|
||||
|
||||
#include "hasplib.h"
|
||||
|
||||
const char** btnmatrix_default_map; // memory pointer to lvgl default btnmatrix map
|
||||
const char* msgbox_default_map[] = {"OK"
|
||||
""}; // memory pointer to hasp default msgbox map
|
||||
const char** btnmatrix_default_map; // memory pointer to lvgl default btnmatrix map
|
||||
const char* msgbox_default_map[] = {"OK", ""}; // memory pointer to hasp default msgbox map
|
||||
|
||||
// ##################### Object Finders ########################################################
|
||||
|
||||
// Return a child object from a parent with a specific objid
|
||||
lv_obj_t* hasp_find_obj_from_parent_id(lv_obj_t* parent, uint8_t objid)
|
||||
{
|
||||
if(objid == 0 || parent == nullptr) return parent;
|
||||
@ -38,7 +38,7 @@ lv_obj_t* hasp_find_obj_from_parent_id(lv_obj_t* parent, uint8_t objid)
|
||||
if(grandchild) return grandchild; /* grandchild found, return it */
|
||||
|
||||
/* check tabs */
|
||||
if(check_obj_type(child, LV_HASP_TABVIEW)) {
|
||||
if(obj_check_type(child, LV_HASP_TABVIEW)) {
|
||||
uint16_t tabcount = lv_tabview_get_tab_count(child);
|
||||
for(uint16_t i = 0; i < tabcount; i++) {
|
||||
lv_obj_t* tab = lv_tabview_get_tab(child, i);
|
||||
@ -57,11 +57,13 @@ lv_obj_t* hasp_find_obj_from_parent_id(lv_obj_t* parent, uint8_t objid)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// 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);
|
||||
// }
|
||||
// Return the object with a specific pageid and objid
|
||||
lv_obj_t* hasp_find_obj_from_page_id(uint8_t pageid, uint8_t objid)
|
||||
{
|
||||
return hasp_find_obj_from_parent_id(haspPages.get_obj(pageid), objid);
|
||||
}
|
||||
|
||||
// Return the pageid and objid of an object
|
||||
bool hasp_find_id_from_obj(lv_obj_t* obj, uint8_t* pageid, uint8_t* objid)
|
||||
{
|
||||
if(!obj || !haspPages.get_id(obj, pageid)) return false;
|
||||
@ -70,87 +72,13 @@ bool hasp_find_id_from_obj(lv_obj_t* obj, uint8_t* pageid, uint8_t* objid)
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an lvgl object typename corresponds to a given HASP object ID
|
||||
* @param lvobjtype a char* to a string
|
||||
* @param haspobjtype the HASP object ID to check against
|
||||
* @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_"
|
||||
|
||||
// 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_DROPDOWN:
|
||||
// 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_SPINNER:
|
||||
// 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;
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* Get the object type name of an object
|
||||
* @param obj an lv_obj_t* of the object to check its type
|
||||
* @return name of the object type
|
||||
* @note
|
||||
*/
|
||||
const char* get_obj_type_name(lv_obj_t* obj)
|
||||
const char* obj_get_type_name(lv_obj_t* obj)
|
||||
{
|
||||
lv_obj_type_t list;
|
||||
lv_obj_get_type(obj, &list);
|
||||
@ -165,7 +93,7 @@ const char* get_obj_type_name(lv_obj_t* obj)
|
||||
* @return true or false wether the types match
|
||||
* @note
|
||||
*/
|
||||
bool check_obj_type(lv_obj_t* obj, lv_hasp_obj_type_t haspobjtype)
|
||||
bool obj_check_type(lv_obj_t* obj, lv_hasp_obj_type_t haspobjtype)
|
||||
{
|
||||
#if 1
|
||||
return obj->user_data.objid == (uint8_t)haspobjtype;
|
||||
@ -173,19 +101,28 @@ 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);
|
||||
return obj_check_type(objtype, haspobjtype);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the hasp object type of a given LVGL object
|
||||
* @param obj an lv_obj_t* of the object to check its type
|
||||
* @return lv_hasp_obj_type_t
|
||||
* @note
|
||||
*/
|
||||
lv_hasp_obj_type_t obj_get_type(lv_obj_t* obj)
|
||||
{
|
||||
return (lv_hasp_obj_type_t)obj->user_data.objid;
|
||||
}
|
||||
|
||||
void hasp_object_tree(lv_obj_t* parent, uint8_t pageid, uint16_t level)
|
||||
{
|
||||
if(parent == nullptr) return;
|
||||
|
||||
/* Output parent info */
|
||||
lv_obj_type_t list;
|
||||
lv_obj_get_type(parent, &list);
|
||||
const char* objtype = list.type[0];
|
||||
LOG_VERBOSE(TAG_HASP, F("[%d] " HASP_OBJECT_NOTATION " %s"), level, pageid, parent->user_data.id, objtype);
|
||||
LOG_VERBOSE(TAG_HASP, F("[%d] " HASP_OBJECT_NOTATION " %s"), level, pageid, parent->user_data.id,
|
||||
obj_get_type_name(parent));
|
||||
|
||||
lv_obj_t* child;
|
||||
child = lv_obj_get_child(parent, NULL);
|
||||
@ -198,7 +135,7 @@ void hasp_object_tree(lv_obj_t* parent, uint8_t pageid, uint16_t level)
|
||||
}
|
||||
|
||||
/* check tabs */
|
||||
if(check_obj_type(parent, LV_HASP_TABVIEW)) {
|
||||
if(obj_check_type(parent, LV_HASP_TABVIEW)) {
|
||||
#if 1
|
||||
uint16_t tabcount = lv_tabview_get_tab_count(parent);
|
||||
for(uint16_t i = 0; i < tabcount; i++) {
|
||||
@ -236,7 +173,7 @@ void object_set_group_values(lv_obj_t* parent, uint8_t groupid, int16_t intval)
|
||||
object_set_group_values(child, groupid, intval);
|
||||
|
||||
/* check tabs */
|
||||
if(check_obj_type(child, LV_HASP_TABVIEW)) {
|
||||
if(obj_check_type(child, LV_HASP_TABVIEW)) {
|
||||
//#if LVGL_VERSION_MAJOR == 7
|
||||
uint16_t tabcount = lv_tabview_get_tab_count(child);
|
||||
for(uint16_t i = 0; i < tabcount; i++) {
|
||||
@ -287,7 +224,7 @@ void object_set_normalized_group_values(uint8_t groupid, lv_obj_t* src_obj, int1
|
||||
// Used in the dispatcher & hasp_new_object
|
||||
void hasp_process_attribute(uint8_t pageid, uint8_t objid, const char* attr, const char* payload, bool update)
|
||||
{
|
||||
if(lv_obj_t* obj = hasp_find_obj_from_parent_id(haspPages.get_obj(pageid), objid)) {
|
||||
if(lv_obj_t* obj = hasp_find_obj_from_page_id(pageid, objid)) {
|
||||
hasp_process_obj_attribute(obj, attr, payload, update); // || strlen(payload) > 0);
|
||||
} else {
|
||||
LOG_WARNING(TAG_HASP, F(D_OBJECT_UNKNOWN " " HASP_OBJECT_NOTATION), pageid, objid);
|
||||
@ -362,9 +299,8 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id)
|
||||
config.remove(FPSTR(FP_PARENTID));
|
||||
}
|
||||
|
||||
uint16_t sdbm = 0;
|
||||
uint8_t groupid = config[FPSTR(FP_GROUPID)].as<uint8_t>();
|
||||
uint8_t id = config[FPSTR(FP_ID)].as<uint8_t>();
|
||||
uint16_t sdbm = 0;
|
||||
uint8_t id = config[FPSTR(FP_ID)].as<uint8_t>();
|
||||
config.remove(FPSTR(FP_ID));
|
||||
|
||||
/* Create the object if it does not exist */
|
||||
@ -701,7 +637,7 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id)
|
||||
lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
lv_obj_set_auto_realign(obj, true);
|
||||
lv_obj_set_event_cb(obj, msgbox_event_handler);
|
||||
// if(msgbox_default_map) lv_msgbox_add_btns(obj, msgbox_default_map);
|
||||
if(msgbox_default_map) lv_msgbox_add_btns(obj, msgbox_default_map);
|
||||
obj->user_data.objid = LV_HASP_MSGBOX;
|
||||
}
|
||||
break;
|
||||
@ -713,7 +649,8 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id)
|
||||
if(obj) {
|
||||
lv_obj_set_event_cb(obj, calendar_event_handler);
|
||||
obj->user_data.objid = LV_HASP_CALENDER;
|
||||
lv_task_t* task = lv_task_create(event_timer_calendar, 300, LV_TASK_PRIO_LOWEST, (void*)obj);
|
||||
lv_task_t* task = lv_task_create(event_timer_calendar, 25, LV_TASK_PRIO_LOWEST, (void*)obj);
|
||||
(void)task; // unused
|
||||
}
|
||||
break;
|
||||
|
||||
@ -734,30 +671,34 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id)
|
||||
lv_obj_set_gesture_parent(obj, false);
|
||||
|
||||
/* id tag the object */
|
||||
// lv_obj_set_user_data(obj, id);
|
||||
obj->user_data.id = id;
|
||||
// obj->user_data.groupid = groupid; // get/set in atttr
|
||||
|
||||
uint8_t temp; // needed for debug tests
|
||||
(void)temp;
|
||||
|
||||
#ifdef HASP_DEBUG
|
||||
/** testing start **/
|
||||
uint8_t temp;
|
||||
if(!hasp_find_id_from_obj(obj, &pageid, &temp)) {
|
||||
LOG_ERROR(TAG_HASP, F(D_OBJECT_LOST));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HASP_LOG_LEVEL >= LOG_LEVEL_VERBOSE
|
||||
/** verbose reporting **/
|
||||
lv_obj_type_t list;
|
||||
lv_obj_get_type(obj, &list);
|
||||
LOG_VERBOSE(TAG_HASP, F(D_BULLET HASP_OBJECT_NOTATION " = %s"), pageid, temp, list.type[0]);
|
||||
LOG_VERBOSE(TAG_HASP, F(D_BULLET HASP_OBJECT_NOTATION " = %s"), pageid, id, obj_get_type_name(obj));
|
||||
#endif
|
||||
|
||||
#ifdef HASP_DEBUG
|
||||
/* test double-check */
|
||||
lv_obj_t* test = hasp_find_obj_from_parent_id(haspPages.get_obj(pageid), (uint8_t)temp);
|
||||
if(test != obj) {
|
||||
lv_obj_t* test = hasp_find_obj_from_page_id(pageid, (uint8_t)temp);
|
||||
if(test != obj || temp != id) {
|
||||
LOG_ERROR(TAG_HASP, F(D_OBJECT_MISMATCH));
|
||||
return;
|
||||
} else {
|
||||
// object created successfully
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
// object already exists
|
||||
|
Loading…
x
Reference in New Issue
Block a user