From 6c787f476dd9250f3553801e257cafe0cae1b560 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Mon, 1 Jun 2026 12:28:13 +0800 Subject: [PATCH] fix feature mode resume after timeout Remember last active feature on timeout or combo exit. FPS short press from NONE restores that mode; cycling stays on SYSTEM..MIC only so MIC no longer steps through NONE (double-press issue). Co-authored-by: Cursor --- .../src/extensions/audiohw.xc | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc index c765aca..85a3281 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc @@ -911,6 +911,33 @@ static unsigned tx1_vol_minus_step(tx1_feature_mode_t mode, unsigned &feature_vo } } +/** + * 改动原因:feature 超时或组合键退出时保存当前调节项(如 FOOTSTEPS),供下次 FPS 短按直接恢复。 + */ +static void tx1_feature_mode_remember_on_exit(tx1_feature_mode_t mode, + tx1_feature_mode_t &last_feature_mode) +{ + if (mode != FEATURE_MODE_NONE) { + last_feature_mode = mode; + } +} + +/** + * 改动原因:原 (mode+1)%5 会使 MIC(4)→NONE(0),需再按才到 SYSTEM,表现为“按两次才到下一项”; + * 超时后从 NONE 再按应回到 last_feature_mode,而非总是 SYSTEM_VOLUME。 + */ +static void tx1_feature_mode_fps_short_press(tx1_feature_mode_t &feature_mode, + tx1_feature_mode_t &last_feature_mode) +{ + if (feature_mode == FEATURE_MODE_NONE) { + feature_mode = last_feature_mode; + } else { + unsigned m = ((unsigned)feature_mode % 4u) + 1u; + feature_mode = (tx1_feature_mode_t)m; + last_feature_mode = feature_mode; + } +} + static void tx1_apply_mic_mute_hw(unsigned mic_muted, unsigned &old_adc_vol, client interface i2c_master_if i2c) { @@ -967,6 +994,8 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface // TX1 game/feature mode state tx1_game_mode_t game_mode = GAME_MODE_FPS20; tx1_feature_mode_t feature_mode = FEATURE_MODE_NONE; + /* 改动原因:超时退出后再次 FPS 短按恢复上次调节项;首次进入默认系统音量。 */ + tx1_feature_mode_t last_feature_mode = FEATURE_MODE_SYSTEM_VOLUME; unsigned feature_volume = 12; // 改动原因:与 jok ui_app gunshot/footstep/mic 默认 12 一致 unsigned mic_muted = 0; /* 改动原因:与 phaten golden 相同 LFS 键名,断电保存 MIC 静音;255=首次无记录默认未静音 */ @@ -1743,6 +1772,7 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface led_pattern_step = (led_pattern_step + 1) % TX1_EFFECT_MAX; debug_printf("TX1: VOL++VOL- combo - led_pattern_step=%u\n", led_pattern_step); } else if (feature_mode != FEATURE_MODE_NONE) { + tx1_feature_mode_remember_on_exit(feature_mode, last_feature_mode); feature_mode = FEATURE_MODE_NONE; feature_timeout_ticks = 0; gpio_leds_dirty = 1; @@ -1805,12 +1835,12 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface fps_long_fired = 0; } else { // Released if (!fps_long_fired && (now - fps_press_time) < 1000000000ull) { - // Short press: cycle feature mode - feature_mode = (feature_mode + 1) % 5; + tx1_feature_mode_fps_short_press(feature_mode, last_feature_mode); feature_timeout_ticks = 0; tx1_sync_feature_volume_from_hw(feature_mode, feature_volume); gpio_leds_dirty = 1; - debug_printf("TX1: FPS short press - feature_mode=%d\n", feature_mode); + debug_printf("TX1: FPS short press - feature_mode=%d last=%d\n", + feature_mode, last_feature_mode); } } prev_fps = fps; @@ -1937,10 +1967,11 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface if (feature_mode != FEATURE_MODE_NONE) { feature_timeout_ticks++; if (feature_timeout_ticks >= TX1_FEATURE_TIMEOUT_MAX) { + tx1_feature_mode_remember_on_exit(feature_mode, last_feature_mode); feature_mode = FEATURE_MODE_NONE; feature_timeout_ticks = 0; gpio_leds_dirty = 1; - debug_printf("TX1: Feature mode timeout\n"); + debug_printf("TX1: Feature mode timeout, last=%d\n", last_feature_mode); } } }