diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index 4c27d210..a7f93b19 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -60,9 +60,16 @@ static void event_delete_object(lv_obj_t* obj) /* ============================== Timer Event ============================ */ void event_timer_calendar(lv_task_t* task) { - lv_obj_t* obj = (lv_obj_t*)task->user_data; + hasp_task_user_data_t* data = (hasp_task_user_data_t*)task->user_data; + lv_obj_t* obj; - if(!obj) return lv_task_del(task); // the calendar object for this task was deleted + if(data) obj = hasp_find_obj_from_page_id(data->pageid, data->objid); + if(!obj || !data) { + if(data) lv_mem_free(data); // the object that the user_data points to is gone + lv_task_del(task); // the calendar object for this task was deleted + LOG_WARNING(TAG_EVENT, "event_timer_calendar could not find the linked object"); + return; + } lv_calendar_date_t date; @@ -74,10 +81,12 @@ void event_timer_calendar(lv_task_t* task) if(timeinfo->tm_year < 120) { lv_task_set_period(task, 60000); // try again in a minute + LOG_WARNING(TAG_EVENT, "event_timer_calendar could not sync the clock"); return; } else { uint32_t next_hour = (3600 - (t % 3600)) * 1000; // ms to next top of hour - lv_task_set_period(task, next_hour + 128); // small offset so all tasks don't run at once + // lv_task_set_period(task, next_hour + 128); // small offset so all tasks don't run at once + lv_task_set_period(task, data->interval); } date.day = timeinfo->tm_mday; @@ -92,9 +101,16 @@ void event_timer_calendar(lv_task_t* task) void event_timer_clock(lv_task_t* task) { - lv_obj_t* obj = (lv_obj_t*)task->user_data; + hasp_task_user_data_t* data = (hasp_task_user_data_t*)task->user_data; + lv_obj_t* obj; - if(!obj) return lv_task_del(task); // the calendar object for this task was deleted + if(data) obj = hasp_find_obj_from_page_id(data->pageid, data->objid); + if(!obj || !data) { + if(data) lv_mem_free(data); // the object that the user_data points to is gone + lv_task_del(task); // the calendar object for this task was deleted + LOG_WARNING(TAG_EVENT, "event_timer_clock could not find the linked object"); + return; + } timeval curTime; int rslt = gettimeofday(&curTime, NULL); @@ -102,16 +118,18 @@ void event_timer_clock(lv_task_t* task) tm* timeinfo = localtime(&seconds); (void)rslt; // unused + char buffer[24]; if(timeinfo->tm_year < 120) { - lv_task_set_period(task, 60000); // try again in a minute - return; + snprintf_P(buffer, sizeof(buffer), PSTR("%il"), seconds); + } else { + strftime(buffer, sizeof(buffer), D_TIMESTAMP, timeinfo); // Literal String } - LOG_VERBOSE(TAG_EVENT, "event_timer_clock called with user %d:%d%s", timeinfo->tm_hour, timeinfo->tm_min, - timeinfo->tm_sec); + // LOG_VERBOSE(TAG_EVENT, "event_timer_clock called with user %d:%d:%d", timeinfo->tm_hour, timeinfo->tm_min, + // timeinfo->tm_sec); - uint16_t interval; - lv_task_set_period(task, (interval - (seconds % interval)) * 1000 + 64); // ms to next interval + lv_label_set_text(obj, buffer); + lv_task_set_period(task, data->interval); } /* ============================== Timer Event ============================ */ diff --git a/src/hasp/hasp_event.h b/src/hasp/hasp_event.h index 50f6e40d..79ebcc8f 100644 --- a/src/hasp/hasp_event.h +++ b/src/hasp/hasp_event.h @@ -13,6 +13,7 @@ // Timer event Handlers void event_timer_calendar(lv_task_t* task); +void event_timer_clock(lv_task_t* task); // Object event Handlers void wakeup_event_handler(lv_obj_t* obj, lv_event_t event); diff --git a/src/hasp/hasp_object.cpp b/src/hasp/hasp_object.cpp index cde049d6..a20a2afe 100644 --- a/src/hasp/hasp_object.cpp +++ b/src/hasp/hasp_object.cpp @@ -96,6 +96,7 @@ const char* obj_get_type_name(lv_obj_t* obj) bool obj_check_type(lv_obj_t* obj, lv_hasp_obj_type_t haspobjtype) { #if 1 + if(!obj) return false; return obj->user_data.objid == (uint8_t)haspobjtype; #else lv_obj_type_t list; @@ -267,6 +268,18 @@ int hasp_parse_json_attributes(lv_obj_t* obj, const JsonObject& doc) return i; } +static void object_add_task(lv_obj_t* obj, uint8_t pageid, uint8_t objid, lv_task_cb_t task_xcb, uint16_t interval) +{ + hasp_task_user_data_t* user_data = (hasp_task_user_data_t*)lv_mem_alloc(sizeof(hasp_task_user_data_t)); + if(!user_data) return; + + user_data->pageid = pageid; + user_data->objid = objid; + user_data->interval = interval; + lv_task_t* task = lv_task_create(task_xcb, 25, LV_TASK_PRIO_LOWEST, (void*)user_data); + (void)task; // unused +} + /** * Create a new object according to the json config * @param config Json representation for this object @@ -385,6 +398,8 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id) lv_label_set_recolor(obj, true); lv_obj_set_event_cb(obj, generic_event_handler); obj->user_data.objid = LV_HASP_LABEL; + + // object_add_task(obj, pageid, id, event_timer_clock, 1000); } break; @@ -654,8 +669,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, 25, LV_TASK_PRIO_LOWEST, (void*)obj); - (void)task; // unused + + object_add_task(obj, pageid, id, event_timer_calendar, 5000); } break; diff --git a/src/hasp/hasp_object.h b/src/hasp/hasp_object.h index e98a1a86..e5d00107 100644 --- a/src/hasp/hasp_object.h +++ b/src/hasp/hasp_object.h @@ -13,6 +13,13 @@ const char FP_OBJID[] PROGMEM = "objid"; const char FP_PARENTID[] PROGMEM = "parentid"; const char FP_GROUPID[] PROGMEM = "groupid"; +typedef struct +{ + uint8_t pageid; + uint8_t objid; + uint16_t interval; +} hasp_task_user_data_t; + enum lv_hasp_obj_type_t { /* Containers */ LV_HASP_SCREEN = 1,