From be84581bbc8194cf9c6b633a938db56457fed1c5 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 7 May 2019 06:30:38 +0200 Subject: [PATCH] lv_anim: add typedef int16_t lv_anim_value_t --- src/lv_core/lv_group.c | 2 -- src/lv_core/lv_obj.c | 81 ------------------------------------------ src/lv_core/lv_obj.h | 29 --------------- src/lv_misc/lv_anim.c | 43 +++++++++++----------- src/lv_misc/lv_anim.h | 24 +++++++------ src/lv_objx/lv_mbox.c | 39 +++++++++++++++++--- 6 files changed, 70 insertions(+), 148 deletions(-) diff --git a/src/lv_core/lv_group.c b/src/lv_core/lv_group.c index 8a2328985..7d6cfa1fd 100644 --- a/src/lv_core/lv_group.c +++ b/src/lv_core/lv_group.c @@ -669,8 +669,6 @@ static void obj_to_foreground(lv_obj_t * obj) if(last_top != NULL) { /*Move the last_top object to the foreground*/ - lv_obj_t * par = lv_obj_get_parent(last_top); - /*After list change it will be the new head*/ lv_obj_move_foreground(last_top); } } diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 3114c5211..af7b50aa2 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -1421,87 +1421,6 @@ void lv_obj_refresh_ext_draw_pad(lv_obj_t * obj) lv_obj_invalidate(obj); } -#if LV_USE_ANIMATION -/** - * Animate an object - * @param obj pointer to an object to animate - * @param type type of animation from 'lv_anim_builtin_t'. 'OR' it with ANIM_IN or ANIM_OUT - * @param time time of animation in milliseconds - * @param delay delay before the animation in milliseconds - * @param ready_cb a function to call when the animation is ready - */ -void lv_obj_animate(lv_obj_t * obj, lv_anim_builtin_t type, uint16_t time, uint16_t delay, - lv_anim_ready_cb_t ready_cb) -{ - lv_obj_t * par = lv_obj_get_parent(obj); - - /*Get the direction*/ - bool out = (type & LV_ANIM_DIR_MASK) == LV_ANIM_IN ? false : true; - type = type & (~LV_ANIM_DIR_MASK); - - lv_anim_t a; - a.var = obj; - a.time = time; - a.act_time = (int32_t)-delay; - a.ready_cb = ready_cb; - a.path_cb = lv_anim_path_linear; - a.playback_pause = 0; - a.repeat_pause = 0; - a.playback = 0; - a.repeat = 0; - - /*Init to ANIM_IN*/ - switch(type) { - case LV_ANIM_FLOAT_LEFT: - a.exec_cb = (void (*)(void *, int32_t))lv_obj_set_x; - a.start = -lv_obj_get_width(obj); - a.end = lv_obj_get_x(obj); - break; - case LV_ANIM_FLOAT_RIGHT: - a.exec_cb = (void (*)(void *, int32_t))lv_obj_set_x; - a.start = lv_obj_get_width(par); - a.end = lv_obj_get_x(obj); - break; - case LV_ANIM_FLOAT_TOP: - a.exec_cb = (void (*)(void *, int32_t))lv_obj_set_y; - a.start = -lv_obj_get_height(obj); - a.end = lv_obj_get_y(obj); - break; - case LV_ANIM_FLOAT_BOTTOM: - a.exec_cb = (void (*)(void *, int32_t))lv_obj_set_y; - a.start = lv_obj_get_height(par); - a.end = lv_obj_get_y(obj); - break; - case LV_ANIM_GROW_H: - a.exec_cb = (void (*)(void *, int32_t))lv_obj_set_width; - a.start = 0; - a.end = lv_obj_get_width(obj); - break; - case LV_ANIM_GROW_V: - a.exec_cb = (void (*)(void *, int32_t))lv_obj_set_height; - a.start = 0; - a.end = lv_obj_get_height(obj); - break; - case LV_ANIM_NONE: - a.exec_cb = NULL; - a.start = 0; - a.end = 0; - break; - default: break; - } - - /*Swap start and end in case of ANIM OUT*/ - if(out != false) { - int32_t tmp = a.start; - a.start = a.end; - a.end = tmp; - } - - lv_anim_create(&a); -} - -#endif - /*======================= * Getter functions *======================*/ diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 435c86a93..3193b9ca1 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -44,10 +44,6 @@ extern "C" { #define LV_MAX_ANCESTOR_NUM 8 -#define LV_ANIM_IN 0x00 /*Animation to show an object. 'OR' it with lv_anim_builtin_t*/ -#define LV_ANIM_OUT 0x80 /*Animation to hide an object. 'OR' it with lv_anim_builtin_t*/ -#define LV_ANIM_DIR_MASK 0x80 /*ANIM_IN/ANIM_OUT mask*/ - #define LV_EXT_CLICK_AREA_OFF 0 #define LV_EXT_CLICK_AREA_TINY 1 #define LV_EXT_CLICK_AREA_FULL 2 @@ -261,17 +257,6 @@ typedef struct ... [x]: "lv_obj" */ } lv_obj_type_t; -enum { - LV_ANIM_NONE = 0, - LV_ANIM_FLOAT_TOP, /*Float from/to the top*/ - LV_ANIM_FLOAT_LEFT, /*Float from/to the left*/ - LV_ANIM_FLOAT_BOTTOM, /*Float from/to the bottom*/ - LV_ANIM_FLOAT_RIGHT, /*Float from/to the right*/ - LV_ANIM_GROW_H, /*Grow/shrink horizontally*/ - LV_ANIM_GROW_V, /*Grow/shrink vertically*/ -}; -typedef uint8_t lv_anim_builtin_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -623,20 +608,6 @@ void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size); */ void lv_obj_refresh_ext_draw_pad(lv_obj_t * obj); -#if LV_USE_ANIMATION - -/** - * Animate an object - * @param obj pointer to an object to animate - * @param type type of animation from 'lv_anim_builtin_t'. 'OR' it with ANIM_IN or ANIM_OUT - * @param time time of animation in milliseconds - * @param delay delay before the animation in milliseconds - * @param ready_cb a function to call when the animation is ready - */ -void lv_obj_animate(lv_obj_t * obj, lv_anim_builtin_t type, uint16_t time, uint16_t delay, - lv_anim_ready_cb_t ready_cb); -#endif - /*======================= * Getter functions *======================*/ diff --git a/src/lv_misc/lv_anim.c b/src/lv_misc/lv_anim.c index df38c6943..ef2d6696c 100644 --- a/src/lv_misc/lv_anim.c +++ b/src/lv_misc/lv_anim.c @@ -33,7 +33,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static void anim_task(void * param); +static void anim_task(lv_task_t * param); static bool anim_ready_handler(lv_anim_t * a); /********************** @@ -141,7 +141,7 @@ uint16_t lv_anim_count_running(void) * @param end end value of the animation * @return the required time [ms] for the animation with the given parameters */ -uint16_t lv_anim_speed_to_time(uint16_t speed, int32_t start, int32_t end) +uint16_t lv_anim_speed_to_time(uint16_t speed, lv_anim_value_t start, lv_anim_value_t end) { int32_t d = LV_MATH_ABS((int32_t)start - end); uint32_t time = (int32_t)((int32_t)(d * 1000) / speed); @@ -160,14 +160,16 @@ uint16_t lv_anim_speed_to_time(uint16_t speed, int32_t start, int32_t end) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_linear(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_linear(const lv_anim_t * a) { /*Calculate the current step*/ - uint16_t step; - if(a->time == a->act_time) + uint32_t step; + if(a->time == a->act_time) { step = LV_ANIM_RESOLUTION; /*Use the last value if the time fully elapsed*/ - else - step = (a->act_time * LV_ANIM_RESOLUTION) / a->time; + } + else { + step = ((int32_t)a->act_time * LV_ANIM_RESOLUTION) / a->time; + } /* Get the new value which will be proportional to `step` * and the `start` and `end` values*/ @@ -176,7 +178,7 @@ int32_t lv_anim_path_linear(const lv_anim_t * a) new_value = new_value >> LV_ANIM_RES_SHIFT; new_value += a->start; - return new_value; + return (lv_anim_value_t)new_value; } /** @@ -184,7 +186,7 @@ int32_t lv_anim_path_linear(const lv_anim_t * a) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_ease_in(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_ease_in(const lv_anim_t * a) { /*Calculate the current step*/ uint32_t t; @@ -200,7 +202,7 @@ int32_t lv_anim_path_ease_in(const lv_anim_t * a) new_value = new_value >> 10; new_value += a->start; - return new_value; + return (lv_anim_value_t)new_value; } /** @@ -208,7 +210,7 @@ int32_t lv_anim_path_ease_in(const lv_anim_t * a) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_ease_out(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_ease_out(const lv_anim_t * a) { /*Calculate the current step*/ @@ -225,7 +227,7 @@ int32_t lv_anim_path_ease_out(const lv_anim_t * a) new_value = new_value >> 10; new_value += a->start; - return new_value; + return (lv_anim_value_t)new_value; } /** @@ -233,7 +235,7 @@ int32_t lv_anim_path_ease_out(const lv_anim_t * a) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_ease_in_out(const lv_anim_t * a) { /*Calculate the current step*/ @@ -250,7 +252,7 @@ int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) new_value = new_value >> 10; new_value += a->start; - return new_value; + return (lv_anim_value_t)new_value; } /** @@ -258,7 +260,7 @@ int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_overshoot(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_overshoot(const lv_anim_t * a) { /*Calculate the current step*/ @@ -275,7 +277,7 @@ int32_t lv_anim_path_overshoot(const lv_anim_t * a) new_value = new_value >> 10; new_value += a->start; - return new_value; + return (lv_anim_value_t)new_value; } /** @@ -283,7 +285,7 @@ int32_t lv_anim_path_overshoot(const lv_anim_t * a) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_bounce(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_bounce(const lv_anim_t * a) { /*Calculate the current step*/ uint32_t t; @@ -328,12 +330,11 @@ int32_t lv_anim_path_bounce(const lv_anim_t * a) int32_t step = lv_bezier3(t, 1024, 1024, 800, 0); int32_t new_value; - new_value = (int32_t)step * diff; new_value = new_value >> 10; new_value = a->end - new_value; - return new_value; + return (lv_anim_value_t)new_value; } /** @@ -342,7 +343,7 @@ int32_t lv_anim_path_bounce(const lv_anim_t * a) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_step(const lv_anim_t * a) +lv_anim_value_t lv_anim_path_step(const lv_anim_t * a) { if(a->act_time >= a->time) return a->end; @@ -358,7 +359,7 @@ int32_t lv_anim_path_step(const lv_anim_t * a) * Periodically handle the animations. * @param param unused */ -static void anim_task(void * param) +static void anim_task(lv_task_t * param) { (void)param; diff --git a/src/lv_misc/lv_anim.h b/src/lv_misc/lv_anim.h index b5cc326b2..95444d60b 100644 --- a/src/lv_misc/lv_anim.h +++ b/src/lv_misc/lv_anim.h @@ -32,13 +32,15 @@ extern "C" { * TYPEDEFS **********************/ +typedef int16_t lv_anim_value_t; /*Type of the animated value*/ + struct _lv_anim_t; /*Generic prototype of "animator" functions*/ -typedef void (*lv_anim_exec_cb_t)(void *, int32_t); +typedef void (*lv_anim_exec_cb_t)(void *, lv_anim_value_t); /*Get the current value in an animation*/ -typedef int32_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *); +typedef lv_anim_value_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *); /*Callback for animation ready*/ typedef void (*lv_anim_ready_cb_t)(struct _lv_anim_t *); @@ -77,7 +79,7 @@ lv_anim_t a; a.var = obj; a.start = lv_obj_get_height(obj); a.end = new_height; -a.exec_cb = (lv_anim_fp_t)lv_obj_set_height; +a.exec_cb = (lv_anim_exec_cb_t)lv_obj_set_height; a.path_cb = lv_anim_path_linear; a.ready_cb = NULL; a.act_time = 0; @@ -126,49 +128,49 @@ uint16_t lv_anim_count_running(void); * @param end end value of the animation * @return the required time [ms] for the animation with the given parameters */ -uint16_t lv_anim_speed_to_time(uint16_t speed, int32_t start, int32_t end); +uint16_t lv_anim_speed_to_time(uint16_t speed, lv_anim_value_t start, lv_anim_value_t end); /** * Calculate the current value of an animation applying linear characteristic * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_linear(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_linear(const lv_anim_t * a); /** * Calculate the current value of an animation slowing down the start phase * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_ease_in(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_ease_in(const lv_anim_t * a); /** * Calculate the current value of an animation slowing down the end phase * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_ease_out(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_ease_out(const lv_anim_t * a); /** * Calculate the current value of an animation applying an "S" characteristic (cosine) * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_ease_in_out(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_ease_in_out(const lv_anim_t * a); /** * Calculate the current value of an animation with overshoot at the end * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_overshoot(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_overshoot(const lv_anim_t * a); /** * Calculate the current value of an animation with 3 bounces * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_bounce(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_bounce(const lv_anim_t * a); /** * Calculate the current value of an animation applying step characteristic. @@ -176,7 +178,7 @@ int32_t lv_anim_path_bounce(const lv_anim_t * a); * @param a pointer to an animation * @return the current value to set */ -int32_t lv_anim_path_step(const lv_anim_t * a); +lv_anim_value_t lv_anim_path_step(const lv_anim_t * a); /********************** * MACROS diff --git a/src/lv_objx/lv_mbox.c b/src/lv_objx/lv_mbox.c index e98c40ee1..a4f6a777a 100644 --- a/src/lv_objx/lv_mbox.c +++ b/src/lv_objx/lv_mbox.c @@ -202,14 +202,45 @@ void lv_mbox_start_auto_close(lv_obj_t * mbox, uint16_t delay) if(ext->anim_time != 0) { /*Add shrinking animations*/ - lv_obj_animate(mbox, LV_ANIM_GROW_H | LV_ANIM_OUT, ext->anim_time, delay, NULL); - lv_obj_animate(mbox, LV_ANIM_GROW_V | LV_ANIM_OUT, ext->anim_time, delay, - lv_mbox_close_ready_cb); + lv_anim_t a; + a.var = mbox; + a.start = lv_obj_get_height(mbox); + a.end = 0; + a.exec_cb = (lv_anim_exec_cb_t)lv_obj_set_height; + a.path_cb = lv_anim_path_linear; + a.ready_cb = NULL; + a.act_time = -delay; + a.time = ext->anim_time; + a.playback = 0; + a.playback_pause = 0; + a.repeat = 0; + a.repeat_pause = 0; + a.user_data = NULL; + lv_anim_create(&a); + + a.start = lv_obj_get_width(mbox); + a.ready_cb = lv_mbox_close_ready_cb; + lv_anim_create(&a); /*Disable fit to let shrinking work*/ lv_cont_set_fit(mbox, LV_FIT_NONE); } else { - lv_obj_animate(mbox, LV_ANIM_NONE, ext->anim_time, delay, lv_mbox_close_ready_cb); + /*Create an animation to delete the mbox `delay` ms later*/ + lv_anim_t a; + a.var = mbox; + a.start = 0; + a.end = 1; + a.exec_cb = (lv_anim_exec_cb_t)NULL; + a.path_cb = lv_anim_path_linear; + a.ready_cb = lv_mbox_close_ready_cb; + a.act_time = -delay; + a.time = 0; + a.playback = 0; + a.playback_pause = 0; + a.repeat = 0; + a.repeat_pause = 0; + a.user_data = NULL; + lv_anim_create(&a); } #else (void)delay; /*Unused*/