From ba31d91aef6818aae409a89f7bd9df0a7c10d378 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Mon, 31 Aug 2026 08:21:58 +0800 Subject: [PATCH] Fix mode-select touch area IDs and keep touch thread from blocking on LCD dump. Co-authored-by: Cursor --- UI/UI_Idle.c | 55 ++++++++++++++----------------- task/task_init.c | 84 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 101 insertions(+), 38 deletions(-) diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index 9b56615..4123e9c 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -95,10 +95,11 @@ void UI_DrawModeSelectScreen(void) } const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = { - // Xmin, Xmax, Ymin, Ymax, flag, ID, action - { 10, 229, 40, 126, 0, 0, GUI_MODE_SELECT3, NULL }, //���� - { 10, 229, 132, 218, 1, 0, GUI_MODE_SELECT1, NULL }, //????/���� - { 10, 229, 224, 310, 2, 0, GUI_MODE_SELECT2, NULL }, //רҵ/ר??? + /* Xmin,Xmax,Ymin,Ymax, Flag, Value, ID, action + * Flag=按钮序号;ID=进入的 TAB(0万能Song / 1专业Expert / 2普通Free) */ + { 10, 229, 40, 126, 0, 0, 0, NULL }, /* 万能模式 → SongMode */ + { 10, 229, 132, 218, 1, 0, 2, NULL }, /* 普通模式 → FreeMode */ + { 10, 229, 224, 310, 2, 0, 1, NULL }, /* 专业模式 → ExpertMode */ }; #define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef)) @@ -141,44 +142,36 @@ void LoadConfig() void Touch_Mode_Select_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex) { + (void)areaIndex; StartTask(); s_mode_select_focus = (uint8_t)FLAG; + /* ID 为 TAB 索引:0=万能(Song) 1=专业(Expert) 2=普通(Free) */ mGuiData[GUI_TAB_INDEX].Current = ID; InModeFlag = true; - // �ٽ����ٽ��� - switch(ID) - { - case 0: - if(mGuiData[GUI_AUTOBAND_SW].Current) - { - ADDRESS = 0x0009EB5F; - } - else - { - ADDRESS = 0x0001B8F0; - } - - MenuPage_SongMode_Proc(); - break; - case 1: - if(mGuiData[GUI_AUTOBAND_SW].Current) - { + switch (ID) + { + case 0: /* 万能 */ + if (mGuiData[GUI_AUTOBAND_SW].Current) ADDRESS = 0x0009EB5F; - } else - { -// ADDRESS = 0x0001B8F0; - ADDRESS = 0x00000000; - } + ADDRESS = 0x0001B8F0; + MenuPage_SongMode_Proc(); + break; + case 1: /* 专业 */ + if (mGuiData[GUI_AUTOBAND_SW].Current) + ADDRESS = 0x0009EB5F; + else + ADDRESS = 0x00000000; MenuPage_ExpertMode_Proc(); - break; - case 2: + break; + case 2: /* 普通 */ ADDRESS = 0x0009598F; MenuPage_FreeMode_Proc(); - break; + break; + default: + break; } - } extern uint8_t bat_init_done; diff --git a/task/task_init.c b/task/task_init.c index d027509..ddea88e 100644 --- a/task/task_init.c +++ b/task/task_init.c @@ -48,7 +48,7 @@ void TaskTouchThread_entry(void* parameter) { TP_Point tp = TP_Read(); /* 读 XPT2046 触摸坐标 */ app_touch_process(240-tp.x, tp.y, tp.pressed); - LCD_Dump_Poll(); + /* DUMP 由 lcd_dump 专用线程轮询,勿在触摸线程里做 SPI 读屏,避免卡死触摸 */ Read_Cur_Measure(); rt_thread_mdelay(10); } @@ -220,20 +220,90 @@ rt_err_t TaskInit(void) void StartTask(void) { - rt_thread_startup(&TaskScanThread); - rt_thread_startup(&TaskBTHandleThread); - rt_thread_startup(&TaskBTRecvThread); - rt_thread_startup(&TaskAutobandThread); + /* 扫描任务可能已由 StartScanTask 拉起;重复 startup 会被 RT-Thread 忽略 */ + StartScanTask(); + + if ((TaskBTHandleThread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_CLOSE) + { + rt_thread_init(&TaskBTHandleThread, + "TaskBTHandleThread", + TaskBTHandleThread_entry, + RT_NULL, + &TaskBTTHandlehread_Stack, + sizeof(TaskBTTHandlehread_Stack), + 5, + 20); + } + if ((TaskBTHandleThread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_INIT) + rt_thread_startup(&TaskBTHandleThread); + + if ((TaskBTRecvThread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_CLOSE) + { + rt_thread_init(&TaskBTRecvThread, + "TaskBTRecvThread", + TaskBTRecvThread_entry, + RT_NULL, + &TaskBTRecvThread_Stack, + sizeof(TaskBTRecvThread_Stack), + 5, + 20); + } + if ((TaskBTRecvThread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_INIT) + rt_thread_startup(&TaskBTRecvThread); + + if ((TaskAutobandThread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_CLOSE) + { + rt_thread_init(&TaskAutobandThread, + "TaskAutobandThread", + TaskAutobandThread_entry, + RT_NULL, + &TaskAutobandThread_Stack, + sizeof(TaskAutobandThread_Stack), + 4, + 20); + } + if ((TaskAutobandThread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_INIT) + rt_thread_startup(&TaskAutobandThread); } void StartTouchTask(void) { - rt_thread_startup(&TaskTouchThread); + rt_uint8_t st = (rt_uint8_t)(TaskTouchThread.stat & RT_THREAD_STAT_MASK); + + if (st == RT_THREAD_CLOSE) + { + rt_thread_init(&TaskTouchThread, + "TaskTouchThread", + TaskTouchThread_entry, + RT_NULL, + &TaskTouchThread_Stack, + sizeof(TaskTouchThread_Stack), + 5, + 20); + st = RT_THREAD_INIT; + } + if (st == RT_THREAD_INIT) + rt_thread_startup(&TaskTouchThread); } void StartScanTask(void) { - rt_thread_startup(&TaskScanThread); + rt_uint8_t st = (rt_uint8_t)(TaskScanThread.stat & RT_THREAD_STAT_MASK); + + if (st == RT_THREAD_CLOSE) + { + rt_thread_init(&TaskScanThread, + "TaskScanThread", + TaskScanThread_entry, + RT_NULL, + &TaskScanThread_Stack, + sizeof(TaskScanThread_Stack), + 5, + 20); + st = RT_THREAD_INIT; + } + if (st == RT_THREAD_INIT) + rt_thread_startup(&TaskScanThread); } void StopFullTask(void)