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 <cursoragent@cursor.com>
This commit is contained in:
Steven Dan
2026-06-01 11:22:23 +08:00
parent 1c7fd2706a
commit 164bf84afe

View File

@@ -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_time32位时间戳为扫描计数避免 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");
}