From a07a3dee8df839d09141cd9008f34edc07b4b6cb Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Thu, 15 Aug 2019 17:27:31 +0800 Subject: [PATCH] refactor user_presence handling --- targets/stm32l432/src/device.c | 132 ++++++++++++++++++++++----------- 1 file changed, 88 insertions(+), 44 deletions(-) diff --git a/targets/stm32l432/src/device.c b/targets/stm32l432/src/device.c index d211bdd..49bbfe7 100644 --- a/targets/stm32l432/src/device.c +++ b/targets/stm32l432/src/device.c @@ -39,6 +39,7 @@ void wait_for_usb_tether(); uint32_t __90_ms = 0; uint32_t __last_button_press_time = 0; +uint32_t __last_button_bounce_time = 0; uint32_t __device_status = 0; uint32_t __last_update = 0; extern PCD_HandleTypeDef hpcd; @@ -76,6 +77,21 @@ void TIM6_DAC_IRQHandler() ctaphid_update_status(__device_status); } } + + + if (is_touch_button_pressed == IS_BUTTON_PRESSED) + { + if (IS_BUTTON_PRESSED()) + { + // Only allow 1 press per 25 ms. + if ((millis() - __last_button_bounce_time) > 25) + { + __last_button_press_time = millis(); + } + __last_button_bounce_time = millis(); + } + } + #ifndef IS_BOOTLOADER // NFC sending WTX if needs if (device_is_nfc() == NFC_IS_ACTIVE) @@ -84,10 +100,20 @@ void TIM6_DAC_IRQHandler() } #endif } + +// Interrupt on rising edge of button (button released) void EXTI0_IRQHandler(void) { EXTI->PR1 = EXTI->PR1; - __last_button_press_time = millis(); + if (is_physical_button_pressed == IS_BUTTON_PRESSED) + { + // Only allow 1 press per 25 ms. + if ((millis() - __last_button_bounce_time) > 25) + { + __last_button_press_time = millis(); + } + __last_button_bounce_time = millis(); + } } // Global USB interrupt handler @@ -499,6 +525,41 @@ static int handle_packets() return 0; } +static int wait_for_button_activate(uint32_t wait) +{ + int ret; + uint32_t start = millis(); + do + { + if ((start + wait) < millis()) + { + return 0; + } + delay(1); + ret = handle_packets(); + if (ret) + return ret; + } while (!IS_BUTTON_PRESSED()); + return 0; +} +static int wait_for_button_release(uint32_t wait) +{ + int ret; + uint32_t start = millis(); + do + { + if ((start + wait) < millis()) + { + return 0; + } + delay(1); + ret = handle_packets(); + if (ret) + return ret; + } while (IS_BUTTON_PRESSED()); + return 0; +} + int ctap_user_presence_test(uint32_t up_delay) { int ret; @@ -506,12 +567,7 @@ int ctap_user_presence_test(uint32_t up_delay) { return 1; } - // "cache" button presses for 2 seconds. - if (millis() - __last_button_press_time < 2000) - { - __last_button_press_time = 0; - return 1; - } + #if SKIP_BUTTON_CHECK_WITH_DELAY int i=500; while(i--) @@ -524,53 +580,41 @@ int ctap_user_presence_test(uint32_t up_delay) #elif SKIP_BUTTON_CHECK_FAST delay(2); ret = handle_packets(); - if (ret) return ret; + if (ret) + return ret; goto done; #endif - uint32_t t1 = millis(); + + // If button was pressed within last [2] seconds, succeed. + if (__last_button_press_time && (millis() - __last_button_press_time < 2000)) + { + goto done; + } + + // Set LED status and wait. led_rgb(0xff3520); -if (IS_BUTTON_PRESSED == is_touch_button_pressed) -{ - // Wait for user to release touch button if it's already pressed - while (IS_BUTTON_PRESSED()) - { - if (t1 + up_delay < millis()) - { - printf1(TAG_GEN,"Button not pressed\n"); - goto fail; - } - ret = handle_packets(); - if (ret) return ret; - } -} - -t1 = millis(); - -do -{ - if (t1 + up_delay < millis()) - { - goto fail; - } - delay(1); - ret = handle_packets(); + // Block and wait for some time. + ret = wait_for_button_activate(up_delay); + if (ret) return ret; + ret = wait_for_button_release(up_delay); if (ret) return ret; -} -while (! IS_BUTTON_PRESSED()); -led_rgb(0x001040); - -delay(50); + // If button was pressed within last [2] seconds, succeed. + if (__last_button_press_time && (millis() - __last_button_press_time < 2000)) + { + goto done; + } + + + return 0; -#if SKIP_BUTTON_CHECK_WITH_DELAY || SKIP_BUTTON_CHECK_FAST done: -#endif -return 1; + ret = wait_for_button_release(up_delay); + __last_button_press_time = 0; + return 1; -fail: -return 0; } int ctap_generate_rng(uint8_t * dst, size_t num)