mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-28 07:03:00 +08:00
feat(timer): add auto delete flag and get pause status (#4708)
This commit is contained in:
parent
bb713a7d1e
commit
28d60369dd
@ -52,9 +52,6 @@ static void lv_timer_handler_resume(void);
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Init the lv_timer module
|
||||
*/
|
||||
void _lv_timer_core_init(void)
|
||||
{
|
||||
_lv_ll_init(timer_ll_p, sizeof(lv_timer_t));
|
||||
@ -63,10 +60,6 @@ void _lv_timer_core_init(void)
|
||||
lv_timer_enable(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call it periodically to handle lv_timers.
|
||||
* @return the time after which it must be called again
|
||||
*/
|
||||
LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
|
||||
{
|
||||
LV_TRACE_TIMER("begin");
|
||||
@ -160,25 +153,11 @@ LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an "empty" timer. It needs to be initialized with at least
|
||||
* `lv_timer_set_cb` and `lv_timer_set_period`
|
||||
* @return pointer to the created timer
|
||||
*/
|
||||
lv_timer_t * lv_timer_create_basic(void)
|
||||
{
|
||||
return lv_timer_create(NULL, DEF_PERIOD, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new lv_timer
|
||||
* @param timer_xcb a callback which is the timer itself. It will be called periodically.
|
||||
* (the 'x' in the argument name indicates that it's not a fully generic function because it not follows
|
||||
* the `func_name(object, callback, ...)` convention)
|
||||
* @param period call period in ms unit
|
||||
* @param user_data custom parameter
|
||||
* @return pointer to the new timer
|
||||
*/
|
||||
lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data)
|
||||
{
|
||||
lv_timer_t * new_timer = NULL;
|
||||
@ -193,6 +172,7 @@ lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * us
|
||||
new_timer->paused = 0;
|
||||
new_timer->last_run = lv_tick_get();
|
||||
new_timer->user_data = user_data;
|
||||
new_timer->auto_delete = true;
|
||||
|
||||
state.timer_created = true;
|
||||
|
||||
@ -201,20 +181,11 @@ lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * us
|
||||
return new_timer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the callback to the timer (the function to call periodically)
|
||||
* @param timer pointer to a timer
|
||||
* @param timer_cb the function to call periodically
|
||||
*/
|
||||
void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb)
|
||||
{
|
||||
timer->timer_cb = timer_cb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a lv_timer
|
||||
* @param timer pointer to timer created by timer
|
||||
*/
|
||||
void lv_timer_delete(lv_timer_t * timer)
|
||||
{
|
||||
_lv_ll_remove(timer_ll_p, timer);
|
||||
@ -223,10 +194,6 @@ void lv_timer_delete(lv_timer_t * timer)
|
||||
lv_free(timer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pause/resume a timer.
|
||||
* @param timer pointer to an lv_timer
|
||||
*/
|
||||
void lv_timer_pause(lv_timer_t * timer)
|
||||
{
|
||||
timer->paused = true;
|
||||
@ -238,89 +205,53 @@ void lv_timer_resume(lv_timer_t * timer)
|
||||
lv_timer_handler_resume();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set new period for a lv_timer
|
||||
* @param timer pointer to a lv_timer
|
||||
* @param period the new period
|
||||
*/
|
||||
void lv_timer_set_period(lv_timer_t * timer, uint32_t period)
|
||||
{
|
||||
timer->period = period;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a lv_timer ready. It will not wait its period.
|
||||
* @param timer pointer to a lv_timer.
|
||||
*/
|
||||
void lv_timer_ready(lv_timer_t * timer)
|
||||
{
|
||||
timer->last_run = lv_tick_get() - timer->period - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the number of times a timer will repeat.
|
||||
* @param timer pointer to a lv_timer.
|
||||
* @param repeat_count -1 : infinity; 0 : stop ; n >0: residual times
|
||||
*/
|
||||
void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count)
|
||||
{
|
||||
timer->repeat_count = repeat_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set custom parameter to the lv_timer.
|
||||
* @param timer pointer to a lv_timer.
|
||||
* @param user_data custom parameter
|
||||
*/
|
||||
void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete)
|
||||
{
|
||||
timer->auto_delete = auto_delete;
|
||||
}
|
||||
|
||||
void lv_timer_set_user_data(lv_timer_t * timer, void * user_data)
|
||||
{
|
||||
timer->user_data = user_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset a lv_timer.
|
||||
* It will be called the previously set period milliseconds later.
|
||||
* @param timer pointer to a lv_timer.
|
||||
*/
|
||||
void lv_timer_reset(lv_timer_t * timer)
|
||||
{
|
||||
timer->last_run = lv_tick_get();
|
||||
lv_timer_handler_resume();
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable or disable the whole lv_timer handling
|
||||
* @param en true: lv_timer handling is running, false: lv_timer handling is suspended
|
||||
*/
|
||||
void lv_timer_enable(bool en)
|
||||
{
|
||||
state.lv_timer_run = en;
|
||||
if(en) lv_timer_handler_resume();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get idle percentage
|
||||
* @return the lv_timer idle in percentage
|
||||
*/
|
||||
uint8_t lv_timer_get_idle(void)
|
||||
{
|
||||
return state.idle_last;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get idle period start tick
|
||||
* @return the lv_timer idle period start tick
|
||||
*/
|
||||
uint32_t lv_timer_get_time_until_next(void)
|
||||
{
|
||||
return state.timer_time_until_next;
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterate through the timers
|
||||
* @param timer NULL to start iteration or the previous return value to get the next timer
|
||||
* @return the next timer or NULL if there is no more timer
|
||||
*/
|
||||
lv_timer_t * lv_timer_get_next(lv_timer_t * timer)
|
||||
{
|
||||
if(timer == NULL) return _lv_ll_get_head(timer_ll_p);
|
||||
@ -365,8 +296,14 @@ static bool lv_timer_exec(lv_timer_t * timer)
|
||||
|
||||
if(state.timer_deleted == false) { /*The timer might be deleted by itself as well*/
|
||||
if(timer->repeat_count == 0) { /*The repeat count is over, delete the timer*/
|
||||
LV_TRACE_TIMER("deleting timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb));
|
||||
lv_timer_delete(timer);
|
||||
if(timer->auto_delete) {
|
||||
LV_TRACE_TIMER("deleting timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb));
|
||||
lv_timer_delete(timer);
|
||||
}
|
||||
else {
|
||||
LV_TRACE_TIMER("pausing timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb));
|
||||
lv_timer_pause(timer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,6 +54,7 @@ typedef struct _lv_timer_t {
|
||||
void * user_data; /**< Custom user data*/
|
||||
int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times*/
|
||||
uint32_t paused : 1;
|
||||
uint32_t auto_delete : 1;
|
||||
} lv_timer_t;
|
||||
|
||||
typedef struct {
|
||||
@ -150,11 +151,15 @@ lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * us
|
||||
void lv_timer_delete(lv_timer_t * timer);
|
||||
|
||||
/**
|
||||
* Pause/resume a timer.
|
||||
* Pause a timer.
|
||||
* @param timer pointer to an lv_timer
|
||||
*/
|
||||
void lv_timer_pause(lv_timer_t * timer);
|
||||
|
||||
/**
|
||||
* Resume a timer.
|
||||
* @param timer pointer to an lv_timer
|
||||
*/
|
||||
void lv_timer_resume(lv_timer_t * timer);
|
||||
|
||||
/**
|
||||
@ -184,6 +189,13 @@ void lv_timer_ready(lv_timer_t * timer);
|
||||
*/
|
||||
void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count);
|
||||
|
||||
/**
|
||||
* Set whether a lv_timer will be deleted automatically when it is called `repeat_count` times.
|
||||
* @param timer pointer to a lv_timer.
|
||||
* @param auto_delete true: auto delete; false: timer will be paused when it is called `repeat_count` times.
|
||||
*/
|
||||
void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete);
|
||||
|
||||
/**
|
||||
* Set custom parameter to the lv_timer.
|
||||
* @param timer pointer to a lv_timer.
|
||||
@ -233,6 +245,16 @@ static inline void * lv_timer_get_user_data(lv_timer_t * timer)
|
||||
return timer->user_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the pause state of a timer
|
||||
* @param timer pointer to a lv_timer
|
||||
* @return true: timer is paused; false: timer is running
|
||||
*/
|
||||
static inline bool lv_timer_get_paused(lv_timer_t * timer)
|
||||
{
|
||||
return timer->paused;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
Loading…
x
Reference in New Issue
Block a user