fix(ram): pack Global.c statics to fit SRAM (was 8 bytes short)

Shrink even-beat stop tick to 32-bit and fold univ/expert/free flags into single bytes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-09-24 07:47:15 +08:00
parent e7c9cd91f1
commit a322ed369c
1 changed files with 40 additions and 44 deletions

View File

@ -647,9 +647,9 @@ void Accomp_ApplyDefaultIChord(void)
PressFlag = 0;
}
/* 专业模式按停止键时记住当前调性,供普通模式无指板拨片起奏使用 */
static uint8_t s_expert_stop_transpose = 0;
static uint8_t s_expert_stop_transpose_valid = 0;
/* 专业模式按停止键时记住当前调性,供普通模式无指板拨片起奏使用。
* 0xFF=尚未在专业停过;移调合法值 0~11。 */
static uint8_t s_expert_stop_transpose = 0xFFu;
static void Expert_RememberStopTranspose(void)
{
@ -657,16 +657,13 @@ static void Expert_RememberStopTranspose(void)
uint8_t last = (uint8_t)mGuiData[GUI_TAB_LAST_INDEX].Current;
if (tab == 1 || (tab == 3 && last == 1))
{
s_expert_stop_transpose = (uint8_t)mGuiData[GUI_TRANSPOSE].Current;
s_expert_stop_transpose_valid = 1;
}
}
/* 普通无指板拨片:套用上次专业停键调性(无记录则保持当前移调) */
static void FreeMode_ApplyExpertStopTranspose(void)
{
if (!s_expert_stop_transpose_valid)
if (s_expert_stop_transpose == 0xFFu)
return;
if ((uint8_t)mGuiData[GUI_TRANSPOSE].Current == s_expert_stop_transpose)
return;
@ -695,9 +692,10 @@ void Accomp_UpdatePlayingChord(void)
/* 尾奏期间冻结走向灯:保持全绿,避免 LOOP_LIGHT 按小节刷红 */
static uint8_t s_outro_led_all_green = 0;
/* 万能拨片:前奏播完后再切入 piece 段落1 循环 */
static uint8_t s_univ_piece_after_preamble = 0;
static uint8_t s_univ_saw_preamble_stage = 0;
/* 万能拨片:bit0=等前奏后进 piece,bit1=已见前奏舞台(省 RAM) */
static uint8_t s_univ_preamble_flags = 0;
#define UNIV_PRE_WAIT_PIECE 0x01u
#define UNIV_PRE_SAW_STAGE 0x02u
/* libAutoBand m_ABSystem:+0x59 舞台,+0x50 小节相位。
* 前奏挂起舞台 0x0E、尾奏挂起舞台 0x0B 都要等相位对上小节线才真正切入。
@ -769,8 +767,7 @@ static void Univ_StartWithPreamble(uint8_t *notes, uint8_t n)
Band_SyncStartRetry();
wk_delay_ms(50);
Accomp_FireSectionNotes();
s_univ_saw_preamble_stage = 0;
s_univ_piece_after_preamble = 1;
s_univ_preamble_flags = UNIV_PRE_WAIT_PIECE;
}
/* 前奏舞台结束后切入 piece 段落1 并保持 loop。 */
@ -781,14 +778,13 @@ static void Univ_PollEnterPieceAfterPreamble(void)
uint8_t note_cnt;
uint8_t chord_id;
if (!s_univ_piece_after_preamble || !StartFlag)
if (!(s_univ_preamble_flags & UNIV_PRE_WAIT_PIECE) || !StartFlag)
return;
if (mGuiData[GUI_TAB_INDEX].Current != 0 &&
!(mGuiData[GUI_TAB_INDEX].Current == 3 &&
mGuiData[GUI_TAB_LAST_INDEX].Current == 0))
{
s_univ_piece_after_preamble = 0;
s_univ_saw_preamble_stage = 0;
s_univ_preamble_flags = 0;
return;
}
@ -796,16 +792,15 @@ static void Univ_PollEnterPieceAfterPreamble(void)
/* 前奏挂起/前奏中:记下已进入前奏,继续等播完 */
if (st == AB_STAGE_PRE_WAIT || st == AB_STAGE_PRE)
{
s_univ_saw_preamble_stage = 1;
s_univ_preamble_flags |= UNIV_PRE_SAW_STAGE;
return;
}
/* 尚未见到前奏舞台:若已到 Run(5) 说明空前奏被跳过,可进 piece;
* 其它启动中舞台继续等,避免冷启动抢先切入 piece 砍掉前奏。 */
if (!s_univ_saw_preamble_stage && st != 5u)
if (!(s_univ_preamble_flags & UNIV_PRE_SAW_STAGE) && st != 5u)
return;
s_univ_piece_after_preamble = 0;
s_univ_saw_preamble_stage = 0;
s_univ_preamble_flags = 0;
AutoBandTop1_SetRunVar(0);
AutoBandTop1_SetPiecePlayMode(1, 0, 480);
AutoBandTop1_SetLoopMode(0, 1);
@ -834,8 +829,7 @@ void AutoBand_StartOutro(void)
{
uint8_t was_playing = StartFlag;
s_univ_piece_after_preamble = 0;
s_univ_saw_preamble_stage = 0;
s_univ_preamble_flags = 0;
if (KEY_ID_1629 == 0 || KEY_ID_1629 == 22 || KEY_ID_1629 == 23)
Accomp_ApplyDefaultIChord();
@ -1001,23 +995,23 @@ void Tap_to_Speed()
#define FREE_BEAT_TICKS 480u
#define FREE_PIECE_TICKS 1920u
static uint8_t s_free_even_stop_arm = 0;
static uint64_t s_free_even_stop_tick = 0;
static int s_free_even_stop_beat = 2; /* 目标偶拍 2 或 4 */
static uint8_t s_free_even_seen_target = 0;
static uint32_t s_free_even_stop_tick = 0;
static uint8_t s_free_even_stop_beat = 2; /* 目标偶拍 2 或 4 */
static uint8_t s_free_even_flags = 0; /* bit0=armed bit1=seen target */
#define FREE_EVEN_ARM 0x01u
#define FREE_EVEN_SEEN 0x02u
static void FreeMode_CancelEvenBeatStop(void)
{
s_free_even_stop_arm = 0;
s_free_even_flags = 0;
s_free_even_stop_tick = 0;
s_free_even_stop_beat = 2;
s_free_even_seen_target = 0;
}
/* 再次按住指板:取消待停并恢复 piece 循环 */
static void FreeMode_ResumePieceLoop(void)
{
if (!s_free_even_stop_arm)
if (!(s_free_even_flags & FREE_EVEN_ARM))
return;
FreeMode_CancelEvenBeatStop();
if (StartFlag && mGuiData[GUI_TAB_INDEX].Current == 2 &&
@ -1046,17 +1040,20 @@ static void FreeMode_ArmEvenBeatStop(void)
beat = 1;
/* 拍1→2,拍2→2,拍3→4,拍4→4 */
target = ((beat + 1) / 2) * 2;
s_free_even_stop_beat = target;
s_free_even_seen_target = (beat >= target) ? 1u : 0u;
/* ((beat0/2)+1)*2*480 → 拍1/2→960,拍3/4→1920,跨小节同理 */
s_free_even_stop_tick =
s_free_even_stop_beat = (uint8_t)target;
s_free_even_flags = FREE_EVEN_ARM |
((beat >= target) ? FREE_EVEN_SEEN : 0u);
/* ((beat0/2)+1)*2*480 → 拍1/2→960,拍3/4→1920,跨小节同理;piece API 仅 32bit */
{
uint64_t stop =
((play / FREE_BEAT_TICKS) / 2ull + 1ull) * 2ull * (uint64_t)FREE_BEAT_TICKS;
s_free_even_stop_arm = 1;
s_free_even_stop_tick = (stop > 0xFFFFFFFFull) ? 0xFFFFFFFFu : (uint32_t)stop;
}
s_free_even_flags |= FREE_EVEN_ARM;
/* 禁循环并裁 piece,库播到 stop tick 自停;Poll 作兜底 */
AutoBandTop1_SetLoopMode(0, 0);
if (s_free_even_stop_tick <= 0xFFFFFFFFull)
AutoBandTop1_SetPiecePlayMode(1, 0, (uint32_t)s_free_even_stop_tick);
AutoBandTop1_SetPiecePlayMode(1, 0, s_free_even_stop_tick);
LOG_I("pick", "free even-stop arm beat=%d target=%d play=%u stop=%u",
beat, target, (unsigned)play, (unsigned)s_free_even_stop_tick);
@ -1068,7 +1065,7 @@ void FreeMode_PollEvenBeatStop(void)
uint8_t tick_done;
uint8_t beat_done;
if (!s_free_even_stop_arm)
if (!(s_free_even_flags & FREE_EVEN_ARM))
return;
if (PressFlag || mGuiData[GUI_TAB_INDEX].Current != 2 || !StartFlag)
{
@ -1077,10 +1074,11 @@ void FreeMode_PollEvenBeatStop(void)
}
beat = AutoBandTop1_GetCurrentBeat();
if (beat == s_free_even_stop_beat)
s_free_even_seen_target = 1;
if (beat == (int)s_free_even_stop_beat)
s_free_even_flags |= FREE_EVEN_SEEN;
/* 已到达目标偶拍后离开该拍 = 该拍播完;或 play tick 到点 */
beat_done = (s_free_even_seen_target && beat != s_free_even_stop_beat && beat != 0) ? 1u : 0u;
beat_done = ((s_free_even_flags & FREE_EVEN_SEEN) &&
beat != (int)s_free_even_stop_beat && beat != 0) ? 1u : 0u;
tick_done = (AutoBandTop1_GetCurrentPlayTick() >= s_free_even_stop_tick) ? 1u : 0u;
if (tick_done || beat_done)
@ -1129,8 +1127,7 @@ void Stop_AutoBand_Soft(void)
Band_MarkCleanStopped();
Band_AllNotesOff();
s_outro_led_all_green = 0;
s_univ_piece_after_preamble = 0;
s_univ_saw_preamble_stage = 0;
s_univ_preamble_flags = 0;
for (uint8_t i = 0; i < 4; i++) key_toggle[i] = 0;
}
@ -1147,8 +1144,7 @@ void Stop_AutoBand()
AutoBandTop1_Stop();
Band_AllNotesOff();
s_outro_led_all_green = 0;
s_univ_piece_after_preamble = 0;
s_univ_saw_preamble_stage = 0;
s_univ_preamble_flags = 0;
//tick_ever_positive = false;
for(uint8_t i = 0;i < 4;i++) key_toggle[i] = 0;
}