diff options
Diffstat (limited to 'src/libs/lvgl/src/lv_misc/lv_async.c')
-rw-r--r-- | src/libs/lvgl/src/lv_misc/lv_async.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/libs/lvgl/src/lv_misc/lv_async.c b/src/libs/lvgl/src/lv_misc/lv_async.c new file mode 100644 index 00000000..2a836432 --- /dev/null +++ b/src/libs/lvgl/src/lv_misc/lv_async.c @@ -0,0 +1,75 @@ +/** + * @file lv_async.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_async.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_async_task_cb(lv_task_t *task); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data) +{ + /*Allocate an info structure */ + lv_async_info_t *info = lv_mem_alloc(sizeof(lv_async_info_t)); + + if(info == NULL) + return LV_RES_INV; + + /* Create a new task */ + /* Use highest priority so that it will run before a refresh */ + lv_task_t *task = lv_task_create(lv_async_task_cb, 0, LV_TASK_PRIO_HIGHEST, info); + + if(task == NULL) { + lv_mem_free(info); + return LV_RES_INV; + } + + info->cb = async_xcb; + info->user_data = user_data; + + /* Set the task's user data */ + task->user_data = info; + lv_task_once(task); + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_async_task_cb(lv_task_t *task) +{ + lv_async_info_t *info = (lv_async_info_t *)task->user_data; + + info->cb(info->user_data); + + lv_mem_free(info); +} |