KT25-1015_AC695x_SDK310/apps/ui/kt_ui.c
2026-02-13 21:49:31 +08:00

227 lines
5.2 KiB
C

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