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