diff --git a/Global/Global.c b/Global/Global.c index b0a1a31..97fa91d 100644 --- a/Global/Global.c +++ b/Global/Global.c @@ -229,6 +229,7 @@ void System_PowerOn(void) LOG_I("PWR", "power_on begin"); /* 软关机不复位 MCU:清掉上次会话演奏状态,默认当前调一级大和弦(C 调=do mi sol) */ StartFlag = 0; + InModeFlag = false; /* 停在模式选择,禁止拨片/侧面键起奏 */ Accomp_ApplyDefaultIChord(); app_tm1629_reset_key_state(); s_pwr_rails_cut = 0u; @@ -272,6 +273,7 @@ static void PowerOff(void) LOG_I("PWR", "power_off begin"); powon = false; /* 更新关机标志 */ + InModeFlag = false; /* 软关机后勿残留进模式,避免再开机模式选择页拨片起奏 */ s_pwr_off_grace_ms = 0u; /* 主路径已接管,取消紧急倒计时 */ StopFullTask(); @@ -901,6 +903,9 @@ void ADC_IN1_KEY_Handle(uint8_t key,bool on) uint8_t was_playing; (void)on; + /* 模式选择页:侧面键不得起奏 */ + if (!InModeFlag) + return; /* 万能:前奏/间奏/尾奏/断奏无响应(含 App 06 指令) */ if (mGuiData[GUI_TAB_INDEX].Current == 0) return; @@ -1617,6 +1622,13 @@ void Pick_Handle() uint8_t note_cnt = 0; uint8_t chord_id = KEY_ID_1629; + /* 未进入演奏模式(开机模式选择页)禁止起奏 */ + if (!InModeFlag) + { + LOG_I("pick", "abort: not in mode"); + return; + } + /* 空库/加载失败时禁止起奏:否则 TMR6 ISR 内 AutoBand 可能 HardFault, * LCD 卡死且主循环 Power_Key_Scan 不再跑 → 只能 RESET */ if (!App_Auto_IsPresetReady()) diff --git a/Global/Global.h b/Global/Global.h index 9608dbe..c8ef3a4 100644 --- a/Global/Global.h +++ b/Global/Global.h @@ -192,6 +192,7 @@ extern volatile uint32_t ADDRESS; extern uint8_t key_toggle[4]; extern bool StartFlag; +extern bool InModeFlag; /* 已进入演奏模式;模式选择页必须为 false */ extern int16_t MIC_VOL_MAP[11]; extern const uint8_t Version[3]; diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index 20ea2f6..52dbbfd 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -64,6 +64,7 @@ void UI_ReturnToModeSelect(void) void UI_DrawModeSelectScreen(void) { + InModeFlag = false; /* 模式选择页:未进入演奏模式,禁止伴奏起奏 */ UI_ClearFocus(); pCurrentTouch_Area = Touch_ModeSelect_Areas; diff --git a/task/task_init.c b/task/task_init.c index 0969858..d80875d 100644 --- a/task/task_init.c +++ b/task/task_init.c @@ -107,7 +107,7 @@ void TaskMainThread_entry(void* parameter) case MSG_ID_POWER_OFF : break; //case MSG_ID_ADCIN1KEY : ADC_IN1_KEY_Handle(xEvent.ID);break; case MSG_ID_BP_KEY: - if (!System_LowBat_IsActive()) + if (!System_LowBat_IsActive() && InModeFlag) Pick_Handle(); break; case MSG_ID_STOP_BAND: @@ -121,7 +121,7 @@ void TaskMainThread_entry(void* parameter) break; case MSG_ID_START_FOLLOWUP: /* 停后补发:强制再 Start,勿因 NotifyPlayActivity 误判「在播」只换和弦 */ - if (!System_LowBat_IsActive() && Band_TakeStartFollowup()) + if (!System_LowBat_IsActive() && InModeFlag && Band_TakeStartFollowup()) { Band_BeginStartFollowup(); Pick_Handle();