diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index e94a359b..5c2f4dc3 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -178,11 +178,6 @@ static bool attribute_update_lv_property(lv_obj_t * obj, const char * attr_p, ui } #endif -static void my_obj_set_swipeid(lv_obj_t* obj, uint8_t swipeid) -{ - if(obj) obj->user_data.swipeid = swipeid % 16; -} - // OK - this function is missing in lvgl static uint8_t my_roller_get_visible_row_count(lv_obj_t* roller) { @@ -1250,6 +1245,29 @@ static void hasp_process_gauge_attribute(lv_obj_t* obj, const char* attr_p, uint // ##################### Common Attributes ######################################################## +static void hasp_process_page_attributes(lv_obj_t* obj, const char* attr_p, uint16_t attr_hash, uint8_t val, + bool update) +{ + uint8_t pageid; + + if(haspPages.get_id(obj, &pageid)) { + switch(attr_hash) { + case ATTR_NEXT: + update ? haspPages.set_next(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_next(pageid)); + break; + + case ATTR_PREV: + update ? haspPages.set_prev(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_prev(pageid)); + break; + + // case ATTR_BACK: + default: + update ? haspPages.set_back(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_back(pageid)); + break; + } + } +} + static void hasp_process_obj_attribute_txt(lv_obj_t* obj, const char* attr, const char* payload, bool update) { /* Attributes depending on objecttype */ @@ -1418,13 +1436,12 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p LOG_WARNING(TAG_ATTR, F(D_OBJECT_UNKNOWN)); return; } - int16_t val = atoi(payload); char* attr = (char*)attr_p; if(*attr == '.') attr++; // strip leading '.' uint16_t attr_hash = Parser::get_sdbm(attr); - // LOG_VERBOSE(TAG_ATTR,"%s => %d", attr, attr_hash); + int16_t val = atoi(payload); /* 16-bit Hash Lookup Table */ switch(attr_hash) { @@ -1543,7 +1560,7 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p break; // attribute_found case ATTR_SWIPE: - update ? my_obj_set_swipeid(obj, Parser::is_true(payload)) + update ? (void)(obj->user_data.swipeid = Parser::is_true(payload) % 16) : attr_out_int(obj, attr, obj->user_data.swipeid); break; // attribute_found @@ -1765,6 +1782,15 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p lv_obj_move_background(obj); break; // attribute_found + case ATTR_NEXT: + case ATTR_PREV: + case ATTR_BACK: + if(check_obj_type(obj, LV_HASP_SCREEN)) { + hasp_process_page_attributes(obj, attr_p, attr_hash, val, update); + break; // attribute_found + } + goto attribute_not_found; + default: hasp_local_style_attr(obj, attr, attr_hash, payload, update); } diff --git a/src/hasp/hasp_attribute.h b/src/hasp/hasp_attribute.h index 8dcbd914..7a4f11f7 100644 --- a/src/hasp/hasp_attribute.h +++ b/src/hasp/hasp_attribute.h @@ -260,6 +260,11 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t) #define ATTR_SCALE_WIDTH 36017 #define ATTR_SCALE_END_COLOR 44074 +/* Page Attributes */ +#define ATTR_NEXT 60915 +#define ATTR_PREV 21587 +#define ATTR_BACK 57799 + /* Object Attributes */ #define ATTR_X 120 #define ATTR_Y 121 diff --git a/src/hasp/hasp_object.h b/src/hasp/hasp_object.h index d0a38b78..6fca9528 100644 --- a/src/hasp/hasp_object.h +++ b/src/hasp/hasp_object.h @@ -35,6 +35,7 @@ enum lv_hasp_obj_type_t { LV_HASP_CALENDER = 54, /* Containers */ + LV_HASP_SCREEN = 1, LV_HASP_CONTAINER = 70, LV_HASP_WINDOW = 71, // placeholder LV_HASP_MSGBOX = 72, // placeholder diff --git a/src/hasp/hasp_page.cpp b/src/hasp/hasp_page.cpp index e1db9d6c..c1098d33 100644 --- a/src/hasp/hasp_page.cpp +++ b/src/hasp/hasp_page.cpp @@ -8,6 +8,14 @@ namespace hasp { +bool Page::is_valid(uint8_t pageid) +{ + if(pageid > 0 && pageid <= HASP_NUM_PAGES) return true; + + LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid); + return false; +} + Page::Page() { // LVGL is not yet initialized at construction time @@ -21,7 +29,8 @@ size_t Page::count() void Page::init(uint8_t start_page) { for(int i = 0; i < count(); i++) { - _pages[i] = lv_obj_create(NULL, NULL); + _pages[i] = lv_obj_create(NULL, NULL); + _pages[i]->user_data.objid = LV_HASP_SCREEN; lv_obj_set_event_cb(_pages[i], generic_event_handler); /**< If the `indev` was pressing this object but swiped out while pressing do not search other object.*/ @@ -34,14 +43,12 @@ void Page::init(uint8_t start_page) } } -void Page::clear(uint16_t pageid) +void Page::clear(uint8_t pageid) { lv_obj_t* page = get_obj(pageid); - if(!page || (pageid > HASP_NUM_PAGES)) { - LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid); - } else if(page == lv_layer_sys() /*|| page == lv_layer_top()*/) { + if(page == lv_layer_sys() /*|| page == lv_layer_top()*/) { LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_LAYER)); - } else { + } else if(is_valid(pageid)) { LOG_TRACE(TAG_HASP, F(D_HASP_CLEAR_PAGE), pageid); lv_obj_clean(page); } @@ -55,7 +62,9 @@ void Page::clear(uint16_t pageid) void Page::set(uint8_t pageid, lv_scr_load_anim_t animation) { lv_obj_t* page = get_obj(pageid); - if(!page || pageid == 0 || pageid > HASP_NUM_PAGES) { + if(!is_valid(pageid)) { + return; + } else if(!page) { LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid); } else { LOG_TRACE(TAG_HASP, F(D_HASP_CHANGE_PAGE), pageid); @@ -67,6 +76,36 @@ void Page::set(uint8_t pageid, lv_scr_load_anim_t animation) } } +uint8_t Page::get_next(uint8_t pageid) +{ + return is_valid(pageid) ? _meta_data[pageid - PAGE_START_INDEX].next : 0; +} + +uint8_t Page::get_prev(uint8_t pageid) +{ + return is_valid(pageid) ? _meta_data[pageid - PAGE_START_INDEX].prev : 0; +} + +uint8_t Page::get_back(uint8_t pageid) +{ + return is_valid(pageid) ? _meta_data[pageid - PAGE_START_INDEX].back : 0; +} + +void Page::set_next(uint8_t pageid, uint8_t nextid) +{ + if(is_valid(pageid) && is_valid(nextid)) _meta_data[pageid - PAGE_START_INDEX].next = nextid; +} + +void Page::set_prev(uint8_t pageid, uint8_t previd) +{ + if(is_valid(pageid) && is_valid(previd)) _meta_data[pageid - PAGE_START_INDEX].prev = previd; +} + +void Page::set_back(uint8_t pageid, uint8_t backid) +{ + if(is_valid(pageid) && is_valid(backid)) _meta_data[pageid - PAGE_START_INDEX].back = backid; +} + void Page::next(lv_scr_load_anim_t animation) { set(_meta_data[_current_page - PAGE_START_INDEX].next, animation); diff --git a/src/hasp/hasp_page.h b/src/hasp/hasp_page.h index e088a2a4..ec94462e 100644 --- a/src/hasp/hasp_page.h +++ b/src/hasp/hasp_page.h @@ -35,16 +35,26 @@ class Page { Page(); size_t count(); void init(uint8_t start_page); - void clear(uint16_t pageid); + void clear(uint8_t pageid); // void set(uint8_t pageid); void set(uint8_t pageid, lv_scr_load_anim_t animation); + void next(lv_scr_load_anim_t animation); void prev(lv_scr_load_anim_t animation); void back(lv_scr_load_anim_t animation); + + uint8_t get_next(uint8_t pageid); + uint8_t get_prev(uint8_t pageid); + uint8_t get_back(uint8_t pageid); + void set_next(uint8_t pageid, uint8_t nextid); + void set_prev(uint8_t pageid, uint8_t previd); + void set_back(uint8_t pageid, uint8_t backid); + uint8_t get(); void load_jsonl(const char* pagesfile); lv_obj_t* get_obj(uint8_t pageid); bool get_id(lv_obj_t* obj, uint8_t* pageid); + bool is_valid(uint8_t pageid); }; } // namespace hasp