diff options
author | Joey Castillo <joeycastillo@utexas.edu> | 2022-07-17 00:22:03 -0500 |
---|---|---|
committer | Joey Castillo <joeycastillo@utexas.edu> | 2022-07-17 00:23:38 -0500 |
commit | b234db74fe3f70254860715cc4bb828a30290fb2 (patch) | |
tree | 4c3ecd6054b3f5790da2bd1faafad0f260b91d17 /movement | |
parent | 8d7748b1ad37bd7c4866145bc0d0ddfa3ef61139 (diff) | |
download | Sensor-Watch-b234db74fe3f70254860715cc4bb828a30290fb2.tar.gz Sensor-Watch-b234db74fe3f70254860715cc4bb828a30290fb2.tar.bz2 Sensor-Watch-b234db74fe3f70254860715cc4bb828a30290fb2.zip |
movement: wake programmatically from background and play alarm
Diffstat (limited to 'movement')
-rw-r--r-- | movement/movement.c | 43 | ||||
-rw-r--r-- | movement/movement.h | 3 |
2 files changed, 34 insertions, 12 deletions
diff --git a/movement/movement.c b/movement/movement.c index 4a5bc04e..361a7aa1 100644 --- a/movement/movement.c +++ b/movement/movement.c @@ -222,6 +222,11 @@ void movement_cancel_background_task(void) { movement_state.has_scheduled_background_task = other_tasks_scheduled; } +void movement_request_wake() { + movement_state.needs_wake = true; + _movement_reset_inactivity_countdown(); +} + void movement_play_signal(void) { watch_buzzer_play_note(BUZZER_NOTE_C8, 75); watch_buzzer_play_note(BUZZER_NOTE_REST, 100); @@ -229,7 +234,11 @@ void movement_play_signal(void) { } void movement_play_alarm(void) { - movement_state.alarm_ticks = 128 * 5 - 80; // 80 ticks short of 5 seconds, or 4.375 seconds (our beep is 0.375 seconds) + movement_request_wake(); + // alarm length: 75 ticks short of 5 seconds, or 4.414 seconds: + // our tone is 0.375 seconds of beep and 0.625 of silence, repeated five times. + // so 4.375 + a few ticks to wake up from sleep mode. + movement_state.alarm_ticks = 128 * 5 - 75; _movement_enable_fast_tick_if_needed(); } @@ -319,6 +328,23 @@ void app_prepare_for_standby(void) { void app_wake_from_standby(void) { } +static void _sleep_mode_app_loop(void) { + movement_state.needs_wake = false; + // as long as le_mode_ticks is -1 (i.e. we are in low energy mode), we wake up here, update the screen, and go right back to sleep. + while (movement_state.le_mode_ticks == -1) { + // we also have to handle background tasks here in the mini-runloop + if (movement_state.needs_background_tasks_handled) _movement_handle_background_tasks(); + + event.event_type = EVENT_LOW_ENERGY_UPDATE; + watch_faces[movement_state.current_watch_face].loop(event, &movement_state.settings, watch_face_contexts[movement_state.current_watch_face]); + + // if we need to wake immediately, do it! + if (movement_state.needs_wake) return; + // otherwise enter sleep mode, and when the extwake handler is called, it will reset le_mode_ticks and force us out at the next loop. + else watch_enter_sleep_mode(); + } +} + bool app_loop(void) { if (movement_state.watch_face_changed) { if (movement_state.settings.bit.button_should_sound) { @@ -360,17 +386,10 @@ bool app_loop(void) { event.event_type = EVENT_NONE; event.subsecond = 0; - // this is a little mini-runloop. - // as long as le_mode_ticks is -1 (i.e. we are in low energy mode), we wake up here, update the screen, and go right back to sleep. - while (movement_state.le_mode_ticks == -1) { - // we also have to handle background tasks here in the mini-runloop - if (movement_state.needs_background_tasks_handled) _movement_handle_background_tasks(); - - event.event_type = EVENT_LOW_ENERGY_UPDATE; - watch_faces[movement_state.current_watch_face].loop(event, &movement_state.settings, watch_face_contexts[movement_state.current_watch_face]); - watch_enter_sleep_mode(); - } - // as soon as le_mode_ticks is reset by the extwake handler, we bail out of the loop and reactivate ourselves. + // _sleep_mode_app_loop takes over at this point and loops until le_mode_ticks is reset by the extwake handler, + // or wake is requested using the movement_request_wake function. + _sleep_mode_app_loop(); + // as soon as _sleep_mode_app_loop returns, we reactivate ourselves. event.event_type = EVENT_ACTIVATE; // this is a hack tho: waking from sleep mode, app_setup does get called, but it happens before we have reset our ticks. // need to figure out if there's a better heuristic for determining how we woke up. diff --git a/movement/movement.h b/movement/movement.h index a29c4469..255db057 100644 --- a/movement/movement.h +++ b/movement/movement.h @@ -257,6 +257,7 @@ typedef struct { // background task handling bool needs_background_tasks_handled; bool has_scheduled_background_task; + bool needs_wake; // low energy mode countdown int32_t le_mode_ticks; @@ -287,6 +288,8 @@ void movement_schedule_background_task(watch_date_time date_time); // movement will associate the scheduled task with the currently active face. void movement_cancel_background_task(void); +void movement_request_wake(); + void movement_play_signal(void); void movement_play_alarm(void); |