acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_anim.h (15350B)

      1 /**
      2  * @file lv_anim.h
      3  *
      4  */
      5 
      6 #ifndef LV_ANIM_H
      7 #define LV_ANIM_H
      8 
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 /*********************
     14  *      INCLUDES
     15  *********************/
     16 #include "../lv_conf_internal.h"
     17 
     18 #include <stdint.h>
     19 #include <stdbool.h>
     20 #include <stddef.h>
     21 
     22 /*********************
     23  *      DEFINES
     24  *********************/
     25 
     26 #define LV_ANIM_REPEAT_INFINITE      0xFFFF
     27 #define LV_ANIM_PLAYTIME_INFINITE    0xFFFFFFFF
     28 
     29 LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE);
     30 LV_EXPORT_CONST_INT(LV_ANIM_PLAYTIME_INFINITE);
     31 
     32 /**********************
     33  *      TYPEDEFS
     34  **********************/
     35 
     36 /** Can be used to indicate if animations are enabled or disabled in a case*/
     37 typedef enum {
     38     LV_ANIM_OFF,
     39     LV_ANIM_ON,
     40 } lv_anim_enable_t;
     41 
     42 struct _lv_anim_t;
     43 
     44 /** Get the current value during an animation*/
     45 typedef int32_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *);
     46 
     47 /** Generic prototype of "animator" functions.
     48  * First parameter is the variable to animate.
     49  * Second parameter is the value to set.
     50  * Compatible with `lv_xxx_set_yyy(obj, value)` functions
     51  * The `x` in `_xcb_t` means it's not a fully generic prototype because
     52  * it doesn't receive `lv_anim_t *` as its first argument*/
     53 typedef void (*lv_anim_exec_xcb_t)(void *, int32_t);
     54 
     55 /** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter.
     56  * It's more consistent but less convenient. Might be used by binding generator functions.*/
     57 typedef void (*lv_anim_custom_exec_cb_t)(struct _lv_anim_t *, int32_t);
     58 
     59 /** Callback to call when the animation is ready*/
     60 typedef void (*lv_anim_ready_cb_t)(struct _lv_anim_t *);
     61 
     62 /** Callback to call when the animation really stars (considering `delay`)*/
     63 typedef void (*lv_anim_start_cb_t)(struct _lv_anim_t *);
     64 
     65 /** Callback used when the animation values are relative to get the current value*/
     66 typedef int32_t (*lv_anim_get_value_cb_t)(struct _lv_anim_t *);
     67 
     68 /** Describes an animation*/
     69 typedef struct _lv_anim_t {
     70     void * var;                          /**<Variable to animate*/
     71     lv_anim_exec_xcb_t exec_cb;          /**< Function to execute to animate*/
     72     lv_anim_start_cb_t start_cb;         /**< Call it when the animation is starts (considering `delay`)*/
     73     lv_anim_ready_cb_t ready_cb;         /**< Call it when the animation is ready*/
     74     lv_anim_get_value_cb_t get_value_cb; /**< Get the current value in relative mode*/
     75 #if LV_USE_USER_DATA
     76     void * user_data; /**< Custom user data*/
     77 #endif
     78     lv_anim_path_cb_t path_cb;         /**< Describe the path (curve) of animations*/
     79     int32_t start_value;               /**< Start value*/
     80     int32_t current_value;             /**< Current value*/
     81     int32_t end_value;                 /**< End value*/
     82     int32_t time;                /**< Animation time in ms*/
     83     int32_t act_time;            /**< Current time in animation. Set to negative to make delay.*/
     84     uint32_t playback_delay;     /**< Wait before play back*/
     85     uint32_t playback_time;      /**< Duration of playback animation*/
     86     uint32_t repeat_delay;       /**< Wait before repeat*/
     87     uint16_t repeat_cnt;         /**< Repeat count for the animation*/
     88     uint8_t early_apply  : 1;    /**< 1: Apply start value immediately even is there is `delay`*/
     89 
     90     /*Animation system use these - user shouldn't set*/
     91     uint8_t playback_now : 1; /**< Play back is in progress*/
     92     uint8_t run_round : 1;    /**< Indicates the animation has run in this round*/
     93     uint8_t start_cb_called : 1;    /**< Indicates that the `start_cb` was already called*/
     94 } lv_anim_t;
     95 
     96 /**********************
     97  * GLOBAL PROTOTYPES
     98  **********************/
     99 
    100 /**
    101  * Init. the animation module
    102  */
    103 void _lv_anim_core_init(void);
    104 
    105 /**
    106  * Initialize an animation variable.
    107  * E.g.:
    108  * lv_anim_t a;
    109  * lv_anim_init(&a);
    110  * lv_anim_set_...(&a);
    111  * lv_anim_start(&a);
    112  * @param a     pointer to an `lv_anim_t` variable to initialize
    113  */
    114 void lv_anim_init(lv_anim_t * a);
    115 
    116 /**
    117  * Set a variable to animate
    118  * @param a     pointer to an initialized `lv_anim_t` variable
    119  * @param var   pointer to a variable to animate
    120  */
    121 static inline void lv_anim_set_var(lv_anim_t * a, void * var)
    122 {
    123     a->var = var;
    124 }
    125 
    126 /**
    127  * Set a function to animate `var`
    128  * @param a         pointer to an initialized `lv_anim_t` variable
    129  * @param exec_cb   a function to execute during animation
    130  *                  LVGL's built-in functions can be used.
    131  *                  E.g. lv_obj_set_x
    132  */
    133 static inline void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb)
    134 {
    135     a->exec_cb = exec_cb;
    136 }
    137 
    138 /**
    139  * Set the duration of an animation
    140  * @param a         pointer to an initialized `lv_anim_t` variable
    141  * @param duration  duration of the animation in milliseconds
    142  */
    143 static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration)
    144 {
    145     a->time = duration;
    146 }
    147 
    148 /**
    149  * Set a delay before starting the animation
    150  * @param a         pointer to an initialized `lv_anim_t` variable
    151  * @param delay     delay before the animation in milliseconds
    152  */
    153 static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay)
    154 {
    155     a->act_time = -(int32_t)(delay);
    156 }
    157 
    158 /**
    159  * Set the start and end values of an animation
    160  * @param a         pointer to an initialized `lv_anim_t` variable
    161  * @param start     the start value
    162  * @param end       the end value
    163  */
    164 static inline void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end)
    165 {
    166     a->start_value = start;
    167     a->current_value = start;
    168     a->end_value = end;
    169 }
    170 
    171 /**
    172  * Similar to `lv_anim_set_exec_cb` but `lv_anim_custom_exec_cb_t` receives
    173  * `lv_anim_t * ` as its first parameter instead of `void *`.
    174  * This function might be used when LVGL is bound to other languages because
    175  * it's more consistent to have `lv_anim_t *` as first parameter.
    176  * The variable to animate can be stored in the animation's `user_data`
    177  * @param a         pointer to an initialized `lv_anim_t` variable
    178  * @param exec_cb   a function to execute.
    179  */
    180 static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb)
    181 {
    182     a->var     = a;
    183     a->exec_cb = (lv_anim_exec_xcb_t)exec_cb;
    184 }
    185 
    186 /**
    187  * Set the path (curve) of the animation.
    188  * @param a         pointer to an initialized `lv_anim_t` variable
    189  * @param path_cb a function to set the current value of the animation.
    190  */
    191 static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb)
    192 {
    193     a->path_cb = path_cb;
    194 }
    195 
    196 /**
    197  * Set a function call when the animation really starts (considering `delay`)
    198  * @param a         pointer to an initialized `lv_anim_t` variable
    199  * @param start_cb  a function call when the animation starts
    200  */
    201 static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb)
    202 {
    203     a->start_cb = start_cb;
    204 }
    205 
    206 /**
    207  * Set a function to use the current value of the variable and make start and end value
    208  * relative to the returned current value.
    209  * @param a             pointer to an initialized `lv_anim_t` variable
    210  * @param get_value_cb  a function call when the animation starts
    211  */
    212 static inline void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb)
    213 {
    214     a->get_value_cb = get_value_cb;
    215 }
    216 
    217 /**
    218  * Set a function call when the animation is ready
    219  * @param a         pointer to an initialized `lv_anim_t` variable
    220  * @param ready_cb  a function call when the animation is ready
    221  */
    222 static inline void lv_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb)
    223 {
    224     a->ready_cb = ready_cb;
    225 }
    226 
    227 /**
    228  * Make the animation to play back to when the forward direction is ready
    229  * @param a         pointer to an initialized `lv_anim_t` variable
    230  * @param time      the duration of the playback animation in milliseconds. 0: disable playback
    231  */
    232 static inline void lv_anim_set_playback_time(lv_anim_t * a, uint32_t time)
    233 {
    234     a->playback_time = time;
    235 }
    236 
    237 /**
    238  * Make the animation to play back to when the forward direction is ready
    239  * @param a         pointer to an initialized `lv_anim_t` variable
    240  * @param delay     delay in milliseconds before starting the playback animation.
    241  */
    242 static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay)
    243 {
    244     a->playback_delay = delay;
    245 }
    246 
    247 /**
    248  * Make the animation repeat itself.
    249  * @param a         pointer to an initialized `lv_anim_t` variable
    250  * @param cnt       repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition.
    251  */
    252 static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt)
    253 {
    254     a->repeat_cnt = cnt;
    255 }
    256 
    257 /**
    258  * Set a delay before repeating the animation.
    259  * @param a         pointer to an initialized `lv_anim_t` variable
    260  * @param delay     delay in milliseconds before repeating the animation.
    261  */
    262 static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay)
    263 {
    264     a->repeat_delay = delay;
    265 }
    266 
    267 /**
    268  * Set a whether the animation's should be applied immediately or only when the delay expired.
    269  * @param a         pointer to an initialized `lv_anim_t` variable
    270  * @param en        true: apply the start value immediately in `lv_anim_start`;
    271  *                  false: apply the start value only when `delay` ms is elapsed and the animations really starts
    272  */
    273 static inline void lv_anim_set_early_apply(lv_anim_t * a, bool en)
    274 {
    275     a->early_apply = en;
    276 }
    277 
    278 /**
    279  * Set the custom user data field of the animation.
    280  * @param a           pointer to an initialized `lv_anim_t` variable
    281  * @param user_data   pointer to the new user_data.
    282  */
    283 #if LV_USE_USER_DATA
    284 static inline void lv_anim_set_user_data(lv_anim_t * a, void * user_data)
    285 {
    286     a->user_data = user_data;
    287 }
    288 #endif
    289 
    290 /**
    291  * Create an animation
    292  * @param a         an initialized 'anim_t' variable. Not required after call.
    293  * @return          pointer to the created animation (different from the `a` parameter)
    294  */
    295 lv_anim_t * lv_anim_start(const lv_anim_t * a);
    296 
    297 /**
    298  * Get a delay before starting the animation
    299  * @param a pointer to an initialized `lv_anim_t` variable
    300  * @return delay before the animation in milliseconds
    301  */
    302 static inline uint32_t lv_anim_get_delay(lv_anim_t * a)
    303 {
    304     return -a->act_time;
    305 }
    306 
    307 /**
    308  * Get the time used to play the animation.
    309  * @param a pointer to an animation.
    310  * @return the play time in milliseconds.
    311  */
    312 uint32_t lv_anim_get_playtime(lv_anim_t * a);
    313 
    314 /**
    315  * Get the user_data field of the animation
    316  * @param   a pointer to an initialized `lv_anim_t` variable
    317  * @return  the pointer to the custom user_data of the animation
    318  */
    319 #if LV_USE_USER_DATA
    320 static inline void * lv_anim_get_user_data(lv_anim_t * a)
    321 {
    322     return a->user_data;
    323 }
    324 #endif
    325 
    326 /**
    327  * Delete an animation of a variable with a given animator function
    328  * @param var       pointer to variable
    329  * @param exec_cb   a function pointer which is animating 'var',
    330  *                  or NULL to ignore it and delete all the animations of 'var
    331  * @return          true: at least 1 animation is deleted, false: no animation is deleted
    332  */
    333 bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb);
    334 
    335 /**
    336  * Delete all the animations
    337  */
    338 void lv_anim_del_all(void);
    339 
    340 /**
    341  * Get the animation of a variable and its `exec_cb`.
    342  * @param var       pointer to variable
    343  * @param exec_cb   a function pointer which is animating 'var', or NULL to return first matching 'var'
    344  * @return          pointer to the animation.
    345  */
    346 lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb);
    347 
    348 /**
    349  * Delete an animation by getting the animated variable from `a`.
    350  * Only animations with `exec_cb` will be deleted.
    351  * This function exists because it's logical that all anim. functions receives an
    352  * `lv_anim_t` as their first parameter. It's not practical in C but might make
    353  * the API more consequent and makes easier to generate bindings.
    354  * @param a         pointer to an animation.
    355  * @param exec_cb   a function pointer which is animating 'var',
    356  *                  or NULL to ignore it and delete all the animations of 'var
    357  * @return          true: at least 1 animation is deleted, false: no animation is deleted
    358  */
    359 static inline bool lv_anim_custom_del(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb)
    360 {
    361     return lv_anim_del(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb);
    362 }
    363 
    364 /**
    365  * Get the animation of a variable and its `exec_cb`.
    366  * This function exists because it's logical that all anim. functions receives an
    367  * `lv_anim_t` as their first parameter. It's not practical in C but might make
    368  * the API more consequent and makes easier to generate bindings.
    369  * @param a         pointer to an animation.
    370  * @param exec_cb   a function pointer which is animating 'var', or NULL to return first matching 'var'
    371  * @return          pointer to the animation.
    372  */
    373 static inline lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb)
    374 {
    375     return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb);
    376 }
    377 
    378 /**
    379  * Get the number of currently running animations
    380  * @return      the number of running animations
    381  */
    382 uint16_t lv_anim_count_running(void);
    383 
    384 /**
    385  * Calculate the time of an animation with a given speed and the start and end values
    386  * @param speed speed of animation in unit/sec
    387  * @param start     start value of the animation
    388  * @param end       end value of the animation
    389  * @return          the required time [ms] for the animation with the given parameters
    390  */
    391 uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end);
    392 
    393 /**
    394  * Manually refresh the state of the animations.
    395  * Useful to make the animations running in a blocking process where
    396  * `lv_timer_handler` can't run for a while.
    397  * Shouldn't be used directly because it is called in `lv_refr_now()`.
    398  */
    399 void lv_anim_refr_now(void);
    400 
    401 /**
    402  * Calculate the current value of an animation applying linear characteristic
    403  * @param a     pointer to an animation
    404  * @return      the current value to set
    405  */
    406 int32_t lv_anim_path_linear(const lv_anim_t * a);
    407 
    408 /**
    409  * Calculate the current value of an animation slowing down the start phase
    410  * @param a     pointer to an animation
    411  * @return      the current value to set
    412  */
    413 int32_t lv_anim_path_ease_in(const lv_anim_t * a);
    414 
    415 /**
    416  * Calculate the current value of an animation slowing down the end phase
    417  * @param a     pointer to an animation
    418  * @return      the current value to set
    419  */
    420 int32_t lv_anim_path_ease_out(const lv_anim_t * a);
    421 
    422 /**
    423  * Calculate the current value of an animation applying an "S" characteristic (cosine)
    424  * @param a     pointer to an animation
    425  * @return      the current value to set
    426  */
    427 int32_t lv_anim_path_ease_in_out(const lv_anim_t * a);
    428 
    429 /**
    430  * Calculate the current value of an animation with overshoot at the end
    431  * @param a     pointer to an animation
    432  * @return      the current value to set
    433  */
    434 int32_t lv_anim_path_overshoot(const lv_anim_t * a);
    435 
    436 /**
    437  * Calculate the current value of an animation with 3 bounces
    438  * @param a     pointer to an animation
    439  * @return      the current value to set
    440  */
    441 int32_t lv_anim_path_bounce(const lv_anim_t * a);
    442 
    443 /**
    444  * Calculate the current value of an animation applying step characteristic.
    445  * (Set end value on the end of the animation)
    446  * @param a     pointer to an animation
    447  * @return      the current value to set
    448  */
    449 int32_t lv_anim_path_step(const lv_anim_t * a);
    450 
    451 /**********************
    452  *   GLOBAL VARIABLES
    453  **********************/
    454 
    455 /**********************
    456  *      MACROS
    457  **********************/
    458 
    459 #ifdef __cplusplus
    460 } /*extern "C"*/
    461 #endif
    462 
    463 #endif /*LV_ANIM_H*/