#include "kt_ui.h" #include "ui_home.h" #include "ui_bt.h" #include "ui_music.h" #include "lvgl.h" #include "lv_port_disp.h" #include "drv_st7789.h" #include "kt.h" #include "app_task.h" #include "key_event_deal.h" void kt_ui_entry(void *priv); //-----------------------------TIMER 2----------------------------------- static const u32 __div[] = { /*0000*/ 1, /*0001*/ 4, /*0010*/ 16, /*0011*/ 64, /*0100*/ 2, /*0101*/ 8, /*0110*/ 32, /*0111*/ 128, /*1000*/ 256, /*1001*/ 4 * 256, /*1010*/ 16 * 256, /*1011*/ 64 * 256, /*1100*/ 2 * 256, /*1101*/ 8 * 256, /*1110*/ 32 * 256, /*1111*/ 128 * 256, }; #define APP_TIMER_CLK clk_get("timer") #define MAX_TIME_CNT 0x7fff #define MIN_TIME_CNT 0x100 #define TIMER_UNIT_MS 1 #define MAX_TIMER_PERIOD_MS (1000 / TIMER_UNIT_MS) #define LV_HANDLE_INTERVAL 5 /* 每 5ms 投递一次,避免队列溢出 */ ___interrupt AT_VOLATILE_RAM_CODE static void __timer2_isr(void) { static u8 tick_cnt; JL_TIMER2->CON |= BIT(14); lv_tick_inc(1); if (++tick_cnt >= LV_HANDLE_INTERVAL) { tick_cnt = 0; os_taskq_post_msg(KT_TASK_UI_NAME, 1, KT_TASK_CMD_TIMHANDLE); } } static void __timer2_init(void) { u32 prd_cnt; u8 index; for (index = 0; index < (sizeof(__div) / sizeof(__div[0])); index++) { prd_cnt = TIMER_UNIT_MS * (APP_TIMER_CLK / 1000) / __div[index]; if (prd_cnt > MIN_TIME_CNT && prd_cnt < MAX_TIME_CNT) { break; } } JL_TIMER2->CNT = 0; JL_TIMER2->PRD = prd_cnt; // 2ms request_irq(IRQ_TIME2_IDX, 3, __timer2_isr, 0); JL_TIMER2->CON = (index << 4) | BIT(0) | BIT(3); printf("PRD : 0x%x / %d", JL_TIMER2->PRD, clk_get("timer")); } //-----------------------------TIMER 2 END-------------------------------- void kt_ui_init(void) { printf("kt_ui_init\n"); os_task_create(kt_ui_entry, NULL, 2, 2048, 2048, KT_TASK_UI_NAME); } void kt_ui_show_page(int page_id) { os_taskq_post_msg(KT_TASK_UI_NAME, 2, KT_TASK_CMD_SHOW_PAGE, page_id); } void kt_ui_post_key_event(int key_event, int key_value) { printf("kt_ui_post_key_event: key_event:%d, key_value:%d\n", key_event, key_value); os_taskq_post_msg(KT_TASK_UI_NAME, 3, KT_TASK_CMD_KEY_EVENT, key_event, key_value); } void kt_ui_post_update_play_time(tPlayTime *play_time) { os_taskq_post_msg(KT_TASK_UI_NAME, 4, KT_TASK_CMD_UPDATE_PLAY_TIME, (u32)&play_time); } /* 三个页面屏幕 */ static lv_obj_t *scr_home; static lv_obj_t *scr_bt; static lv_obj_t *scr_music; static int current_page_id = KT_PAGE_HOME; static void lv_show_page(int page_id) { lv_obj_t *scr = NULL; switch (page_id) { case KT_PAGE_HOME: scr = scr_home; break; case KT_PAGE_BT: scr = scr_bt; break; case KT_PAGE_MUSIC: scr = scr_music; break; default: return; } if (scr) { current_page_id = page_id; lv_scr_load(scr); } } int kt_ui_get_current_page(void) { return current_page_id; } /* 按键分发: 根据当前页面调用对应页面的按键处理 */ static void ui_dispatch_key_event(int key_event, int key_value) { //printf("ui_dispatch_key_event: current_page_id:%d, key_event:%d, key_value:%d\n", current_page_id, key_event, key_value); switch (current_page_id) { case KT_PAGE_HOME: //printf("ui_dispatch_key_event: KT_PAGE_HOME\n"); ui_home_on_key(key_event, key_value); break; case KT_PAGE_BT: ui_bt_on_key(key_event, key_value); break; case KT_PAGE_MUSIC: ui_music_on_key(key_event, key_value); break; default: break; } } static void lv_ui_init(void) { scr_home = ui_home_create(); scr_bt = ui_bt_create(); scr_music = ui_music_create(); lv_show_page(KT_PAGE_HOME); } void kt_ui_entry(void *priv) { // tMsg msg_body; int msg[8]; printf(" kt_ui_entry \n"); lv_init(); __timer2_init(); /* 启动 1ms tick + 每 5ms 投递 TIMHANDLE */ printf(" lv_port_disp_init \n"); lv_port_disp_init(); // printf(" lv_port_indev_init \n"); // lv_port_indev_init(); lv_ui_init(); while (1) { int ret = os_taskq_pend(NULL, msg, ARRAY_SIZE(msg)); if (ret != OS_TASKQ) { continue; } if (msg[0] != Q_MSG) { continue; } switch (msg[1]) { case KT_TASK_CMD_TIMHANDLE: lv_task_handler(); break; case KT_TASK_CMD_SHOW_PAGE: if (msg[2] >= KT_PAGE_HOME && msg[2] <= KT_PAGE_MUSIC) { lv_show_page(msg[2]); } lv_task_handler(); break; case KT_TASK_CMD_KEY_EVENT: //printf("KT_TASK_CMD_KEY_EVENT: key_event:%d, key_value:%d\n", msg[2], msg[3]); ui_dispatch_key_event(msg[2], msg[3]); lv_task_handler(); break; case KT_TASK_CMD_UPDATE_PLAY_TIME: if (current_page_id == KT_PAGE_BT) { ui_bt_update_play_time(); } lv_task_handler(); break; default: break; } } }