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 <cursoragent@cursor.com>
This commit is contained in:
Steven Dan
2026-06-01 12:28:13 +08:00
parent 164bf84afe
commit 6c787f476d

View File

@@ -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);
}
}
}