diff options
author | Joey Castillo <joeycastillo@utexas.edu> | 2022-01-25 15:39:04 -0500 |
---|---|---|
committer | Joey Castillo <joeycastillo@utexas.edu> | 2022-01-25 15:39:04 -0500 |
commit | 249bfc183c5d7c13d94ffecf5389a6b56a2d735d (patch) | |
tree | e4c3be3f863312c6fb743621c1b6a5ce22ba18f0 /movement/watch_faces/clock | |
parent | b8de35658ffd78ad8b22f91ccbbd3d63663afda9 (diff) | |
download | Sensor-Watch-249bfc183c5d7c13d94ffecf5389a6b56a2d735d.tar.gz Sensor-Watch-249bfc183c5d7c13d94ffecf5389a6b56a2d735d.tar.bz2 Sensor-Watch-249bfc183c5d7c13d94ffecf5389a6b56a2d735d.zip |
movement: move beat time to clock folder
Diffstat (limited to 'movement/watch_faces/clock')
-rw-r--r-- | movement/watch_faces/clock/beats_face.c | 91 | ||||
-rw-r--r-- | movement/watch_faces/clock/beats_face.h | 25 |
2 files changed, 116 insertions, 0 deletions
diff --git a/movement/watch_faces/clock/beats_face.c b/movement/watch_faces/clock/beats_face.c new file mode 100644 index 00000000..df31ad1c --- /dev/null +++ b/movement/watch_faces/clock/beats_face.c @@ -0,0 +1,91 @@ +#include <stdlib.h> +#include <string.h> +#include "beats_face.h" +#include "watch.h" + +const uint8_t BEAT_REFRESH_FREQUENCY = 8; + +void beats_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { + (void) settings; + (void) watch_face_index; + (void) context_ptr; + if (*context_ptr == NULL) { + *context_ptr = malloc(sizeof(beats_face_state_t)); + } +} + +void beats_face_activate(movement_settings_t *settings, void *context) { + (void) settings; + beats_face_state_t *state = (beats_face_state_t *)context; + state->next_subsecond_update = 0; + state->last_centibeat_displayed = 0; + movement_request_tick_frequency(BEAT_REFRESH_FREQUENCY); +} + +bool beats_face_loop(movement_event_t event, movement_settings_t *settings, void *context) { + (void) settings; + beats_face_state_t *state = (beats_face_state_t *)context; + if (event.event_type == EVENT_TICK && event.subsecond != state->next_subsecond_update) { + return true; // math is hard, don't do it if we don't have to. + } + + char buf[16]; + uint32_t centibeats; + + watch_date_time date_time; + switch (event.event_type) { + case EVENT_ACTIVATE: + case EVENT_TICK: + date_time = watch_rtc_get_date_time(); + centibeats = clock2beats(date_time.unit.hour, date_time.unit.minute, date_time.unit.second, event.subsecond, movement_timezone_offsets[settings->bit.time_zone]); + if (centibeats == state->last_centibeat_displayed) { + // we missed this update, try again next subsecond + state->next_subsecond_update = (event.subsecond + 1) % BEAT_REFRESH_FREQUENCY; + } else { + state->next_subsecond_update = (event.subsecond + 1 + (BEAT_REFRESH_FREQUENCY * 2 / 3)) % BEAT_REFRESH_FREQUENCY; + state->last_centibeat_displayed = centibeats; + } + sprintf(buf, "bt %6lu", centibeats); + + watch_display_string(buf, 0); + break; + case EVENT_LOW_ENERGY_UPDATE: + if (!watch_tick_animation_is_running()) watch_start_tick_animation(432); + date_time = watch_rtc_get_date_time(); + centibeats = clock2beats(date_time.unit.hour, date_time.unit.minute, date_time.unit.second, event.subsecond, movement_timezone_offsets[settings->bit.time_zone]); + sprintf(buf, "bt %4lu ", centibeats / 100); + + watch_display_string(buf, 0); + break; + case EVENT_MODE_BUTTON_UP: + movement_move_to_next_face(); + break; + case EVENT_LIGHT_BUTTON_DOWN: + movement_illuminate_led(); + break; + case EVENT_ALARM_BUTTON_DOWN: + case EVENT_ALARM_BUTTON_UP: + case EVENT_ALARM_LONG_PRESS: + default: + break; + } + + return true; +} + +void beats_face_resign(movement_settings_t *settings, void *context) { + (void) settings; + (void) context; +} + +uint32_t clock2beats(uint32_t hours, uint32_t minutes, uint32_t seconds, uint32_t subseconds, int16_t utc_offset) { + uint32_t retval = seconds * 1000 + (subseconds * 1000) / (BEAT_REFRESH_FREQUENCY); + retval += 60 * minutes * 1000; + retval += hours * 60 * 60 * 1000; + retval -= (utc_offset - 60) * 60 * 1000; + + retval /= 864; // convert to centibeats + retval %= 100000; + + return retval; +}
\ No newline at end of file diff --git a/movement/watch_faces/clock/beats_face.h b/movement/watch_faces/clock/beats_face.h new file mode 100644 index 00000000..2bbbc26d --- /dev/null +++ b/movement/watch_faces/clock/beats_face.h @@ -0,0 +1,25 @@ +#ifndef BEATS_FACE_H_ +#define BEATS_FACE_H_ + +#include "movement.h" + +typedef struct { + int8_t next_subsecond_update; + uint32_t last_centibeat_displayed; +} beats_face_state_t; + +uint32_t clock2beats(uint32_t hours, uint32_t minutes, uint32_t seconds, uint32_t subseconds, int16_t utc_offset); +void beats_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); +void beats_face_activate(movement_settings_t *settings, void *context); +bool beats_face_loop(movement_event_t event, movement_settings_t *settings, void *context); +void beats_face_resign(movement_settings_t *settings, void *context); + +#define beats_face ((const watch_face_t){ \ + beats_face_setup, \ + beats_face_activate, \ + beats_face_loop, \ + beats_face_resign, \ + NULL, \ +}) + +#endif // BEATS_FACE_H_
\ No newline at end of file |