summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Castillo <joeycastillo@utexas.edu>2021-11-29 14:53:13 -0500
committerJoey Castillo <joeycastillo@utexas.edu>2021-11-29 14:54:13 -0500
commit0fb8afda813ffbe96072ceb09292c8ae0d490b59 (patch)
treea5ef02898cbb37fee60a1fab71a5a650b06bed8b
parent7529866267dfabdeab495dc17a17f09430848d45 (diff)
downloadSensor-Watch-0fb8afda813ffbe96072ceb09292c8ae0d490b59.tar.gz
Sensor-Watch-0fb8afda813ffbe96072ceb09292c8ae0d490b59.tar.bz2
Sensor-Watch-0fb8afda813ffbe96072ceb09292c8ae0d490b59.zip
movement: add alarm and signal functions
-rw-r--r--movement/movement.c41
-rw-r--r--movement/movement.h9
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_