From ee900b5657a3410a5b062803e39dc7bb2b84e72d Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Sun, 6 Sep 2026 07:15:04 +0800 Subject: [PATCH] Sync master volume from EC pot on every page and at boot. Always Send_volume in MainTask, re-apply after DSP settle, and sync vol_last so UI bar matches Dream gain. Co-authored-by: Cursor --- APP/app_adc.c | 29 +++++++++++++++++++---------- APP/app_adc.h | 2 ++ UI/UI_ExpertMode.c | 17 ++--------------- UI/UI_FreeMode.c | 16 ++-------------- UI/UI_Idle.c | 32 ++++++++++++-------------------- UI/UI_Mixer.c | 2 ++ UI/UI_SongMode.c | 2 +- task/task_init.c | 6 +++++- 8 files changed, 45 insertions(+), 61 deletions(-) diff --git a/APP/app_adc.c b/APP/app_adc.c index d83d0c2..a8fecd5 100644 --- a/APP/app_adc.c +++ b/APP/app_adc.c @@ -286,20 +286,29 @@ static void app_adc_hp_process(void) /* ==================== ADC1 in6 ==================== */ +static void app_adc_volume_map_level(uint16_t val) +{ + /* 5 格状态栏音量条:0=静音,5=最大 */ + if (val <= 5) level = 0; + else if (val <= 35) level = 1; + else if (val <= 65) level = 2; + else if (val <= 95) level = 3; + else if (val <= 115) level = 4; + else level = 5; +} + +void app_adc_sync_volume(uint16_t val) +{ + vol_last = val; + app_adc_volume_map_level(val); +} + static void app_adc_volume_process(void) { uint16_t val = ADC_ReadChannel(ADC_CHANNEL_1)>>5; if(abs((int16_t)vol_last - (int16_t)val) > 2) - { - vol_last = val; - /* 5 格状态栏音量条:0=静音,5=最大 */ - if (val <= 5) level = 0; - else if (val <= 35) level = 1; - else if (val <= 65) level = 2; - else if (val <= 95) level = 3; - else if (val <= 115) level = 4; - else level = 5; - + { + app_adc_sync_volume(val); MainTask_Sendmsg(MSG_ID_EC_VOL, val, level, 0); } } diff --git a/APP/app_adc.h b/APP/app_adc.h index 9a7fda1..e0f0c0e 100644 --- a/APP/app_adc.h +++ b/APP/app_adc.h @@ -25,4 +25,6 @@ extern uint8_t percentage; void app_adc_scan_all(void); void app_adc_in1_scan_part(uint8_t channel); bool app_adc_usb_is_plugged(void); +/* /ͬ vol_last levelɨ󴥷 */ +void app_adc_sync_volume(uint16_t val); #endif \ No newline at end of file diff --git a/UI/UI_ExpertMode.c b/UI/UI_ExpertMode.c index 7558c42..1504a79 100644 --- a/UI/UI_ExpertMode.c +++ b/UI/UI_ExpertMode.c @@ -46,21 +46,8 @@ void UI_ExpertMode_Process(DisplayTaskMessage_Type msg) 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.DataU16[1]; -//// uint8_t level; -// 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(5, 5, level, 1, WHITE, GRAY); -// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7}; -// memset(mMasterSysExVolume+8,msg.DataU16[1],1); -// SendMidiDataToDreamDSP(mMasterSysExVolume,12); -// -// ResetAutoPowerCount(); + Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY); + ResetAutoPowerCount(); break; case MSG_ID_TOUCH_LONG_REPEAT: diff --git a/UI/UI_FreeMode.c b/UI/UI_FreeMode.c index 07bc5d0..4fcfa6f 100644 --- a/UI/UI_FreeMode.c +++ b/UI/UI_FreeMode.c @@ -48,20 +48,8 @@ void UI_FreeMode_Process(DisplayTaskMessage_Type msg) 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.DataU16[1]; -//// uint8_t level; -// 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(5, 5, level, 1, WHITE, GRAY); -// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7}; -// memset(mMasterSysExVolume+8,msg.DataU16[1],1); -// SendMidiDataToDreamDSP(mMasterSysExVolume,12); -// ResetAutoPowerCount(); + Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY); + ResetAutoPowerCount(); break; case MSG_ID_TOUCH_LONG_REPEAT: diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index 9de7e4d..e2c9067 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -181,20 +181,21 @@ void IdleProcess(DisplayTaskMessage_Type msg) 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); - + app_adc_sync_volume(vol); + Send_volume(vol); + s_mode_select_focus = 0; UI_DrawModeSelectScreen(); TM1629D_AllLedOn(LED_COLOR_G); TM1629D_UpdateDisplay(0); StartTouchTask(); StartScanTask(); + /* Dream 上电稍后可能忽略首包 SysEx:再发一次与旋钮对齐 */ + rt_thread_mdelay(400); + vol = ADC_ReadChannel(ADC_CHANNEL_1)>>5; + app_adc_sync_volume(vol); + Send_volume(vol); + Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY); break; case MSG_ID_POWER_OFF: @@ -316,19 +317,10 @@ void IdleProcess(DisplayTaskMessage_Type msg) 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; + { + /* 主音量已在 MainTask 下发;此处只刷新条 */ + level = msg.HiByte; 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; diff --git a/UI/UI_Mixer.c b/UI/UI_Mixer.c index 0dbe1d4..a672d78 100644 --- a/UI/UI_Mixer.c +++ b/UI/UI_Mixer.c @@ -222,6 +222,8 @@ void UI_Mixer_Process(DisplayTaskMessage_Type msg) break; case MSG_ID_EC_VOL: + Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY); + ResetAutoPowerCount(); break; } } diff --git a/UI/UI_SongMode.c b/UI/UI_SongMode.c index 304309c..d769262 100644 --- a/UI/UI_SongMode.c +++ b/UI/UI_SongMode.c @@ -334,7 +334,7 @@ void UI_SongMode_Process(DisplayTaskMessage_Type msg) break; case MSG_ID_EC_VOL: - Send_volume(msg.ID); + /* 主音量已在 MainTask 下发;此处只刷新条 */ Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY); break; diff --git a/task/task_init.c b/task/task_init.c index 925dee1..6a2c369 100644 --- a/task/task_init.c +++ b/task/task_init.c @@ -81,9 +81,13 @@ void TaskMainThread_entry(void* parameter) case MSG_ID_LOOP_LIGHT : Loop_Light_Handle(xEvent.ID); break; case MSG_ID_TM1629_KEY : break; case MSG_ID_TM1617_KEY : break; + case MSG_ID_EC_VOL: + /* 任意页面都先下发主音量,避免 UI 未处理导致屏显与实际脱节 */ + Send_volume((uint8_t)xEvent.ID); + UITask_Sendmsg(xEvent.MessageType, xEvent.ID, xEvent.HiByte, xEvent.LoByte); + break; case MSG_ID_TOUCH: case MSG_ID_CHARG: - case MSG_ID_EC_VOL: case MSG_ID_TAP_SPEED: case MSG_ID_BP_TRANSPOSE: case MSG_ID_POWOFF_CHARG: