mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-04 14:47:37 +03:00
fix: don't wake up after USB connect (#644)
## Summary * fixes problem that if short power button press is enabled, connecting device to usb leads to waking up
This commit is contained in:
parent
6228a9f14c
commit
cc2f125809
@ -24,12 +24,13 @@ bool HalGPIO::wasAnyReleased() const { return inputMgr.wasAnyReleased(); }
|
|||||||
unsigned long HalGPIO::getHeldTime() const { return inputMgr.getHeldTime(); }
|
unsigned long HalGPIO::getHeldTime() const { return inputMgr.getHeldTime(); }
|
||||||
|
|
||||||
void HalGPIO::startDeepSleep() {
|
void HalGPIO::startDeepSleep() {
|
||||||
esp_deep_sleep_enable_gpio_wakeup(1ULL << InputManager::POWER_BUTTON_PIN, ESP_GPIO_WAKEUP_GPIO_LOW);
|
|
||||||
// Ensure that the power button has been released to avoid immediately turning back on if you're holding it
|
// Ensure that the power button has been released to avoid immediately turning back on if you're holding it
|
||||||
while (inputMgr.isPressed(BTN_POWER)) {
|
while (inputMgr.isPressed(BTN_POWER)) {
|
||||||
delay(50);
|
delay(50);
|
||||||
inputMgr.update();
|
inputMgr.update();
|
||||||
}
|
}
|
||||||
|
// Arm the wakeup trigger *after* the button is released
|
||||||
|
esp_deep_sleep_enable_gpio_wakeup(1ULL << InputManager::POWER_BUTTON_PIN, ESP_GPIO_WAKEUP_GPIO_LOW);
|
||||||
// Enter Deep Sleep
|
// Enter Deep Sleep
|
||||||
esp_deep_sleep_start();
|
esp_deep_sleep_start();
|
||||||
}
|
}
|
||||||
@ -44,12 +45,20 @@ bool HalGPIO::isUsbConnected() const {
|
|||||||
return digitalRead(UART0_RXD) == HIGH;
|
return digitalRead(UART0_RXD) == HIGH;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HalGPIO::isWakeupByPowerButton() const {
|
HalGPIO::WakeupReason HalGPIO::getWakeupReason() const {
|
||||||
|
const bool usbConnected = isUsbConnected();
|
||||||
const auto wakeupCause = esp_sleep_get_wakeup_cause();
|
const auto wakeupCause = esp_sleep_get_wakeup_cause();
|
||||||
const auto resetReason = esp_reset_reason();
|
const auto resetReason = esp_reset_reason();
|
||||||
if (isUsbConnected()) {
|
|
||||||
return wakeupCause == ESP_SLEEP_WAKEUP_GPIO;
|
if ((wakeupCause == ESP_SLEEP_WAKEUP_UNDEFINED && resetReason == ESP_RST_POWERON && !usbConnected) ||
|
||||||
} else {
|
(wakeupCause == ESP_SLEEP_WAKEUP_GPIO && resetReason == ESP_RST_DEEPSLEEP && usbConnected)) {
|
||||||
return (wakeupCause == ESP_SLEEP_WAKEUP_UNDEFINED) && (resetReason == ESP_RST_POWERON);
|
return WakeupReason::PowerButton;
|
||||||
}
|
}
|
||||||
|
if (wakeupCause == ESP_SLEEP_WAKEUP_UNDEFINED && resetReason == ESP_RST_UNKNOWN && usbConnected) {
|
||||||
|
return WakeupReason::AfterFlash;
|
||||||
|
}
|
||||||
|
if (wakeupCause == ESP_SLEEP_WAKEUP_UNDEFINED && resetReason == ESP_RST_POWERON && usbConnected) {
|
||||||
|
return WakeupReason::AfterUSBPower;
|
||||||
|
}
|
||||||
|
return WakeupReason::Other;
|
||||||
}
|
}
|
||||||
@ -47,8 +47,9 @@ class HalGPIO {
|
|||||||
// Check if USB is connected
|
// Check if USB is connected
|
||||||
bool isUsbConnected() const;
|
bool isUsbConnected() const;
|
||||||
|
|
||||||
// Check if wakeup was caused by power button press
|
enum class WakeupReason { PowerButton, AfterFlash, AfterUSBPower, Other };
|
||||||
bool isWakeupByPowerButton() const;
|
|
||||||
|
WakeupReason getWakeupReason() const;
|
||||||
|
|
||||||
// Button indices
|
// Button indices
|
||||||
static constexpr uint8_t BTN_BACK = 0;
|
static constexpr uint8_t BTN_BACK = 0;
|
||||||
|
|||||||
20
src/main.cpp
20
src/main.cpp
@ -294,10 +294,22 @@ void setup() {
|
|||||||
SETTINGS.loadFromFile();
|
SETTINGS.loadFromFile();
|
||||||
KOREADER_STORE.loadFromFile();
|
KOREADER_STORE.loadFromFile();
|
||||||
|
|
||||||
if (gpio.isWakeupByPowerButton()) {
|
switch (gpio.getWakeupReason()) {
|
||||||
// For normal wakeups, verify power button press duration
|
case HalGPIO::WakeupReason::PowerButton:
|
||||||
Serial.printf("[%lu] [ ] Verifying power button press duration\n", millis());
|
// For normal wakeups, verify power button press duration
|
||||||
verifyPowerButtonDuration();
|
Serial.printf("[%lu] [ ] Verifying power button press duration\n", millis());
|
||||||
|
verifyPowerButtonDuration();
|
||||||
|
break;
|
||||||
|
case HalGPIO::WakeupReason::AfterUSBPower:
|
||||||
|
// If USB power caused a cold boot, go back to sleep
|
||||||
|
Serial.printf("[%lu] [ ] Wakeup reason: After USB Power\n", millis());
|
||||||
|
gpio.startDeepSleep();
|
||||||
|
break;
|
||||||
|
case HalGPIO::WakeupReason::AfterFlash:
|
||||||
|
// After flashing, just proceed to boot
|
||||||
|
case HalGPIO::WakeupReason::Other:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// First serial output only here to avoid timing inconsistencies for power button press duration verification
|
// First serial output only here to avoid timing inconsistencies for power button press duration verification
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user