From f92f7d87942e23fde3a24a38d8e44b04133dd93a Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Sat, 5 Aug 2017 23:22:04 +0200 Subject: [PATCH] Added (somewhat hacky) workaround for the pin change interrupt waking the device up after releasing a long press to power down --- Source/src/main.c | 2 +- Source/src/power.c | 29 ++++++++++++++++++++--------- Source/src/power.h | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Source/src/main.c b/Source/src/main.c index f48c289..e6106a5 100644 --- a/Source/src/main.c +++ b/Source/src/main.c @@ -33,7 +33,7 @@ int main() handleCurrentScreen(); if (!buttons_active() && !peekScreenInvalidated()) - sleepUntilButton(_BV(BUTTON_UP) | _BV(BUTTON_DOWN) | _BV(BUTTON_OPTION)); + sleepUntilButton(_BV(BUTTON_UP) | _BV(BUTTON_DOWN) | _BV(BUTTON_OPTION), 0); } } diff --git a/Source/src/power.c b/Source/src/power.c index f89d6cb..981314d 100644 --- a/Source/src/power.c +++ b/Source/src/power.c @@ -65,7 +65,10 @@ void checkPower() break; case ManualOff: - sleepUntilButton(_BV(BUTTON_OPTION)); + // Skip the next button change since it's on a long press. I don't + // really like that this is set here instead of in the call to + // setPowerState, but that's a refactoring for another day.... + sleepUntilButton(_BV(BUTTON_OPTION), 1); setPowerState(On); break; } @@ -163,17 +166,25 @@ static inline void sleepEnd() } -void sleepUntilButton(uint8_t pinMask) +void sleepUntilButton(uint8_t pinMask, uint8_t ignoreEvents) { - // Enable pin change interrupts - GIMSK |= _BV(PCIE); + while (1) + { + // Enable pin change interrupts + GIMSK |= _BV(PCIE); - // Set up pin change mask - PCMSK = pinMask; + // Set up pin change mask + PCMSK = pinMask; - sleepStart(); - PCMSK = 0; - sleepEnd(); + sleepStart(); + PCMSK = 0; + sleepEnd(); + + if (ignoreEvents == 0) + break; + + ignoreEvents--; + } } diff --git a/Source/src/power.h b/Source/src/power.h index 57111e1..4eb4ee5 100644 --- a/Source/src/power.h +++ b/Source/src/power.h @@ -13,7 +13,7 @@ extern uint16_t vcc; extern void checkPower(); extern void setPowerState(PowerState newState); -extern void sleepUntilButton(uint8_t pinMask); +extern void sleepUntilButton(uint8_t pinMask, uint8_t ignoreEvents); // 0 = 16 ms // 1 = 32 ms