From 164bf84afe6f1150937e5fbb30d84f563920bf52 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Mon, 1 Jun 2026 11:22:23 +0800 Subject: [PATCH] fix factory reset hold timing Replace factory-reset elapsed-time comparison with 20ms scan-tick counting. The previous code used 32-bit elapsed against 6s/10s/10.6s 64-bit constants, so trigger thresholds were unreachable and countdown got cancelled instead of firing. Co-authored-by: Cursor --- .../src/extensions/audiohw.xc | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 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 0cc0935..c765aca 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 @@ -173,7 +173,10 @@ on tile[0]: out port p_led_tile0 = PORT_LED_D10_8_11_9; // 8D bit7-4 = D10/D8/D // TX1 Button timing thresholds (in 50ms ticks) #define TX1_SHORT_PRESS_TICKS 1 // 50ms minimum press /* 改动原因:TX1_LONG_PRESS_TICKS 已在文件顶部以 10ns 绝对时间定义(100000000ull);此处删除重复的 tick 计数版本 */ -#define TX1_FACTORY_RESET_TICKS 212 // 10.6s = 212 * 50ms +/* 改动原因:Factory reset 按键扫描在 20ms 定时器中运行;统一用扫描 tick 计数,避免 32 位时间戳比较 10.6s 常量失效。 */ +#define TX1_FACTORY_RESET_6S_TICKS 300 // 6.0s / 20ms +#define TX1_FACTORY_RESET_10S_TICKS 500 // 10.0s / 20ms +#define TX1_FACTORY_RESET_TICKS 530 // 10.6s / 20ms // TX1 LED bit masks for tile[0] (XS1_PORT_8D bits 7-4) #define TX1_LED_D10_GREEN_BIT 7 @@ -1038,7 +1041,8 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface // TX1 factory reset state unsigned factory_reset_counting = 0; - unsigned factory_reset_start_time = 0; + /* 改动原因:替代 factory_reset_start_time(32位时间戳)为扫描计数,避免 6s/10s/10.6s 比较溢出失效。 */ + unsigned factory_reset_hold_ticks = 0; unsigned factory_reset_6s_fired = 0; unsigned factory_reset_10s_fired = 0; unsigned factory_reset_done = 0; @@ -1757,24 +1761,26 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface if (fps == 0 && game == 0 && current_combo == COMBO_NONE) { if (!factory_reset_counting) { factory_reset_counting = 1; - factory_reset_start_time = now; + factory_reset_hold_ticks = 0; factory_reset_6s_fired = 0; factory_reset_10s_fired = 0; factory_reset_done = 0; tx1_factory_reset_countdown_start(); debug_printf("TX1: Factory reset countdown started\n"); } else if (!factory_reset_done) { - unsigned elapsed = now - factory_reset_start_time; - if (elapsed >= 10600000000ull && !factory_reset_done) { // 10.6s + factory_reset_hold_ticks++; + if (factory_reset_hold_ticks >= TX1_FACTORY_RESET_TICKS && !factory_reset_done) { factory_reset_done = 1; tx1_factory_reset_triggered(); debug_printf("TX1: FACTORY RESET TRIGGERED!\n"); SET_SHARED_GLOBAL(g_request_factory_reset, 1); - } else if (elapsed >= 10000000000ull && !factory_reset_10s_fired) { + } else if (factory_reset_hold_ticks >= TX1_FACTORY_RESET_10S_TICKS + && !factory_reset_10s_fired) { factory_reset_10s_fired = 1; tx1_factory_reset_countdown_10s(); debug_printf("TX1: Factory reset 10s warning\n"); - } else if (elapsed >= 6000000000ull && !factory_reset_6s_fired) { + } else if (factory_reset_hold_ticks >= TX1_FACTORY_RESET_6S_TICKS + && !factory_reset_6s_fired) { factory_reset_6s_fired = 1; tx1_factory_reset_countdown_6s(); debug_printf("TX1: Factory reset 6s warning\n"); @@ -1783,6 +1789,7 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface } else { if (factory_reset_counting) { factory_reset_counting = 0; + factory_reset_hold_ticks = 0; tx1_factory_reset_cancel(); debug_printf("TX1: Factory reset cancelled\n"); }