1 /**
2  * @file lv_spinner.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "../../misc/lv_anim_private.h"
10 #include "../../core/lv_obj_class_private.h"
11 #include "../../lvgl.h"
12 #if LV_USE_SPINNER
13 
14 /*********************
15  *      DEFINES
16  *********************/
17 #define DEF_ARC_ANGLE   200
18 #define DEF_TIME        1000
19 
20 /**********************
21  *      TYPEDEFS
22  **********************/
23 
24 /**********************
25  *  STATIC PROTOTYPES
26  **********************/
27 static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
28 static void arc_anim_start_angle(void * obj, int32_t v);
29 static void arc_anim_end_angle(void * obj, int32_t v);
30 
31 /**********************
32  *  STATIC VARIABLES
33  **********************/
34 const lv_obj_class_t lv_spinner_class = {
35     .base_class = &lv_arc_class,
36     .constructor_cb = lv_spinner_constructor,
37     .name = "spinner",
38 };
39 
40 /**********************
41  *      MACROS
42  **********************/
43 
44 /**********************
45  *   GLOBAL FUNCTIONS
46  **********************/
47 
lv_spinner_create(lv_obj_t * parent)48 lv_obj_t * lv_spinner_create(lv_obj_t * parent)
49 {
50 
51     lv_obj_t * obj = lv_obj_class_create_obj(&lv_spinner_class, parent);
52     lv_obj_class_init_obj(obj);
53     return obj;
54 }
55 
lv_spinner_set_anim_params(lv_obj_t * obj,uint32_t t,uint32_t angle)56 void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle)
57 {
58     /*Delete the current animation*/
59     lv_anim_delete(obj, NULL);
60 
61     lv_anim_t a;
62     lv_anim_init(&a);
63     lv_anim_set_var(&a, obj);
64     lv_anim_set_exec_cb(&a, arc_anim_end_angle);
65     lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
66     lv_anim_set_duration(&a, t);
67     lv_anim_set_values(&a, angle, 360 + angle);
68     lv_anim_start(&a);
69 
70     lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3);
71     lv_anim_set_bezier3_param(&a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0.58),
72                               LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(1));
73     lv_anim_set_values(&a, 0, 360);
74     lv_anim_set_exec_cb(&a, arc_anim_start_angle);
75     lv_anim_start(&a);
76 
77     lv_arc_set_bg_angles(obj, 0, 360);
78     lv_arc_set_rotation(obj, 270);
79 }
80 
81 /**********************
82  *   STATIC FUNCTIONS
83  **********************/
84 
lv_spinner_constructor(const lv_obj_class_t * class_p,lv_obj_t * obj)85 static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
86 {
87     LV_TRACE_OBJ_CREATE("begin");
88 
89     LV_UNUSED(class_p);
90 
91     lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE);
92 
93     lv_spinner_set_anim_params(obj, DEF_TIME, DEF_ARC_ANGLE);
94 }
95 
arc_anim_start_angle(void * obj,int32_t v)96 static void arc_anim_start_angle(void * obj, int32_t v)
97 {
98     lv_arc_set_start_angle(obj, (uint32_t) v);
99 }
100 
arc_anim_end_angle(void * obj,int32_t v)101 static void arc_anim_end_angle(void * obj, int32_t v)
102 {
103     lv_arc_set_end_angle(obj, (uint32_t) v);
104 }
105 
106 #endif /*LV_USE_SPINNER*/
107