summaryrefslogtreecommitdiff
path: root/src/libs/lvgl/src/lv_misc/lv_async.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/lvgl/src/lv_misc/lv_async.c')
-rw-r--r--src/libs/lvgl/src/lv_misc/lv_async.c75
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);
+}