Fix mode-select touch area IDs and keep touch thread from blocking on LCD dump.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-08-31 08:21:58 +08:00
parent 68e3a37883
commit ba31d91aef
2 changed files with 101 additions and 38 deletions

View File

@ -95,10 +95,11 @@ void UI_DrawModeSelectScreen(void)
} }
const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = { const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = {
// Xmin, Xmax, Ymin, Ymax, flag, ID, action /* Xmin,Xmax,Ymin,Ymax, Flag, Value, ID, action
{ 10, 229, 40, 126, 0, 0, GUI_MODE_SELECT3, NULL }, //<2F><><EFBFBD><EFBFBD> * Flag=ID= TAB0Song / 1Expert / 2Free */
{ 10, 229, 132, 218, 1, 0, GUI_MODE_SELECT1, NULL }, //????/<2F><><EFBFBD><EFBFBD> { 10, 229, 40, 126, 0, 0, 0, NULL }, /* 万能模式 → SongMode */
{ 10, 229, 224, 310, 2, 0, GUI_MODE_SELECT2, NULL }, //רҵ/ר??? { 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)) #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 Touch_Mode_Select_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex)
{ {
(void)areaIndex;
StartTask(); StartTask();
s_mode_select_focus = (uint8_t)FLAG; s_mode_select_focus = (uint8_t)FLAG;
/* ID 为 TAB 索引0=万能(Song) 1=专业(Expert) 2=普通(Free) */
mGuiData[GUI_TAB_INDEX].Current = ID; mGuiData[GUI_TAB_INDEX].Current = ID;
InModeFlag = true; InModeFlag = true;
// <20>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>
switch (ID) switch (ID)
{ {
case 0: case 0: /* 万能 */
if (mGuiData[GUI_AUTOBAND_SW].Current) if (mGuiData[GUI_AUTOBAND_SW].Current)
{
ADDRESS = 0x0009EB5F; ADDRESS = 0x0009EB5F;
}
else else
{
ADDRESS = 0x0001B8F0; ADDRESS = 0x0001B8F0;
}
MenuPage_SongMode_Proc(); MenuPage_SongMode_Proc();
break; break;
case 1: case 1: /* 专业 */
if (mGuiData[GUI_AUTOBAND_SW].Current) if (mGuiData[GUI_AUTOBAND_SW].Current)
{
ADDRESS = 0x0009EB5F; ADDRESS = 0x0009EB5F;
}
else else
{
// ADDRESS = 0x0001B8F0;
ADDRESS = 0x00000000; ADDRESS = 0x00000000;
}
MenuPage_ExpertMode_Proc(); MenuPage_ExpertMode_Proc();
break; break;
case 2: case 2: /* 普通 */
ADDRESS = 0x0009598F; ADDRESS = 0x0009598F;
MenuPage_FreeMode_Proc(); MenuPage_FreeMode_Proc();
break; break;
default:
break;
} }
} }
extern uint8_t bat_init_done; extern uint8_t bat_init_done;

View File

@ -48,7 +48,7 @@ void TaskTouchThread_entry(void* parameter)
{ {
TP_Point tp = TP_Read(); /* 读 XPT2046 触摸坐标 */ TP_Point tp = TP_Read(); /* 读 XPT2046 触摸坐标 */
app_touch_process(240-tp.x, tp.y, tp.pressed); app_touch_process(240-tp.x, tp.y, tp.pressed);
LCD_Dump_Poll(); /* DUMP 由 lcd_dump 专用线程轮询,勿在触摸线程里做 SPI 读屏,避免卡死触摸 */
Read_Cur_Measure(); Read_Cur_Measure();
rt_thread_mdelay(10); rt_thread_mdelay(10);
} }
@ -220,19 +220,89 @@ rt_err_t TaskInit(void)
void StartTask(void) void StartTask(void)
{ {
rt_thread_startup(&TaskScanThread); /* 扫描任务可能已由 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); 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); 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); rt_thread_startup(&TaskAutobandThread);
} }
void StartTouchTask(void) void StartTouchTask(void)
{ {
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); rt_thread_startup(&TaskTouchThread);
} }
void StartScanTask(void) void StartScanTask(void)
{ {
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); rt_thread_startup(&TaskScanThread);
} }