#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; }