#include "includes.h" uint8_t CurrentMode = 0; void RGB_Y_TO_R() { app_tm1629_all_on(LED_COLOR_YELL); rt_thread_delay(1000); app_tm1629_all_on(LED_COLOR_R); } void RGB_Y_TO_G() { app_tm1629_all_on(LED_COLOR_YELL); rt_thread_delay(1000); app_tm1629_all_on(LED_COLOR_G); } #define UI_MODE_SCREEN_WIDTH 240 #define UI_MODE_SCREEN_HEIGHT 320 /* 模式选择页焦点:0=万能 1=普通 2=专业,默认选中万能(与规范一致) */ static uint8_t s_mode_select_focus = 0; extern bool InModeFlag; /* 0902/0819:三行模式撑满状态栏下方至底边(无底栏),222x88 @ y=43/135/225 */ #define UI0902_MODE_ROW_X 9 #define UI0902_MODE_ROW_W 222 #define UI0902_MODE_ROW_H 88 #define UI0902_MODE_ROW_Y0 43 #define UI0902_MODE_ROW_DY 92 static const uint32_t s_mode_row_addr[3][2] = { { UI0902_ROW_UNIVERSAL_NOT_ADDR, UI0902_ROW_UNIVERSAL_SEL_ADDR }, /* 0 万能 */ { UI0902_ROW_NORMAL_NOT_ADDR, UI0902_ROW_NORMAL_SEL_ADDR }, /* 1 普通 */ { UI0902_ROW_EXPERT_NOT_ADDR, UI0902_ROW_EXPERT_SEL_ADDR }, /* 2 专业 */ }; static void UI_DrawModeSelectButton(uint16_t y, uint8_t idx, uint8_t focused) { LCD_WR_PIC_FROM_FLASH(UI0902_MODE_ROW_X, y, UI0902_MODE_ROW_W, UI0902_MODE_ROW_H, s_mode_row_addr[idx][focused ? 1 : 0]); } static void UI_ModeSelect_DrawButtonAt(uint8_t idx) { if (idx > 2) return; UI_DrawModeSelectButton((uint16_t)(UI0902_MODE_ROW_Y0 + idx * UI0902_MODE_ROW_DY), idx, s_mode_select_focus == idx); } static void UI_ModeSelect_SetFocus(uint8_t idx) { uint8_t prev; if (idx > 2 || idx == s_mode_select_focus) return; prev = s_mode_select_focus; s_mode_select_focus = idx; /* 只重绘新旧两个按钮,避免整页三键闪烁 */ UI_ModeSelect_DrawButtonAt(prev); UI_ModeSelect_DrawButtonAt(idx); } static void UI_ModeSelect_DrawButtons(void) { UI_ModeSelect_DrawButtonAt(0); UI_ModeSelect_DrawButtonAt(1); UI_ModeSelect_DrawButtonAt(2); } void UI_ReturnToModeSelect(void) { StartFlag = 0; InModeFlag = false; AutoBandTop1_Stop(); s_mode_select_focus = 0; CallUI_Idle(); UI_DrawModeSelectScreen(); } void UI_DrawModeSelectScreen(void) { UI_ClearFocus(); pCurrentTouch_Area = Touch_ModeSelect_Areas; LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR); label_top(); UI_ModeSelect_DrawButtons(); /* 设计稿 0902-01:模式选择页无底部三栏导航,仅三行模式按钮 */ } const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = { /* Flag=按钮序号(0万能/1普通/2专业);ID=进入 TAB。三行撑满,无底栏 */ { 9, 231, 43, 130, 0, 0, 0, NULL }, { 9, 231, 135, 222, 1, 0, 2, NULL }, { 9, 231, 225, 312, 2, 0, 1, NULL }, }; #define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef)) /* Timbre_index ���� midi_tables.h ������ */ extern uint8_t channel; extern uint8_t level; extern bool powon; extern bool InModeFlag; extern int16_t MIC_VOL_MAP[10]; extern int8_t delta; extern STRING_MIDI USE_MIDI; void LoadConfig() { SendProgramChangeMidiEvent(0,Timbre_index[mGuiData[GUI_TIMBRE_SELECT].Current]); uint8_t val_127 = (faders[0].val * 127) / 20; SendVolumeChangeMidiEvent(1,val_127); SendVolumeChangeMidiEvent(2,val_127); SendVolumeChangeMidiEvent(3,val_127); SendVolumeChangeMidiEvent(4,val_127); SendVolumeChangeMidiEvent(5,val_127); SendVolumeChangeMidiEvent(6,val_127); SendVolumeChangeMidiEvent(7,val_127); SendVolumeChangeMidiEvent(8,val_127); SendVolumeChangeMidiEvent(9,val_127); SendVolumeChangeMidiEvent(10,val_127); SendVolumeChangeMidiEvent(11,val_127); SendVolumeChangeMidiEvent(12,val_127); SendVolumeChangeMidiEvent(13,val_127); SendVolumeChangeMidiEvent(14,val_127); SendVolumeChangeMidiEvent(15,val_127); SendVolumeChangeMidiEvent(0,faders[1].val); AW816_Set_Volume(MIC_VOL_MAP[faders[2].val]); AW816_Set_Reverb(faders[3].val * 10); } 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; /* 进入子页后抑制残留按下,否则易误触底栏 GUI_TAB_INDEX(id=5)→设置 */ app_touch_suppress(500); switch (ID) { case 0: /* 万能 → 3.bin */ if (mGuiData[GUI_AUTOBAND_SW].Current) ADDRESS = FLASH_ADDR_AUTOBAND_LEGACY; else ADDRESS = FLASH_ADDR_MODE_UNIVERSAL; MenuPage_SongMode_Proc(); break; case 1: /* 专业 → 1.bin */ if (mGuiData[GUI_AUTOBAND_SW].Current) ADDRESS = FLASH_ADDR_AUTOBAND_LEGACY; else ADDRESS = FLASH_ADDR_MODE_EXPERT; MenuPage_ExpertMode_Proc(); break; case 2: /* 普通 → 1.bin */ ADDRESS = FLASH_ADDR_MODE_NORMAL; MenuPage_FreeMode_Proc(); break; default: break; } } extern uint8_t bat_init_done; void IdleProcess(DisplayTaskMessage_Type msg) { uint8_t vol; switch (msg.MessageType) { case MSG_ID_POWER_ON : LCD_BLK_Set(); LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_BOOT_LOGO_W, UI0902_BOOT_LOGO_H, UI0902_BOOT_LOGO_ADDR); BSP_SelectAdcChannel(6); /* 让出 CPU,避免忙等卡住触摸/主循环线程 */ rt_thread_mdelay(1000); LoadConfig(); vol = ADC_ReadChannel(ADC_CHANNEL_1)>>5; if (vol <= 5) level = 0; else if (vol <= 35) level = 1; else if (vol <= 65) level = 2; else if (vol <= 95) level = 3; else if (vol <= 115) level = 4; else level = 5; Send_volume(vol); s_mode_select_focus = 0; UI_DrawModeSelectScreen(); TM1629D_AllLedOn(LED_COLOR_G); TM1629D_UpdateDisplay(0); StartTouchTask(); StartScanTask(); break; case MSG_ID_POWER_OFF: /* 关机:熄屏 + 关背光 */ LCD_BLK_Clr(); LCD_FillByColor(0, 0, 240, 320, BLACK); break; case MSG_ID_CHARG: Show_Battery_Icon(msg.ID); break; case MSG_ID_TOUCH: { static uint32_t s_last_enter_ms; uint32_t now = rt_tick_get() * 1000U / RT_TICK_PER_SECOND; uint8_t hit = 0U; for(uint8_t k=0; k= Touch_ModeSelect_Areas[k].x_min && msg.HiByte <= Touch_ModeSelect_Areas[k].x_max && msg.LoByte >= Touch_ModeSelect_Areas[k].y_min && msg.LoByte <= Touch_ModeSelect_Areas[k].y_max ) { hit = 1U; uint8_t row = (uint8_t)Touch_ModeSelect_Areas[k].Flag; LOG_I("UI", "mode_select hit area=%u row=%u focus=%u x=%u y=%u", (unsigned)k, (unsigned)row, (unsigned)s_mode_select_focus, (unsigned)msg.HiByte, (unsigned)msg.LoByte); /* 已聚焦 → 进入;未聚焦 → 切蓝焦点,再点一次进入 */ if (row == s_mode_select_focus) { if (now - s_last_enter_ms < 300U) break; s_last_enter_ms = now; Touch_Mode_Select_Action(Touch_ModeSelect_Areas[k].Flag, Touch_ModeSelect_Areas[k].ID, k); } else { UI_ModeSelect_SetFocus(row); } break; } } if (!hit) { LOG_I("UI", "mode_select miss x=%u y=%u", (unsigned)msg.HiByte, (unsigned)msg.LoByte); } } break; case MSG_ID_TOUCH_LONG_REPEAT: /* 模式页暂无长按动作 */ break; case MSG_ID_BATTERY_VALUE: Draw_Status_Battery_Icon(msg.ID); break; case MSG_ID_POWOFF_CHARG: { static bool flag = 0; if(flag == 0) { BSP_MainPowerEnable(1); LCD_WR_REG(0x29); //Display on LCD_WR_PIC_FROM_FLASH(40, 50, EXTFLASH_CHARGING_W, EXTFLASH_CHARGING_H, EXTFLASH_CHARGING_ADDR); LCD_BLK_Set(); flag = 1; } if(usb_charging_state) { uint8_t Info[10] = {0,}; sprintf ((char*)Info, "%d%%", msg.ID); LCD_ShowString_AutoAlign(0,240,250,Info,LCD_ALIGN_CENTER,WHITE,BLACK,0,28); } //else //BSP_MainPowerEnable(0); } break; case MSG_ID_EC_VOL: { //LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0); uint8_t vol = msg.ID; if (vol <= 5) level = 0; else if (vol <= 35) level = 1; else if (vol <= 65) level = 2; else if (vol <= 95) level = 3; else if (vol <= 115) level = 4; else level = 5; Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY); uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7}; memset(mMasterSysExVolume+8,msg.ID,1); SendMidiDataToDreamDSP(mMasterSysExVolume,12); ResetAutoPowerCount(); } break; } }