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