From d903a827e9a95ec2472b3200c9fbb768a5cae3cd Mon Sep 17 00:00:00 2001 From: Alessandro Genova Date: Mon, 28 Jul 2025 23:58:03 -0400 Subject: [PATCH] Fix simulator deep sleep mode --- movement.c | 5 ++ .../simulator/watch/watch_deepsleep.c | 52 +++++++++++++++---- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/movement.c b/movement.c index f932de0a..0046a489 100644 --- a/movement.c +++ b/movement.c @@ -51,6 +51,7 @@ #if __EMSCRIPTEN__ #include +void _wake_up_simulator(void); #else #include "watch_usb_cdc.h" #endif @@ -1023,6 +1024,10 @@ void cb_alarm_btn_extwake(void) { } void cb_alarm_fired(void) { +#if __EMSCRIPTEN__ + _wake_up_simulator(); +#endif + movement_state.woke_from_alarm_handler = true; } diff --git a/watch-library/simulator/watch/watch_deepsleep.c b/watch-library/simulator/watch/watch_deepsleep.c index 1bc4be73..88ac2da9 100644 --- a/watch-library/simulator/watch/watch_deepsleep.c +++ b/watch-library/simulator/watch/watch_deepsleep.c @@ -25,17 +25,37 @@ #include #include "watch_extint.h" #include "app.h" +#include + static uint32_t watch_backup_data[8]; +static bool _wake_up = false; +static watch_cb_t _callback = NULL; + + +void _wake_up_simulator(void) { + _wake_up = true; +} + +static void cb_extwake_wrapper(void) { + _wake_up_simulator(); + + if (_callback) { + _callback(); + } +} + void watch_register_extwake_callback(uint8_t pin, watch_cb_t callback, bool level) { if (pin == HAL_GPIO_BTN_ALARM_pin()) { + _callback = callback; watch_enable_external_interrupts(); - watch_register_interrupt_callback(pin, callback, level ? INTERRUPT_TRIGGER_RISING : INTERRUPT_TRIGGER_FALLING); + watch_register_interrupt_callback(pin, cb_extwake_wrapper, level ? INTERRUPT_TRIGGER_RISING : INTERRUPT_TRIGGER_FALLING); } } void watch_disable_extwake_interrupt(uint8_t pin) { if (pin == HAL_GPIO_BTN_ALARM_pin()) { + _callback = NULL; watch_register_interrupt_callback(pin, NULL, INTERRUPT_TRIGGER_NONE); } } @@ -57,23 +77,33 @@ uint32_t watch_get_backup_data(uint8_t reg) { void watch_enter_sleep_mode(void) { // TODO: (a2) hook to UI - // enter standby (4); we basically hang out here until an interrupt wakes us. - // sleep(4); + // disable tick interrupt + watch_rtc_disable_all_periodic_callbacks(); + + // // disable all buttons but alarm + watch_register_interrupt_callback(HAL_GPIO_BTN_MODE_pin(), NULL, INTERRUPT_TRIGGER_NONE); + watch_register_interrupt_callback(HAL_GPIO_BTN_LIGHT_pin(), NULL, INTERRUPT_TRIGGER_NONE); + + sleep(4); // call app_setup so the app can re-enable everything we disabled. app_setup(); } -void watch_enter_deep_sleep_mode(void) { - // identical to sleep mode except we disable the LCD first. - // TODO: (a2) hook to UI - - watch_enter_sleep_mode(); -} - void watch_enter_backup_mode(void) { // TODO: (a2) hook to UI // go into backup sleep mode (5). when we exit, the reset controller will take over. - // sleep(5); + sleep(5); +} + +void sleep(const uint8_t mode) { + (void) mode; + + // we basically hang out here until an interrupt wakes us. + while(!_wake_up) { + emscripten_sleep(100); + } + + _wake_up = false; }