From 0fb8afda813ffbe96072ceb09292c8ae0d490b59 Mon Sep 17 00:00:00 2001 From: Joey Castillo Date: Mon, 29 Nov 2021 14:53:13 -0500 Subject: movement: add alarm and signal functions --- movement/movement.c | 41 ++++++++++++++++++++++++++++++++++++++--- movement/movement.h | 9 ++++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/movement/movement.c b/movement/movement.c index 91cd3912..71707bfa 100644 --- a/movement/movement.c +++ b/movement/movement.c @@ -79,7 +79,9 @@ static inline void _movement_enable_fast_tick_if_needed() { } static inline void _movement_disable_fast_tick_if_possible() { - if ((movement_state.light_ticks == -1) && ((movement_state.light_down_timestamp + movement_state.mode_down_timestamp + movement_state.alarm_down_timestamp) == 0)) { + if ((movement_state.light_ticks == -1) && + (movement_state.alarm_ticks == -1) && + ((movement_state.light_down_timestamp + movement_state.mode_down_timestamp + movement_state.alarm_down_timestamp) == 0)) { movement_state.fast_tick_enabled = false; watch_rtc_disable_periodic_callback(128); } @@ -123,6 +125,17 @@ void movement_move_to_next_face() { movement_move_to_face((movement_state.current_watch_face + 1) % MOVEMENT_NUM_FACES); } +void movement_play_signal() { + watch_buzzer_play_note(BUZZER_NOTE_C8, 75); + watch_buzzer_play_note(BUZZER_NOTE_REST, 100); + watch_buzzer_play_note(BUZZER_NOTE_C8, 100); +} + +void movement_play_alarm() { + movement_state.alarm_ticks = 128 * 5 - 80; // 80 ticks short of 5 seconds, or 4.375 seconds (our beep is 0.375 seconds) + _movement_enable_fast_tick_if_needed(); +} + void app_init() { memset(&movement_state, 0, sizeof(movement_state)); @@ -132,6 +145,7 @@ void app_init() { movement_state.settings.bit.led_duration = 1; movement_state.settings.bit.time_zone = 16; // default to GMT movement_state.light_ticks = -1; + movement_state.alarm_ticks = -1; _movement_reset_inactivity_countdown(); } @@ -257,12 +271,32 @@ bool app_loop() { event.event_type = EVENT_NONE; } + // Now that we've handled all display update tasks, handle the alarm. + if (movement_state.alarm_ticks >= 0) { + uint8_t buzzer_phase = (movement_state.alarm_ticks + 80) % 128; + if(buzzer_phase == 127) { + for(uint8_t i = 0; i < 4; i++) { + // TODO: This method of playing the buzzer blocks the UI while it's beeping. + // It might be better to time it with the fast tick. + watch_buzzer_play_note(BUZZER_NOTE_C8, (i != 3) ? 50 : 75); + if (i != 3) watch_buzzer_play_note(BUZZER_NOTE_REST, 50); + } + } + if (movement_state.alarm_ticks == 0) { + movement_state.alarm_ticks = -1; + _movement_disable_fast_tick_if_possible(); + } + } + event.subsecond = 0; - return can_sleep && (movement_state.light_ticks == 0); + return can_sleep && (movement_state.light_ticks == 0) && !movement_state.is_buzzing; } movement_event_type_t _figure_out_button_event(bool pin_level, movement_event_type_t button_down_event_type, uint8_t *down_timestamp) { + // force alarm off if the user pressed a button. + if (movement_state.alarm_ticks) movement_state.alarm_ticks = 0; + if (pin_level) { // handle rising edge _movement_enable_fast_tick_if_needed(); @@ -312,7 +346,8 @@ void cb_alarm_fired() { void cb_fast_tick() { movement_state.fast_ticks++; if (movement_state.light_ticks > 0) movement_state.light_ticks--; - // this is just a fail-safe; fast tick should be disabled as soon as the button is up and/or the LED times out. + if (movement_state.alarm_ticks > 0) movement_state.alarm_ticks--; + // this is just a fail-safe; fast tick should be disabled as soon as the button is up, the LED times out, and/or the alarm finishes. // but if for whatever reason it isn't, this forces the fast tick off after 10 seconds. if (movement_state.fast_ticks >= 1280) watch_rtc_disable_periodic_callback(128); } diff --git a/movement/movement.h b/movement/movement.h index 2e7630b2..9fa540ca 100644 --- a/movement/movement.h +++ b/movement/movement.h @@ -215,7 +215,11 @@ typedef struct { // LED stuff int16_t light_ticks; - + + // alarm stuff + int16_t alarm_ticks; + bool is_buzzing; + // button tracking for long press uint8_t light_down_timestamp; uint8_t mode_down_timestamp; @@ -241,4 +245,7 @@ void movement_move_to_next_face(); void movement_illuminate_led(); void movement_request_tick_frequency(uint8_t freq); +void movement_play_signal(); +void movement_play_alarm(); + #endif // MOVEMENT_H_ -- cgit v1.2.3