aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster/fsm-standby.c
diff options
context:
space:
mode:
authorSelene ToyKeeper2018-06-17 18:18:38 -0600
committerSelene ToyKeeper2018-06-17 18:18:38 -0600
commitcfedb2eaf4a0d62969ff05307ac40d4f1cdab2d9 (patch)
tree0d4ecd59e65b3152c44e50c9a93e679a260fac5c /spaghetti-monster/fsm-standby.c
parentAdded dual-switch support (tail clicky + e-switch) to muggle mode. (diff)
downloadanduril-cfedb2eaf4a0d62969ff05307ac40d4f1cdab2d9.tar.gz
anduril-cfedb2eaf4a0d62969ff05307ac40d4f1cdab2d9.tar.bz2
anduril-cfedb2eaf4a0d62969ff05307ac40d4f1cdab2d9.zip
Implemented halfsleep mode.
Will probably change it quite a bit though, so I'm checking in changes first. Needs to be "tick during standby" instead of "half sleep".
Diffstat (limited to '')
-rw-r--r--spaghetti-monster/fsm-standby.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/spaghetti-monster/fsm-standby.c b/spaghetti-monster/fsm-standby.c
index b90ccea..8e51dda 100644
--- a/spaghetti-monster/fsm-standby.c
+++ b/spaghetti-monster/fsm-standby.c
@@ -31,7 +31,17 @@
#define standby_mode sleep_until_eswitch_pressed
void sleep_until_eswitch_pressed()
{
+ #ifdef USE_HALFSLEEP_MODE
+ //uint16_t sleep_counter = 0;
+ if (halfsleep_mode) {
+ // set WDT to slow mode
+ wdt_reset();
+ WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
+ WDTCR = (1<<WDIE) | 5; // Enable interrupt every 0.5s
+ } else
+ #endif
WDT_off();
+
ADC_off();
// make sure switch isn't currently pressed
@@ -41,15 +51,29 @@ void sleep_until_eswitch_pressed()
PCINT_on(); // wake on e-switch event
- // configure sleep mode
- set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ #ifdef USE_HALFSLEEP_MODE
+ while (halfsleep_mode) {
+ f_wdt = 0; // detect if WDT was what caused a wake-up
+ #endif
+ // configure sleep mode
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
- sleep_enable();
- sleep_bod_disable();
- sleep_cpu(); // wait here
+ sleep_enable();
+ sleep_bod_disable();
+ sleep_cpu(); // wait here
- // something happened; wake up
- sleep_disable();
+ // something happened; wake up
+ sleep_disable();
+
+ #ifdef USE_HALFSLEEP_MODE
+ // determine what woke us up... WDT or PCINT
+ if (! f_wdt) { // PCINT went off
+ halfsleep_mode = 0;
+ }
+ #endif
+ #ifdef USE_HALFSLEEP_MODE
+ }
+ #endif
#ifdef USE_THERMAL_REGULATION
// forget what the temperature was last time we were on