mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-21 06:53:01 +08:00
177 lines
4.0 KiB
C
177 lines
4.0 KiB
C
/**
|
|
* @file lv_task.c
|
|
* An 'lv_task' is a void (*fp) (void* param) type function which will be called periodically.
|
|
* A priority (5 levels + disable) can be assigned to lv_tasks.
|
|
*/
|
|
|
|
#ifndef LV_TASK_H
|
|
#define LV_TASK_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "../lv_conf_internal.h"
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include "lv_mem.h"
|
|
#include "lv_ll.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
#ifndef LV_ATTRIBUTE_TASK_HANDLER
|
|
#define LV_ATTRIBUTE_TASK_HANDLER
|
|
#endif
|
|
|
|
#define LV_NO_TASK_READY 0xFFFFFFFF
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
struct _lv_task_t;
|
|
|
|
/**
|
|
* Tasks execute this type type of functions.
|
|
*/
|
|
typedef void (*lv_task_cb_t)(struct _lv_task_t *);
|
|
|
|
/**
|
|
* Possible priorities for lv_tasks
|
|
*/
|
|
enum {
|
|
LV_TASK_PRIO_OFF = 0,
|
|
LV_TASK_PRIO_LOWEST,
|
|
LV_TASK_PRIO_LOW,
|
|
LV_TASK_PRIO_MID,
|
|
LV_TASK_PRIO_HIGH,
|
|
LV_TASK_PRIO_HIGHEST,
|
|
_LV_TASK_PRIO_NUM,
|
|
};
|
|
typedef uint8_t lv_task_prio_t;
|
|
|
|
/**
|
|
* Descriptor of a lv_task
|
|
*/
|
|
typedef struct _lv_task_t
|
|
{
|
|
uint32_t period; /**< How often the task should run */
|
|
uint32_t last_run; /**< Last time the task ran */
|
|
lv_task_cb_t task_cb; /**< Task function */
|
|
|
|
void * user_data; /**< Custom user data */
|
|
|
|
uint8_t prio : 3; /**< Task priority */
|
|
uint8_t once : 1; /**< 1: one shot task */
|
|
} lv_task_t;
|
|
|
|
/**********************
|
|
* GLOBAL PROTOTYPES
|
|
**********************/
|
|
|
|
/**
|
|
* Init the lv_task module
|
|
*/
|
|
void lv_task_core_init(void);
|
|
|
|
//! @cond Doxygen_Suppress
|
|
|
|
/**
|
|
* Call it periodically to handle lv_tasks.
|
|
* @return time till it needs to be run next (in ms)
|
|
*/
|
|
LV_ATTRIBUTE_TASK_HANDLER uint32_t lv_task_handler(void);
|
|
|
|
//! @endcond
|
|
|
|
/**
|
|
* Create an "empty" task. It needs to initialzed with at least
|
|
* `lv_task_set_cb` and `lv_task_set_period`
|
|
* @return pointer to the craeted task
|
|
*/
|
|
lv_task_t * lv_task_create_basic(void);
|
|
|
|
/**
|
|
* Create a new lv_task
|
|
* @param task_xcb a callback which is the task itself. It will be called periodically.
|
|
* (the 'x' in the argument name indicates that its not a fully generic function because it not follows
|
|
* the `func_name(object, callback, ...)` convention)
|
|
* @param period call period in ms unit
|
|
* @param prio priority of the task (LV_TASK_PRIO_OFF means the task is stopped)
|
|
* @param user_data custom parameter
|
|
* @return pointer to the new task
|
|
*/
|
|
lv_task_t * lv_task_create(lv_task_cb_t task_xcb, uint32_t period, lv_task_prio_t prio, void * user_data);
|
|
|
|
/**
|
|
* Delete a lv_task
|
|
* @param task pointer to task_cb created by task
|
|
*/
|
|
void lv_task_del(lv_task_t * task);
|
|
|
|
/**
|
|
* Set the callback the task (the function to call periodically)
|
|
* @param task pointer to a task
|
|
* @param task_cb the function to call periodically
|
|
*/
|
|
void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb);
|
|
|
|
/**
|
|
* Set new priority for a lv_task
|
|
* @param task pointer to a lv_task
|
|
* @param prio the new priority
|
|
*/
|
|
void lv_task_set_prio(lv_task_t * task, lv_task_prio_t prio);
|
|
|
|
/**
|
|
* Set new period for a lv_task
|
|
* @param task pointer to a lv_task
|
|
* @param period the new period
|
|
*/
|
|
void lv_task_set_period(lv_task_t * task, uint32_t period);
|
|
|
|
/**
|
|
* Make a lv_task ready. It will not wait its period.
|
|
* @param task pointer to a lv_task.
|
|
*/
|
|
void lv_task_ready(lv_task_t * task);
|
|
|
|
/**
|
|
* Delete the lv_task after one call
|
|
* @param task pointer to a lv_task.
|
|
*/
|
|
void lv_task_once(lv_task_t * task);
|
|
|
|
/**
|
|
* Reset a lv_task.
|
|
* It will be called the previously set period milliseconds later.
|
|
* @param task pointer to a lv_task.
|
|
*/
|
|
void lv_task_reset(lv_task_t * task);
|
|
|
|
/**
|
|
* Enable or disable the whole lv_task handling
|
|
* @param en: true: lv_task handling is running, false: lv_task handling is suspended
|
|
*/
|
|
void lv_task_enable(bool en);
|
|
|
|
/**
|
|
* Get idle percentage
|
|
* @return the lv_task idle in percentage
|
|
*/
|
|
uint8_t lv_task_get_idle(void);
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif
|