1 /**
2 * @file lv_demo_smartwatch_control.c
3 * Control screen layout & functions. Contains quick actions such as music controls.
4 */
5
6 /*********************
7 * INCLUDES
8 *********************/
9 #include "lv_demo_smartwatch.h"
10 #if LV_USE_DEMO_SMARTWATCH
11
12 #include "lv_demo_smartwatch_private.h"
13 #include "lv_demo_smartwatch_control.h"
14
15 /*********************
16 * DEFINES
17 *********************/
18
19 /**********************
20 * TYPEDEFS
21 **********************/
22
23 /**********************
24 * STATIC PROTOTYPES
25 **********************/
26 static void control_screen_create(void);
27
28 static void control_music_events_cb(lv_event_t * e);
29 static void brightness_slider_event_cb(lv_event_t * e);
30
31 /**********************
32 * STATIC VARIABLES
33 **********************/
34 static lv_obj_t * control_screen;
35 static lv_obj_t * control_music_play;
36 static lv_obj_t * control_music_previous;
37 static lv_obj_t * control_music_next;
38 static lv_obj_t * control_bluetooth_icon;
39 static lv_obj_t * control_volume_up;
40 static lv_obj_t * control_volume_down;
41 static lv_obj_t * control_brightness;
42 static lv_obj_t * control_brightness_icon;
43 static lv_smartwatch_music_control_cb_t music_control_cb;
44
45 /**********************
46 * MACROS
47 **********************/
48
49 /**********************
50 * GLOBAL FUNCTIONS
51 **********************/
52
lv_demo_smartwatch_control_create(lv_obj_t * parent)53 void lv_demo_smartwatch_control_create(lv_obj_t * parent)
54 {
55
56 control_screen = lv_tileview_add_tile(parent, 0, 0, LV_DIR_BOTTOM);
57 lv_obj_remove_flag(control_screen, LV_OBJ_FLAG_SCROLLABLE);
58 lv_obj_set_style_bg_color(control_screen, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
59 lv_obj_set_style_bg_opa(control_screen, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
60
61 control_screen_create();
62 }
63
lv_demo_smartwatch_control_load(lv_screen_load_anim_t anim_type,uint32_t time,uint32_t delay)64 void lv_demo_smartwatch_control_load(lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay)
65 {
66 lv_screen_load_anim(control_screen, anim_type, time, delay, false);
67 }
68
lv_demo_smartwatch_set_music_control_cb(lv_smartwatch_music_control_cb_t cb)69 void lv_demo_smartwatch_set_music_control_cb(lv_smartwatch_music_control_cb_t cb)
70 {
71 music_control_cb = cb;
72 }
73
lv_demo_smartwatch_get_tile_control(void)74 lv_obj_t * lv_demo_smartwatch_get_tile_control(void)
75 {
76 return control_screen;
77 }
78
lv_demo_smartwatch_update_brightness_slider(uint8_t value)79 void lv_demo_smartwatch_update_brightness_slider(uint8_t value)
80 {
81 lv_slider_set_value(control_brightness, value, LV_ANIM_OFF);
82 }
83
84 /**********************
85 * STATIC FUNCTIONS
86 **********************/
87
control_screen_create(void)88 static void control_screen_create(void)
89 {
90 control_music_play = lv_image_create(control_screen);
91 lv_image_set_src(control_music_play, &img_play_icon);
92 lv_obj_set_width(control_music_play, LV_SIZE_CONTENT);
93 lv_obj_set_height(control_music_play, LV_SIZE_CONTENT);
94 lv_obj_set_align(control_music_play, LV_ALIGN_CENTER);
95 lv_obj_add_flag(control_music_play, LV_OBJ_FLAG_CLICKABLE);
96 lv_obj_remove_flag(control_music_play, LV_OBJ_FLAG_SCROLLABLE);
97 lv_image_set_scale(control_music_play, 200);
98 lv_obj_set_style_radius(control_music_play, 5, LV_PART_MAIN | LV_STATE_PRESSED);
99 lv_obj_set_style_bg_color(control_music_play, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
100 lv_obj_set_style_bg_opa(control_music_play, 255, LV_PART_MAIN | LV_STATE_PRESSED);
101
102 control_music_previous = lv_image_create(control_screen);
103 lv_image_set_src(control_music_previous, &img_left_arrow_icon);
104 lv_obj_set_width(control_music_previous, LV_SIZE_CONTENT);
105 lv_obj_set_height(control_music_previous, LV_SIZE_CONTENT);
106 lv_obj_set_x(control_music_previous, -75);
107 lv_obj_set_y(control_music_previous, 0);
108 lv_obj_set_align(control_music_previous, LV_ALIGN_CENTER);
109 lv_obj_add_flag(control_music_previous, LV_OBJ_FLAG_CLICKABLE);
110 lv_obj_remove_flag(control_music_previous, LV_OBJ_FLAG_SCROLLABLE);
111 lv_image_set_scale(control_music_previous, 200);
112 lv_obj_set_style_radius(control_music_previous, 5, LV_PART_MAIN | LV_STATE_PRESSED);
113 lv_obj_set_style_bg_color(control_music_previous, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
114 lv_obj_set_style_bg_opa(control_music_previous, 255, LV_PART_MAIN | LV_STATE_PRESSED);
115
116 control_music_next = lv_image_create(control_screen);
117 lv_image_set_src(control_music_next, &img_right_arrow_icon);
118 lv_obj_set_width(control_music_next, LV_SIZE_CONTENT);
119 lv_obj_set_height(control_music_next, LV_SIZE_CONTENT);
120 lv_obj_set_x(control_music_next, 75);
121 lv_obj_set_y(control_music_next, 0);
122 lv_obj_set_align(control_music_next, LV_ALIGN_CENTER);
123 lv_obj_add_flag(control_music_next, LV_OBJ_FLAG_CLICKABLE);
124 lv_obj_remove_flag(control_music_next, LV_OBJ_FLAG_SCROLLABLE);
125 lv_image_set_scale(control_music_next, 200);
126 lv_obj_set_style_radius(control_music_next, 5, LV_PART_MAIN | LV_STATE_PRESSED);
127 lv_obj_set_style_bg_color(control_music_next, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
128 lv_obj_set_style_bg_opa(control_music_next, 255, LV_PART_MAIN | LV_STATE_PRESSED);
129
130 control_bluetooth_icon = lv_image_create(control_screen);
131 lv_image_set_src(control_bluetooth_icon, &img_bluetooth_g_icon);
132 lv_obj_set_width(control_bluetooth_icon, LV_SIZE_CONTENT);
133 lv_obj_set_height(control_bluetooth_icon, LV_SIZE_CONTENT);
134 lv_obj_set_x(control_bluetooth_icon, 0);
135 lv_obj_set_y(control_bluetooth_icon, -100);
136 lv_obj_set_align(control_bluetooth_icon, LV_ALIGN_CENTER);
137 lv_obj_add_state(control_bluetooth_icon, LV_STATE_CHECKED);
138 lv_obj_add_flag(control_bluetooth_icon, LV_OBJ_FLAG_CHECKABLE);
139 lv_obj_remove_flag(control_bluetooth_icon, LV_OBJ_FLAG_SCROLLABLE);
140 lv_image_set_scale(control_bluetooth_icon, 200);
141 lv_obj_set_style_image_recolor(control_bluetooth_icon, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_CHECKED);
142 lv_obj_set_style_image_recolor_opa(control_bluetooth_icon, 230, LV_PART_MAIN | LV_STATE_CHECKED);
143 lv_obj_set_style_radius(control_bluetooth_icon, 5, LV_PART_MAIN | LV_STATE_PRESSED);
144 lv_obj_set_style_bg_color(control_bluetooth_icon, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
145 lv_obj_set_style_bg_opa(control_bluetooth_icon, 255, LV_PART_MAIN | LV_STATE_PRESSED);
146
147 control_brightness = lv_slider_create(control_screen);
148 lv_slider_set_range(control_brightness, 1, 255);
149 lv_slider_set_value(control_brightness, 50, LV_ANIM_OFF);
150 lv_obj_set_width(control_brightness, 150);
151 lv_obj_set_height(control_brightness, 30);
152 lv_obj_set_x(control_brightness, 0);
153 lv_obj_set_y(control_brightness, -60);
154 lv_obj_set_align(control_brightness, LV_ALIGN_CENTER);
155 lv_obj_set_style_radius(control_brightness, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
156 lv_obj_set_style_bg_color(control_brightness, lv_color_hex(0x4E4E4E), LV_PART_MAIN | LV_STATE_DEFAULT);
157 lv_obj_set_style_bg_opa(control_brightness, 150, LV_PART_MAIN | LV_STATE_DEFAULT);
158 lv_obj_set_style_radius(control_brightness, 10, LV_PART_INDICATOR | LV_STATE_DEFAULT);
159 lv_obj_set_style_bg_color(control_brightness, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR | LV_STATE_DEFAULT);
160 lv_obj_set_style_bg_opa(control_brightness, 255, LV_PART_INDICATOR | LV_STATE_DEFAULT);
161 lv_obj_set_style_bg_color(control_brightness, lv_color_hex(0xFFFFFF), LV_PART_KNOB | LV_STATE_DEFAULT);
162 lv_obj_set_style_bg_opa(control_brightness, 0, LV_PART_KNOB | LV_STATE_DEFAULT);
163
164 control_brightness_icon = lv_image_create(control_brightness);
165 lv_image_set_src(control_brightness_icon, &img_brightness_icon);
166 lv_image_set_scale(control_brightness_icon, 100);
167 lv_obj_set_width(control_brightness_icon, 40);
168 lv_obj_set_height(control_brightness_icon, 30);
169 lv_obj_set_align(control_brightness_icon, LV_ALIGN_LEFT_MID);
170 lv_obj_remove_flag(control_brightness_icon, LV_OBJ_FLAG_SCROLLABLE);
171 lv_obj_set_style_blend_mode(control_brightness_icon, LV_BLEND_MODE_MULTIPLY, LV_PART_MAIN | LV_STATE_DEFAULT);
172 lv_obj_set_style_image_recolor(control_brightness_icon, lv_color_hex(0x777777), LV_PART_MAIN | LV_STATE_DEFAULT);
173 lv_obj_set_style_image_recolor_opa(control_brightness_icon, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
174
175 control_volume_up = lv_image_create(control_screen);
176 lv_image_set_src(control_volume_up, &img_vol_down_icon);
177 lv_obj_set_width(control_volume_up, LV_SIZE_CONTENT);
178 lv_obj_set_height(control_volume_up, LV_SIZE_CONTENT);
179 lv_obj_set_x(control_volume_up, 40);
180 lv_obj_set_y(control_volume_up, 60);
181 lv_obj_set_align(control_volume_up, LV_ALIGN_CENTER);
182 lv_obj_add_flag(control_volume_up, LV_OBJ_FLAG_CLICKABLE);
183 lv_obj_remove_flag(control_volume_up, LV_OBJ_FLAG_SCROLLABLE);
184 lv_image_set_scale(control_volume_up, 200);
185 lv_obj_set_style_radius(control_volume_up, 5, LV_PART_MAIN | LV_STATE_PRESSED);
186 lv_obj_set_style_bg_color(control_volume_up, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
187 lv_obj_set_style_bg_opa(control_volume_up, 255, LV_PART_MAIN | LV_STATE_PRESSED);
188
189 control_volume_down = lv_image_create(control_screen);
190 lv_image_set_src(control_volume_down, &img_vol_up_icon);
191 lv_obj_set_width(control_volume_down, LV_SIZE_CONTENT);
192 lv_obj_set_height(control_volume_down, LV_SIZE_CONTENT);
193 lv_obj_set_x(control_volume_down, -40);
194 lv_obj_set_y(control_volume_down, 60);
195 lv_obj_set_align(control_volume_down, LV_ALIGN_CENTER);
196 lv_obj_add_flag(control_volume_down, LV_OBJ_FLAG_CLICKABLE);
197 lv_obj_remove_flag(control_volume_down, LV_OBJ_FLAG_SCROLLABLE);
198 lv_image_set_scale(control_volume_down, 200);
199 lv_obj_set_style_radius(control_volume_down, 5, LV_PART_MAIN | LV_STATE_PRESSED);
200 lv_obj_set_style_bg_color(control_volume_down, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
201 lv_obj_set_style_bg_opa(control_volume_down, 255, LV_PART_MAIN | LV_STATE_PRESSED);
202
203 lv_obj_add_event_cb(control_music_play, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x9900);
204 lv_obj_add_event_cb(control_music_previous, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x9D02);
205 lv_obj_add_event_cb(control_music_next, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x9D03);
206 lv_obj_add_event_cb(control_volume_up, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x99A1);
207 lv_obj_add_event_cb(control_volume_down, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x99A2);
208
209 lv_obj_add_event_cb(control_brightness, brightness_slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
210
211 }
212
brightness_slider_event_cb(lv_event_t * e)213 static void brightness_slider_event_cb(lv_event_t * e)
214 {
215 lv_obj_t * active_screen = lv_screen_active();
216 if(active_screen != lv_demo_smartwatch_get_tileview()) {
217 /* event was triggered but the current screen is no longer active */
218 return;
219 }
220 lv_obj_t * target = lv_event_get_target(e);
221 int32_t value = lv_slider_get_value(target);
222 lv_demo_smartwatch_set_default_brightness((uint8_t)value);
223 }
224
control_music_events_cb(lv_event_t * e)225 static void control_music_events_cb(lv_event_t * e)
226 {
227 lv_obj_t * active_screen = lv_screen_active();
228 if(active_screen != lv_demo_smartwatch_get_tileview()) {
229 /* event was triggered but the current screen is no longer active */
230 return;
231 }
232 lv_event_code_t event_code = lv_event_get_code(e);
233 if(event_code == LV_EVENT_CLICKED) {
234 uint16_t code = (uint16_t)(intptr_t)lv_event_get_user_data(e);
235
236 /* send actions to user callback if defined */
237 if(music_control_cb != NULL) {
238 music_control_cb(code);
239 }
240 }
241 }
242
243 #endif /*LV_USE_DEMO_SMARTWATCH*/
244