summaryrefslogtreecommitdiffstats
path: root/movement
diff options
context:
space:
mode:
Diffstat (limited to 'movement')
-rw-r--r--movement/alt_fw/alt_time.h2
-rw-r--r--movement/alt_fw/backer.h2
-rw-r--r--movement/alt_fw/deep_space_now.h2
-rw-r--r--movement/alt_fw/focus.h2
-rw-r--r--movement/alt_fw/the_athlete.h2
-rw-r--r--movement/alt_fw/the_backpacker.h2
-rw-r--r--movement/alt_fw/the_stargazer.h2
-rw-r--r--movement/alt_fw/timers.h2
-rw-r--r--movement/make/Makefile1
-rwxr-xr-xmovement/make/make_alternate_fw.sh4
-rw-r--r--movement/movement.c26
-rw-r--r--movement/movement.h1
-rw-r--r--movement/movement_config.h14
-rw-r--r--movement/movement_faces.h1
-rw-r--r--movement/watch_faces/clock/repetition_minute_face.c14
-rw-r--r--movement/watch_faces/clock/simple_clock_bin_led_face.c12
-rw-r--r--movement/watch_faces/clock/simple_clock_face.c16
-rw-r--r--movement/watch_faces/clock/weeknumber_clock_face.c12
-rw-r--r--movement/watch_faces/complication/timer_face.c4
-rw-r--r--movement/watch_faces/complication/tuning_tones_face.c140
-rw-r--r--movement/watch_faces/complication/tuning_tones_face.h57
-rw-r--r--movement/watch_faces/demo/voltage_face.c13
-rw-r--r--movement/watch_faces/sensor/thermistor_readout_face.c12
-rw-r--r--movement/watch_faces/settings/set_time_face.c3
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;