/**
 * @file lv_async.c
 *
 */

/*********************
 *      INCLUDES
 *********************/

#include "lv_async.h"

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

typedef struct _lv_async_info_t {
    lv_async_cb_t cb;
    void *user_data;
} lv_async_info_t;

/**********************
 *  STATIC PROTOTYPES
 **********************/

static void lv_async_timer_cb(lv_timer_t *timer);

/**********************
 *  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 timer*/
    /*Use highest priority so that it will run before a refresh*/
    lv_timer_t *timer = lv_timer_create(lv_async_timer_cb, 0, info);

    if (timer == NULL) {
        lv_mem_free(info);
        return LV_RES_INV;
    }

    info->cb = async_xcb;
    info->user_data = user_data;

    lv_timer_set_repeat_count(timer, 1);
    return LV_RES_OK;
}

/**********************
 *   STATIC FUNCTIONS
 **********************/

static void lv_async_timer_cb(lv_timer_t *timer)
{
    lv_async_info_t *info = (lv_async_info_t *)timer->user_data;

    info->cb(info->user_data);

    lv_mem_free(info);
}
