Add timer events

This commit is contained in:
fvanroie 2021-05-08 03:02:18 +02:00
parent 74439711b1
commit dc43fb6600
4 changed files with 54 additions and 13 deletions

View File

@ -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 ============================ */

View File

@ -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);

View File

@ -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;

View File

@ -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,