244 lines
11 KiB
C
244 lines
11 KiB
C
/**
|
|
* @file lv_demo_smartwatch_control.c
|
|
* Control screen layout & functions. Contains quick actions such as music controls.
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "lv_demo_smartwatch.h"
|
|
#if LV_USE_DEMO_SMARTWATCH
|
|
|
|
#include "lv_demo_smartwatch_private.h"
|
|
#include "lv_demo_smartwatch_control.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
static void control_screen_create(void);
|
|
|
|
static void control_music_events_cb(lv_event_t * e);
|
|
static void brightness_slider_event_cb(lv_event_t * e);
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
static lv_obj_t * control_screen;
|
|
static lv_obj_t * control_music_play;
|
|
static lv_obj_t * control_music_previous;
|
|
static lv_obj_t * control_music_next;
|
|
static lv_obj_t * control_bluetooth_icon;
|
|
static lv_obj_t * control_volume_up;
|
|
static lv_obj_t * control_volume_down;
|
|
static lv_obj_t * control_brightness;
|
|
static lv_obj_t * control_brightness_icon;
|
|
static lv_smartwatch_music_control_cb_t music_control_cb;
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
|
|
void lv_demo_smartwatch_control_create(lv_obj_t * parent)
|
|
{
|
|
|
|
control_screen = lv_tileview_add_tile(parent, 0, 0, LV_DIR_BOTTOM);
|
|
lv_obj_remove_flag(control_screen, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_obj_set_style_bg_color(control_screen, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_opa(control_screen, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
|
|
control_screen_create();
|
|
}
|
|
|
|
void lv_demo_smartwatch_control_load(lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay)
|
|
{
|
|
lv_screen_load_anim(control_screen, anim_type, time, delay, false);
|
|
}
|
|
|
|
void lv_demo_smartwatch_set_music_control_cb(lv_smartwatch_music_control_cb_t cb)
|
|
{
|
|
music_control_cb = cb;
|
|
}
|
|
|
|
lv_obj_t * lv_demo_smartwatch_get_tile_control(void)
|
|
{
|
|
return control_screen;
|
|
}
|
|
|
|
void lv_demo_smartwatch_update_brightness_slider(uint8_t value)
|
|
{
|
|
lv_slider_set_value(control_brightness, value, LV_ANIM_OFF);
|
|
}
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
static void control_screen_create(void)
|
|
{
|
|
control_music_play = lv_image_create(control_screen);
|
|
lv_image_set_src(control_music_play, &img_play_icon);
|
|
lv_obj_set_width(control_music_play, LV_SIZE_CONTENT);
|
|
lv_obj_set_height(control_music_play, LV_SIZE_CONTENT);
|
|
lv_obj_set_align(control_music_play, LV_ALIGN_CENTER);
|
|
lv_obj_add_flag(control_music_play, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_remove_flag(control_music_play, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_image_set_scale(control_music_play, 200);
|
|
lv_obj_set_style_radius(control_music_play, 5, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_color(control_music_play, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_opa(control_music_play, 255, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
|
|
control_music_previous = lv_image_create(control_screen);
|
|
lv_image_set_src(control_music_previous, &img_left_arrow_icon);
|
|
lv_obj_set_width(control_music_previous, LV_SIZE_CONTENT);
|
|
lv_obj_set_height(control_music_previous, LV_SIZE_CONTENT);
|
|
lv_obj_set_x(control_music_previous, -75);
|
|
lv_obj_set_y(control_music_previous, 0);
|
|
lv_obj_set_align(control_music_previous, LV_ALIGN_CENTER);
|
|
lv_obj_add_flag(control_music_previous, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_remove_flag(control_music_previous, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_image_set_scale(control_music_previous, 200);
|
|
lv_obj_set_style_radius(control_music_previous, 5, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_color(control_music_previous, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_opa(control_music_previous, 255, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
|
|
control_music_next = lv_image_create(control_screen);
|
|
lv_image_set_src(control_music_next, &img_right_arrow_icon);
|
|
lv_obj_set_width(control_music_next, LV_SIZE_CONTENT);
|
|
lv_obj_set_height(control_music_next, LV_SIZE_CONTENT);
|
|
lv_obj_set_x(control_music_next, 75);
|
|
lv_obj_set_y(control_music_next, 0);
|
|
lv_obj_set_align(control_music_next, LV_ALIGN_CENTER);
|
|
lv_obj_add_flag(control_music_next, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_remove_flag(control_music_next, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_image_set_scale(control_music_next, 200);
|
|
lv_obj_set_style_radius(control_music_next, 5, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_color(control_music_next, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_opa(control_music_next, 255, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
|
|
control_bluetooth_icon = lv_image_create(control_screen);
|
|
lv_image_set_src(control_bluetooth_icon, &img_bluetooth_g_icon);
|
|
lv_obj_set_width(control_bluetooth_icon, LV_SIZE_CONTENT);
|
|
lv_obj_set_height(control_bluetooth_icon, LV_SIZE_CONTENT);
|
|
lv_obj_set_x(control_bluetooth_icon, 0);
|
|
lv_obj_set_y(control_bluetooth_icon, -100);
|
|
lv_obj_set_align(control_bluetooth_icon, LV_ALIGN_CENTER);
|
|
lv_obj_add_state(control_bluetooth_icon, LV_STATE_CHECKED);
|
|
lv_obj_add_flag(control_bluetooth_icon, LV_OBJ_FLAG_CHECKABLE);
|
|
lv_obj_remove_flag(control_bluetooth_icon, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_image_set_scale(control_bluetooth_icon, 200);
|
|
lv_obj_set_style_image_recolor(control_bluetooth_icon, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_CHECKED);
|
|
lv_obj_set_style_image_recolor_opa(control_bluetooth_icon, 230, LV_PART_MAIN | LV_STATE_CHECKED);
|
|
lv_obj_set_style_radius(control_bluetooth_icon, 5, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_color(control_bluetooth_icon, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_opa(control_bluetooth_icon, 255, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
|
|
control_brightness = lv_slider_create(control_screen);
|
|
lv_slider_set_range(control_brightness, 1, 255);
|
|
lv_slider_set_value(control_brightness, 50, LV_ANIM_OFF);
|
|
lv_obj_set_width(control_brightness, 150);
|
|
lv_obj_set_height(control_brightness, 30);
|
|
lv_obj_set_x(control_brightness, 0);
|
|
lv_obj_set_y(control_brightness, -60);
|
|
lv_obj_set_align(control_brightness, LV_ALIGN_CENTER);
|
|
lv_obj_set_style_radius(control_brightness, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_color(control_brightness, lv_color_hex(0x4E4E4E), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_opa(control_brightness, 150, LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_radius(control_brightness, 10, LV_PART_INDICATOR | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_color(control_brightness, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_opa(control_brightness, 255, LV_PART_INDICATOR | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_color(control_brightness, lv_color_hex(0xFFFFFF), LV_PART_KNOB | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_bg_opa(control_brightness, 0, LV_PART_KNOB | LV_STATE_DEFAULT);
|
|
|
|
control_brightness_icon = lv_image_create(control_brightness);
|
|
lv_image_set_src(control_brightness_icon, &img_brightness_icon);
|
|
lv_image_set_scale(control_brightness_icon, 100);
|
|
lv_obj_set_width(control_brightness_icon, 40);
|
|
lv_obj_set_height(control_brightness_icon, 30);
|
|
lv_obj_set_align(control_brightness_icon, LV_ALIGN_LEFT_MID);
|
|
lv_obj_remove_flag(control_brightness_icon, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_obj_set_style_blend_mode(control_brightness_icon, LV_BLEND_MODE_MULTIPLY, LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_image_recolor(control_brightness_icon, lv_color_hex(0x777777), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
lv_obj_set_style_image_recolor_opa(control_brightness_icon, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
|
|
control_volume_up = lv_image_create(control_screen);
|
|
lv_image_set_src(control_volume_up, &img_vol_down_icon);
|
|
lv_obj_set_width(control_volume_up, LV_SIZE_CONTENT);
|
|
lv_obj_set_height(control_volume_up, LV_SIZE_CONTENT);
|
|
lv_obj_set_x(control_volume_up, 40);
|
|
lv_obj_set_y(control_volume_up, 60);
|
|
lv_obj_set_align(control_volume_up, LV_ALIGN_CENTER);
|
|
lv_obj_add_flag(control_volume_up, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_remove_flag(control_volume_up, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_image_set_scale(control_volume_up, 200);
|
|
lv_obj_set_style_radius(control_volume_up, 5, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_color(control_volume_up, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_opa(control_volume_up, 255, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
|
|
control_volume_down = lv_image_create(control_screen);
|
|
lv_image_set_src(control_volume_down, &img_vol_up_icon);
|
|
lv_obj_set_width(control_volume_down, LV_SIZE_CONTENT);
|
|
lv_obj_set_height(control_volume_down, LV_SIZE_CONTENT);
|
|
lv_obj_set_x(control_volume_down, -40);
|
|
lv_obj_set_y(control_volume_down, 60);
|
|
lv_obj_set_align(control_volume_down, LV_ALIGN_CENTER);
|
|
lv_obj_add_flag(control_volume_down, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_remove_flag(control_volume_down, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_image_set_scale(control_volume_down, 200);
|
|
lv_obj_set_style_radius(control_volume_down, 5, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_color(control_volume_down, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_PRESSED);
|
|
lv_obj_set_style_bg_opa(control_volume_down, 255, LV_PART_MAIN | LV_STATE_PRESSED);
|
|
|
|
lv_obj_add_event_cb(control_music_play, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x9900);
|
|
lv_obj_add_event_cb(control_music_previous, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x9D02);
|
|
lv_obj_add_event_cb(control_music_next, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x9D03);
|
|
lv_obj_add_event_cb(control_volume_up, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x99A1);
|
|
lv_obj_add_event_cb(control_volume_down, control_music_events_cb, LV_EVENT_ALL, (void *)(intptr_t)0x99A2);
|
|
|
|
lv_obj_add_event_cb(control_brightness, brightness_slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
|
|
|
}
|
|
|
|
static void brightness_slider_event_cb(lv_event_t * e)
|
|
{
|
|
lv_obj_t * active_screen = lv_screen_active();
|
|
if(active_screen != lv_demo_smartwatch_get_tileview()) {
|
|
/* event was triggered but the current screen is no longer active */
|
|
return;
|
|
}
|
|
lv_obj_t * target = lv_event_get_target(e);
|
|
int32_t value = lv_slider_get_value(target);
|
|
lv_demo_smartwatch_set_default_brightness((uint8_t)value);
|
|
}
|
|
|
|
static void control_music_events_cb(lv_event_t * e)
|
|
{
|
|
lv_obj_t * active_screen = lv_screen_active();
|
|
if(active_screen != lv_demo_smartwatch_get_tileview()) {
|
|
/* event was triggered but the current screen is no longer active */
|
|
return;
|
|
}
|
|
lv_event_code_t event_code = lv_event_get_code(e);
|
|
if(event_code == LV_EVENT_CLICKED) {
|
|
uint16_t code = (uint16_t)(intptr_t)lv_event_get_user_data(e);
|
|
|
|
/* send actions to user callback if defined */
|
|
if(music_control_cb != NULL) {
|
|
music_control_cb(code);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif /*LV_USE_DEMO_SMARTWATCH*/
|