KT25-1015_AC695x_SDK310/apps/ui/ui_bt.c

261 lines
8.2 KiB
C

#include "ui_bt.h"
#include "img_bg.h"
#include "kt_ui.h"
#include "kt.h"
#include "key_event_deal.h"
#include "user_cfg.h"
#include "lvgl.h"
#include "drv_st7789.h"
#include "eye_led.h"
extern void bt_get_play_time(tPlayTime *pt);
static lv_obj_t *bar_progress;
static lv_obj_t *label_curr_time;
static lv_obj_t *label_total_time;
static lv_obj_t *led_list;
#define LED_MODE_COUNT 8
#define LIST_TOP 58
#define LIST_W (LCD_W - 24)
#define LIST_H (BAR_Y - LIST_TOP - 5)
#define ROW_GAP 1
static u8 setting_flag;
static int led_focus_idx;
static u8 last_led_mode = 1;
static void clear_focus_style(lv_obj_t *btn)
{
lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0);
}
static void set_focus_style(lv_obj_t *btn)
{
lv_obj_set_style_bg_opa(btn, LV_OPA_COVER, 0);
lv_obj_set_style_bg_color(btn, lv_color_hex(0x333333), 0);
lv_obj_scroll_to_view(btn, LV_ANIM_OFF);
}
static void ui_bt_update_led_mode_item(u8 mode)
{
if (!led_list) {
return;
}
for (int i = 0; i < LED_MODE_COUNT; i++) {
lv_obj_t *c = lv_obj_get_child(led_list, i);
if (!c) {
continue;
}
lv_color_t color = (mode != 0 && (int)(mode - 1) == i)
? lv_color_hex(0x00FF00)
: lv_color_hex(0xFFFFFF);
lv_obj_set_style_text_color(c, color, 0);
}
}
static void ui_bt_update_led_focus_style(void)
{
if (!led_list) {
return;
}
for (int i = 0; i < LED_MODE_COUNT; i++) {
lv_obj_t *c = lv_obj_get_child(led_list, i);
if (!c) {
continue;
}
if (setting_flag && i == led_focus_idx) {
set_focus_style(c);
} else {
clear_focus_style(c);
}
}
}
static void create_led_mode_list(lv_obj_t *list)
{
const char *mode_text[] = {"Mode 1", "Mode 2", "Mode 3", "Mode 4", "Mode 5", "Mode 6", "Mode 7", "Mode 8"};
for (int i = 0; i < LED_MODE_COUNT; i++) {
lv_obj_t *btn = lv_list_add_btn(list, LV_SYMBOL_CHARGE, mode_text[i]);
lv_obj_set_style_pad_all(btn, 2, 0);
lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0);
lv_obj_set_style_text_color(btn, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_border_width(btn, 1, 0);
lv_obj_set_style_border_side(btn, LV_BORDER_SIDE_BOTTOM, 0);
lv_obj_set_style_border_color(btn, lv_color_hex(0xAAAAAA), 0);
}
}
/* 刷新播放时间显示 */
static void ui_bt_refresh_play_time(void)
{
tPlayTime pt;
bt_get_play_time(&pt);
char buf[16];
/* 当前时间 M:SS */
lv_snprintf(buf, sizeof(buf), "%" LV_PRIu32 ":%02" LV_PRIu32, pt.curr_min, pt.curr_sec);
lv_label_set_text(label_curr_time, buf);
/* 总时间 M:SS */
lv_snprintf(buf, sizeof(buf), "%" LV_PRIu32 ":%02" LV_PRIu32, pt.total_min, pt.total_sec);
lv_label_set_text(label_total_time, buf);
/* 进度条 0~100 */
u32 total_sec = pt.total_min * 60 + pt.total_sec;
u32 curr_sec = pt.curr_min * 60 + pt.curr_sec;
int val = (total_sec > 0) ? (int)(curr_sec * 100 / total_sec) : 0;
if (val > 100) val = 100;
lv_bar_set_value(bar_progress, val, LV_ANIM_OFF);
}
void ui_bt_update_play_time(void)
{
ui_bt_refresh_play_time();
}
lv_obj_t *ui_bt_create(void)
{
lv_obj_t *scr = lv_obj_create(NULL);
lv_obj_set_style_bg_img_src(scr, &img_bg, 0);
lv_obj_set_style_pad_all(scr, 0, 0);
lv_obj_clear_flag(scr, LV_OBJ_FLAG_SCROLLABLE);
#define TITLE_H 36
#define BAR_W (LCD_W - 104)
#define BAR_X 52
#define BAR_H 14 /* 加粗进度条 */
#define BAR_Y (LCD_H - BAR_H - 5) /* 距底部 5 像素 */
#define TIME_Y (BAR_Y - 1)
/* 顶部标题 */
lv_obj_t *title = lv_label_create(scr);
lv_label_set_text(title, "BT");
lv_obj_set_style_text_font(title, &lv_font_montserrat_20, 0);
lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_pos(title, 0, 8);
lv_obj_set_width(title, LCD_W);
lv_obj_set_style_text_align(title, LV_TEXT_ALIGN_CENTER, 0);
/* 蓝牙名:屏幕正中 */
lv_obj_t *label_bt_name = lv_label_create(scr);
{
const char *name = bt_get_local_name();
lv_label_set_text(label_bt_name, (name && name[0]) ? name : "---");
}
lv_obj_set_style_text_color(label_bt_name, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_bt_name, &lv_font_montserrat_12, 0);
lv_obj_set_width(label_bt_name, LCD_W);
lv_obj_set_style_text_align(label_bt_name, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_set_pos(label_bt_name, 0, 39);
led_list = lv_list_create(scr);
lv_obj_set_size(led_list, LIST_W, LIST_H);
lv_obj_set_pos(led_list, 12, LIST_TOP);
lv_obj_set_style_bg_opa(led_list, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(led_list, 1, 0);
lv_obj_set_style_border_color(led_list, lv_color_hex(0xCCCCCC), 0);
lv_obj_set_style_text_color(led_list, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(led_list, &lv_font_montserrat_12, 0);
lv_obj_set_style_pad_row(led_list, ROW_GAP, 0);
create_led_mode_list(led_list);
{
u8 mode = eye_led_get_mode();
if (mode != 0) {
last_led_mode = mode;
}
ui_bt_update_led_mode_item(mode);
}
ui_bt_update_led_focus_style();
/* 进度条:靠下、加粗,背景色调亮便于与背景图区分 */
bar_progress = lv_bar_create(scr);
lv_obj_set_size(bar_progress, BAR_W, BAR_H);
lv_obj_set_pos(bar_progress, BAR_X, BAR_Y);
lv_bar_set_range(bar_progress, 0, 100);
lv_bar_set_value(bar_progress, 0, LV_ANIM_OFF);
lv_obj_set_style_bg_color(bar_progress, lv_color_hex(0xAAAAAA), LV_PART_MAIN); /* 浅灰,与背景图对比明显 */
lv_obj_set_style_bg_opa(bar_progress, LV_OPA_70, LV_PART_MAIN);
lv_obj_set_style_bg_color(bar_progress, lv_color_hex(0x2196F3), LV_PART_INDICATOR);
lv_obj_set_style_radius(bar_progress, 7, 0);
lv_obj_set_style_radius(bar_progress, 7, LV_PART_INDICATOR);
/* 当前时间 / 总时间 标签 */
label_curr_time = lv_label_create(scr);
lv_label_set_text(label_curr_time, "0:00");
lv_obj_set_style_text_color(label_curr_time, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_curr_time, &lv_font_montserrat_12, 0);
lv_obj_set_pos(label_curr_time, 8, TIME_Y);
label_total_time = lv_label_create(scr);
lv_label_set_text(label_total_time, "0:00");
lv_obj_set_style_text_color(label_total_time, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_total_time, &lv_font_montserrat_12, 0);
lv_obj_set_pos(label_total_time, BAR_X + BAR_W + 8, TIME_Y);
ui_bt_refresh_play_time();
return scr;
}
void ui_bt_on_key(int key_event, int key_value)
{
(void)key_value;
switch (key_event)
{
case KEY_MUSIC_PREV:
if (setting_flag) {
led_focus_idx = (led_focus_idx - 1 + LED_MODE_COUNT) % LED_MODE_COUNT;
ui_bt_update_led_focus_style();
}
break;
case KEY_MUSIC_NEXT:
if (setting_flag) {
led_focus_idx = (led_focus_idx + 1) % LED_MODE_COUNT;
ui_bt_update_led_focus_style();
}
break;
case KEY_MUSIC_PP:
if (setting_flag) {
eye_led_stop();
last_led_mode = (u8)(led_focus_idx + 1);
eye_led_set_mode(last_led_mode);
eye_led_start();
ui_bt_update_led_mode_item(last_led_mode);
setting_flag = 0;
ui_bt_update_led_focus_style();
}
break;
case KEY_USER_FLASH_LED:
if (eye_led_get_mode() != 0) {
eye_led_stop();
ui_bt_update_led_mode_item(0);
} else {
eye_led_set_mode(last_led_mode);
eye_led_start();
ui_bt_update_led_mode_item(last_led_mode);
}
break;
case KEY_USER_SETTING:
setting_flag = !setting_flag;
if (setting_flag) {
led_focus_idx = 0;
}
ui_bt_update_led_focus_style();
break;
case KEY_USER_PLAY_TIME_UPDATE:
ui_bt_refresh_play_time();
break;
case KEY_USER_EYE_LED_STOP:
ui_bt_update_led_mode_item(0);
break;
default:
break;
}
}
u8 ui_bt_get_setting_flag(void)
{
return setting_flag;
}