Files
lvgl/demos/smartwatch/lv_demo_smartwatch_control.c
2025-01-21 15:34:03 -03:00

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*/