diff options
Diffstat (limited to 'movement')
24 files changed, 283 insertions, 63 deletions
diff --git a/movement/alt_fw/alt_time.h b/movement/alt_fw/alt_time.h index 8108bcf3..956928d7 100644 --- a/movement/alt_fw/alt_time.h +++ b/movement/alt_fw/alt_time.h @@ -38,4 +38,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/backer.h b/movement/alt_fw/backer.h index 3abcf457..d41f567d 100644 --- a/movement/alt_fw/backer.h +++ b/movement/alt_fw/backer.h @@ -40,4 +40,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/deep_space_now.h b/movement/alt_fw/deep_space_now.h index 6cb34237..d2096a69 100644 --- a/movement/alt_fw/deep_space_now.h +++ b/movement/alt_fw/deep_space_now.h @@ -58,4 +58,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/focus.h b/movement/alt_fw/focus.h index ab5525a5..a8fd5736 100644 --- a/movement/alt_fw/focus.h +++ b/movement/alt_fw/focus.h @@ -40,4 +40,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/the_athlete.h b/movement/alt_fw/the_athlete.h index 5d9d9529..660a304c 100644 --- a/movement/alt_fw/the_athlete.h +++ b/movement/alt_fw/the_athlete.h @@ -40,4 +40,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/the_backpacker.h b/movement/alt_fw/the_backpacker.h index 01af7b06..0a599cff 100644 --- a/movement/alt_fw/the_backpacker.h +++ b/movement/alt_fw/the_backpacker.h @@ -41,4 +41,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/the_stargazer.h b/movement/alt_fw/the_stargazer.h index a13dc3ac..844c6807 100644 --- a/movement/alt_fw/the_stargazer.h +++ b/movement/alt_fw/the_stargazer.h @@ -42,4 +42,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/alt_fw/timers.h b/movement/alt_fw/timers.h index c4d27f50..4d36c664 100644 --- a/movement/alt_fw/timers.h +++ b/movement/alt_fw/timers.h @@ -40,4 +40,6 @@ const watch_face_t watch_faces[] = { #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) +#define SIGNAL_TUNE_DEFAULT + #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/make/Makefile b/movement/make/Makefile index 625c7729..06e1725d 100644 --- a/movement/make/Makefile +++ b/movement/make/Makefile @@ -118,6 +118,7 @@ SRCS += \ ../watch_faces/complication/flashlight_face.c \ ../watch_faces/clock/decimal_time_face.c \ ../watch_faces/clock/wyoscan_face.c \ + ../watch_faces/complication/tuning_tones_face.c \ # New watch faces go above this line. # Leave this line at the bottom of the file; it has all the targets for making your project. diff --git a/movement/make/make_alternate_fw.sh b/movement/make/make_alternate_fw.sh index d1ce7673..c65e72d3 100755 --- a/movement/make/make_alternate_fw.sh +++ b/movement/make/make_alternate_fw.sh @@ -2,7 +2,7 @@ fw_dir="firmware/download" sim_dir="firmware/simulate" -colors=("green" "blue") +colors=("green" "blue" "red") variants=("standard" "backer" "alt_time" "deep_space_now" "focus" "the_athlete" "the_backpacker" "the_stargazer") if [ -d "$fw_dir" ] ; then @@ -22,7 +22,7 @@ do do COLOR=$(echo "$color" | tr '[:lower:]' '[:upper:]') make clean - make LED=$COLOR FIRMWARE=$VARIANT + make COLOR=$COLOR FIRMWARE=$VARIANT mv "build/watch.uf2" "$fw_dir/$variant-$color.uf2" done rm -rf ./build-sim diff --git a/movement/movement.c b/movement/movement.c index 40247c65..f0868416 100644 --- a/movement/movement.c +++ b/movement/movement.c @@ -54,6 +54,8 @@ #include "alt_fw/deep_space_now.h" #endif +#include "movement_custom_signal_tunes.h" + // Default to no secondary face behaviour. #ifndef MOVEMENT_SECONDARY_FACE_INDEX #define MOVEMENT_SECONDARY_FACE_INDEX 0 @@ -292,7 +294,25 @@ void movement_request_wake() { } void movement_play_signal(void) { - watch_buzzer_play_sequence(signal_tune, NULL); + bool buzzer_enabled = watch_is_buzzer_or_led_enabled(); + if (!buzzer_enabled) { + watch_enable_buzzer(); + } + watch_buzzer_play_note(BUZZER_NOTE_C8, 75); + watch_buzzer_play_note(BUZZER_NOTE_REST, 100); + watch_buzzer_play_note(BUZZER_NOTE_C8, 100); + if (!buzzer_enabled) { + watch_disable_buzzer(); + } +} + +void movement_play_tune(void) { + if (!watch_is_buzzer_or_led_enabled()) { + watch_enable_buzzer(); + watch_buzzer_play_sequence(signal_tune, watch_disable_buzzer); + } else { + watch_buzzer_play_sequence(signal_tune, NULL); + } } void movement_play_alarm(void) { @@ -315,7 +335,9 @@ uint8_t movement_claim_backup_register(void) { } void app_init(void) { -#ifdef WATCH_IS_BLUE_BOARD +#if defined(NO_FREQCORR) + watch_rtc_freqcorr_write(0, 0); +#elif defined(WATCH_IS_BLUE_BOARD) watch_rtc_freqcorr_write(11, 0); #else watch_rtc_freqcorr_write(22, 0); diff --git a/movement/movement.h b/movement/movement.h index 66bf6af4..5f30dfb8 100644 --- a/movement/movement.h +++ b/movement/movement.h @@ -307,6 +307,7 @@ void movement_cancel_background_task_for_face(uint8_t watch_face_index); void movement_request_wake(void); void movement_play_signal(void); +void movement_play_tune(void); void movement_play_alarm(void); void movement_play_alarm_beeps(uint8_t rounds, BuzzerNote alarm_note); diff --git a/movement/movement_config.h b/movement/movement_config.h index b1410a8b..6a7f87e0 100644 --- a/movement/movement_config.h +++ b/movement/movement_config.h @@ -35,19 +35,21 @@ const watch_face_t watch_faces[] = { stopwatch_face, preferences_face, set_time_face, + thermistor_readout_face, + voltage_face }; #define MOVEMENT_NUM_FACES (sizeof(watch_faces) / sizeof(watch_face_t)) -/* Determines what face to go to from the first face if you've already set - * a mode long press to go to the first face in preferences, and - * excludes these faces from the normal rotation. - * Usually it makes sense to set this to the preferences face. +/* Determines what face to go to from the first face on long press of the Mode button. + * Also excludes these faces from the normal rotation. + * In the default firmware, this lets you access temperature and battery voltage with a long press of Mode. + * Some folks also like to use this to hide the preferences and time set faces from the normal rotation. + * If you don't want any faces to be excluded, set this to 0 and a long Mode press will have no effect. */ -#define MOVEMENT_SECONDARY_FACE_INDEX 0 // or (MOVEMENT_NUM_FACES - 2) +#define MOVEMENT_SECONDARY_FACE_INDEX (MOVEMENT_NUM_FACES - 2) // or (0) /* Custom hourly chime tune. Check movement_custom_signal_tunes.h for options */ #define SIGNAL_TUNE_DEFAULT -#include "movement_custom_signal_tunes.h" #endif // MOVEMENT_CONFIG_H_ diff --git a/movement/movement_faces.h b/movement/movement_faces.h index ff34c063..23c2613f 100644 --- a/movement/movement_faces.h +++ b/movement/movement_faces.h @@ -95,6 +95,7 @@ #include "flashlight_face.h" #include "decimal_time_face.h" #include "wyoscan_face.h" +#include "tuning_tones_face.h" // New includes go above this line. #endif // MOVEMENT_FACES_H_ diff --git a/movement/watch_faces/clock/repetition_minute_face.c b/movement/watch_faces/clock/repetition_minute_face.c index a0fbe077..fc78b2d8 100644 --- a/movement/watch_faces/clock/repetition_minute_face.c +++ b/movement/watch_faces/clock/repetition_minute_face.c @@ -151,19 +151,7 @@ bool repetition_minute_face_loop(movement_event_t event, movement_settings_t *se else watch_clear_indicator(WATCH_INDICATOR_BELL); break; case EVENT_BACKGROUND_TASK: - // uncomment this line to snap back to the clock face when the hour signal sounds: - // movement_move_to_face(state->watch_face_index); - if (watch_is_buzzer_or_led_enabled()) { - // if we are in the foreground, we can just beep. - movement_play_signal(); - } else { - // if we were in the background, we need to enable the buzzer peripheral first, - watch_enable_buzzer(); - // beep quickly (this call blocks for 275 ms), - movement_play_signal(); - // and then turn the buzzer peripheral off again. - watch_disable_buzzer(); - } + movement_play_signal(); break; case EVENT_LIGHT_LONG_UP: /* diff --git a/movement/watch_faces/clock/simple_clock_bin_led_face.c b/movement/watch_faces/clock/simple_clock_bin_led_face.c index 640f0d77..cf39c188 100644 --- a/movement/watch_faces/clock/simple_clock_bin_led_face.c +++ b/movement/watch_faces/clock/simple_clock_bin_led_face.c @@ -180,17 +180,7 @@ bool simple_clock_bin_led_face_loop(movement_event_t event, movement_settings_t case EVENT_BACKGROUND_TASK: // uncomment this line to snap back to the clock face when the hour signal sounds: // movement_move_to_face(state->watch_face_index); - if (watch_is_buzzer_or_led_enabled()) { - // if we are in the foreground, we can just beep. - movement_play_signal(); - } else { - // if we were in the background, we need to enable the buzzer peripheral first, - watch_enable_buzzer(); - // beep quickly (this call blocks for 275 ms), - movement_play_signal(); - // and then turn the buzzer peripheral off again. - watch_disable_buzzer(); - } + movement_play_signal(); break; case EVENT_LIGHT_LONG_PRESS: if (state->flashing_state == 0) { diff --git a/movement/watch_faces/clock/simple_clock_face.c b/movement/watch_faces/clock/simple_clock_face.c index 91400b6c..ac9a97b2 100644 --- a/movement/watch_faces/clock/simple_clock_face.c +++ b/movement/watch_faces/clock/simple_clock_face.c @@ -136,17 +136,11 @@ bool simple_clock_face_loop(movement_event_t event, movement_settings_t *setting case EVENT_BACKGROUND_TASK: // uncomment this line to snap back to the clock face when the hour signal sounds: // movement_move_to_face(state->watch_face_index); - if (watch_is_buzzer_or_led_enabled()) { - // if we are in the foreground, we can just beep. - movement_play_signal(); - } else { - // if we were in the background, we need to enable the buzzer peripheral first, - watch_enable_buzzer(); - // beep quickly (this call blocks for 275 ms), - movement_play_signal(); - // and then turn the buzzer peripheral off again. - watch_disable_buzzer(); - } + #ifdef SIGNAL_TUNE_DEFAULT + movement_play_signal(); + #else + movement_play_tune(); + #endif break; default: return movement_default_loop_handler(event, settings); diff --git a/movement/watch_faces/clock/weeknumber_clock_face.c b/movement/watch_faces/clock/weeknumber_clock_face.c index 4e40ebdc..81df5847 100644 --- a/movement/watch_faces/clock/weeknumber_clock_face.c +++ b/movement/watch_faces/clock/weeknumber_clock_face.c @@ -130,17 +130,7 @@ bool weeknumber_clock_face_loop(movement_event_t event, movement_settings_t *set case EVENT_BACKGROUND_TASK: // uncomment this line to snap back to the clock face when the hour signal sounds: // movement_move_to_face(state->watch_face_index); - if (watch_is_buzzer_or_led_enabled()) { - // if we are in the foreground, we can just beep. - movement_play_signal(); - } else { - // if we were in the background, we need to enable the buzzer peripheral first, - watch_enable_buzzer(); - // beep quickly (this call blocks for 275 ms), - movement_play_signal(); - // and then turn the buzzer peripheral off again. - watch_disable_buzzer(); - } + movement_play_signal(); break; default: movement_default_loop_handler(event, settings); diff --git a/movement/watch_faces/complication/timer_face.c b/movement/watch_faces/complication/timer_face.c index 70f250a5..8bf7cf99 100644 --- a/movement/watch_faces/complication/timer_face.c +++ b/movement/watch_faces/complication/timer_face.c @@ -30,7 +30,7 @@ #include "watch.h" #include "watch_utility.h" -static const uint16_t _default_timer_values[] = {0x200, 0x500, 0xA00, 0x1400, 0x2D02}; // default timers: 2 min, 5 min, 10 min, 20 min, 2 h 45 min +static const uint32_t _default_timer_values[] = {0x000200, 0x000500, 0x000A00, 0x001400, 0x002D02}; // default timers: 2 min, 5 min, 10 min, 20 min, 2 h 45 min // sound sequence for a single beeping sequence static const int8_t _sound_seq_beep[] = {BUZZER_NOTE_C8, 3, BUZZER_NOTE_REST, 3, -2, 2, BUZZER_NOTE_C8, 5, BUZZER_NOTE_REST, 25, 0}; @@ -199,7 +199,7 @@ void timer_face_setup(movement_settings_t *settings, uint8_t watch_face_index, v timer_state_t *state = (timer_state_t *)*context_ptr; memset(*context_ptr, 0, sizeof(timer_state_t)); state->watch_face_index = watch_face_index; - for (uint8_t i = 0; i < sizeof(_default_timer_values) / sizeof(uint16_t); i++) { + for (uint8_t i = 0; i < sizeof(_default_timer_values) / sizeof(uint32_t); i++) { state->timers[i].value = _default_timer_values[i]; } } diff --git a/movement/watch_faces/complication/tuning_tones_face.c b/movement/watch_faces/complication/tuning_tones_face.c new file mode 100644 index 00000000..a139427a --- /dev/null +++ b/movement/watch_faces/complication/tuning_tones_face.c @@ -0,0 +1,140 @@ +/* + * MIT License + * + * Copyright (c) 2023 Per Waagø + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include <stdlib.h> +#include <string.h> +#include "tuning_tones_face.h" + +/* + + This face plays a tone that can be used as a reference when tuning + musical instrument. + + - The alarm button (short press) starts and stops the tone + - The light button (short press) changes which note is played. The name + of the note is shown in the display. + +*/ + +typedef struct Note { + BuzzerNote note; + char * name; +} Note; + +static Note notes[] = { + { .note = BUZZER_NOTE_C5, .name = "C " }, + { .note = BUZZER_NOTE_C5SHARP_D5FLAT, .name = "Db" }, + { .note = BUZZER_NOTE_D5, .name = "D " }, + { .note = BUZZER_NOTE_D5SHARP_E5FLAT, .name = "Eb" }, + { .note = BUZZER_NOTE_E5, .name = "E " }, + { .note = BUZZER_NOTE_F5, .name = "F " }, + { .note = BUZZER_NOTE_F5SHARP_G5FLAT, .name = "Gb" }, + { .note = BUZZER_NOTE_G5, .name = "G " }, + { .note = BUZZER_NOTE_G5SHARP_A5FLAT, .name = "Ab" }, + { .note = BUZZER_NOTE_A5, .name = "A " }, + { .note = BUZZER_NOTE_A5SHARP_B5FLAT, .name = "Bb" }, + { .note = BUZZER_NOTE_B5, .name = "B " }, +}; + +static size_t note_count = sizeof notes / sizeof *notes; + +static void draw(tuning_tones_state_t *state) +{ + watch_display_string(notes[state->note_ind].name, 8); +} + +void tuning_tones_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { + (void) settings; + (void) watch_face_index; + if (*context_ptr == NULL) { + tuning_tones_state_t *state = malloc(sizeof *state); + memset(state, 0, sizeof *state); + state->note_ind = 9; + *context_ptr = state; + } +} + +void tuning_tones_face_activate(movement_settings_t *settings, void *context) { + (void) settings; + (void) context; +} + +static void update_buzzer(const tuning_tones_state_t *state) +{ + if (state->playing) { + watch_set_buzzer_off(); + watch_set_buzzer_period(NotePeriods[notes[state->note_ind].note]); + watch_set_buzzer_on(); + } +} + +bool tuning_tones_face_loop(movement_event_t event, movement_settings_t *settings, void *context) { + tuning_tones_state_t *state = (tuning_tones_state_t *)context; + + switch (event.event_type) { + case EVENT_ACTIVATE: + draw(state); + break; + case EVENT_TICK: + break; + case EVENT_LIGHT_BUTTON_DOWN: + state->note_ind++; + if (state->note_ind == note_count) { + state->note_ind = 0; + } + update_buzzer(state); + draw(state); + break; + case EVENT_LIGHT_BUTTON_UP: + break; + case EVENT_ALARM_BUTTON_DOWN: + state->playing = !state->playing; + if (!state->playing) { + watch_set_buzzer_off(); + } else { + update_buzzer(state); + } + case EVENT_ALARM_BUTTON_UP: + break; + case EVENT_TIMEOUT: + movement_move_to_face(0); + break; + case EVENT_LOW_ENERGY_UPDATE: + break; + default: + return movement_default_loop_handler(event, settings); + } + + return !state->playing; +} + +void tuning_tones_face_resign(movement_settings_t *settings, void *context) { + (void) settings; + tuning_tones_state_t *state = (tuning_tones_state_t *)context; + + if (state->playing) { + state->playing = false; + watch_set_buzzer_off(); + } +} diff --git a/movement/watch_faces/complication/tuning_tones_face.h b/movement/watch_faces/complication/tuning_tones_face.h new file mode 100644 index 00000000..d6e3495e --- /dev/null +++ b/movement/watch_faces/complication/tuning_tones_face.h @@ -0,0 +1,57 @@ +/* + * MIT License + * + * Copyright (c) 2023 Per Waagø + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef TUNING_TONES_FACE_H_ +#define TUNING_TONES_FACE_H_ + +#include "movement.h" + +/* + * A DESCRIPTION OF YOUR WATCH FACE + * + * and a description of how use it + * + */ + +typedef struct { + // Anything you need to keep track of, put it here! + bool playing; + size_t note_ind; +} tuning_tones_state_t; + +void tuning_tones_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); +void tuning_tones_face_activate(movement_settings_t *settings, void *context); +bool tuning_tones_face_loop(movement_event_t event, movement_settings_t *settings, void *context); +void tuning_tones_face_resign(movement_settings_t *settings, void *context); + +#define tuning_tones_face ((const watch_face_t){ \ + tuning_tones_face_setup, \ + tuning_tones_face_activate, \ + tuning_tones_face_loop, \ + tuning_tones_face_resign, \ + NULL, \ +}) + +#endif // TUNING_TONES_FACE_H_ + diff --git a/movement/watch_faces/demo/voltage_face.c b/movement/watch_faces/demo/voltage_face.c index 51ed9ccb..d224851b 100644 --- a/movement/watch_faces/demo/voltage_face.c +++ b/movement/watch_faces/demo/voltage_face.c @@ -68,8 +68,17 @@ bool voltage_face_loop(movement_event_t event, movement_settings_t *settings, vo } break; case EVENT_LOW_ENERGY_UPDATE: - watch_clear_indicator(WATCH_INDICATOR_SIGNAL); - watch_display_string("BA SLEEP ", 0); + // clear seconds area and start tick animation if necessary + if (!watch_tick_animation_is_running()) { + watch_display_string(" ", 8); + watch_start_tick_animation(1000); + } + // update once an hour + if (date_time.unit.minute == 0) { + watch_clear_indicator(WATCH_INDICATOR_SIGNAL); + _voltage_face_update_display(); + watch_display_string(" ", 8); + } break; default: movement_default_loop_handler(event, settings); diff --git a/movement/watch_faces/sensor/thermistor_readout_face.c b/movement/watch_faces/sensor/thermistor_readout_face.c index 8a78f73a..2b8ea18d 100644 --- a/movement/watch_faces/sensor/thermistor_readout_face.c +++ b/movement/watch_faces/sensor/thermistor_readout_face.c @@ -77,7 +77,17 @@ bool thermistor_readout_face_loop(movement_event_t event, movement_settings_t *s } break; case EVENT_LOW_ENERGY_UPDATE: - watch_display_string("TE SLEEP ", 0); + // clear seconds area and start tick animation if necessary + if (!watch_tick_animation_is_running()) { + watch_display_string(" ", 8); + watch_start_tick_animation(1000); + } + // update every 5 minutes + if (date_time.unit.minute % 5 == 0) { + watch_clear_indicator(WATCH_INDICATOR_SIGNAL); + _thermistor_readout_face_update_display(settings->bit.use_imperial_units); + watch_display_string(" ", 8); + } break; default: movement_default_loop_handler(event, settings); diff --git a/movement/watch_faces/settings/set_time_face.c b/movement/watch_faces/settings/set_time_face.c index 61913430..84a4d18c 100644 --- a/movement/watch_faces/settings/set_time_face.c +++ b/movement/watch_faces/settings/set_time_face.c @@ -46,8 +46,7 @@ static void _handle_alarm_button(movement_settings_t *settings, watch_date_time date_time.unit.second = 0; break; case 3: // year - // only allow 2021-2030. fix this sometime next decade - date_time.unit.year = ((date_time.unit.year % 10) + 1); + date_time.unit.year = ((date_time.unit.year % 60) + 1); break; case 4: // month date_time.unit.month = (date_time.unit.month % 12) + 1; |