mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-24 11:46:34 +00:00
Add timer events
This commit is contained in:
parent
74439711b1
commit
dc43fb6600
@ -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 ============================ */
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user