summaryrefslogtreecommitdiffstats
path: root/movement/watch_faces/complications/stopwatch_face.c
diff options
context:
space:
mode:
Diffstat (limited to 'movement/watch_faces/complications/stopwatch_face.c')
-rw-r--r--movement/watch_faces/complications/stopwatch_face.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/movement/watch_faces/complications/stopwatch_face.c b/movement/watch_faces/complications/stopwatch_face.c
new file mode 100644
index 00000000..d1d1ee73
--- /dev/null
+++ b/movement/watch_faces/complications/stopwatch_face.c
@@ -0,0 +1,76 @@
+#include <stdlib.h>
+#include <string.h>
+#include "stopwatch_face.h"
+#include "watch.h"
+
+void stopwatch_face_setup(movement_settings_t *settings, void ** context_ptr) {
+ (void) settings;
+ if (*context_ptr == NULL) *context_ptr = malloc(sizeof(stopwatch_state_t));
+}
+
+void stopwatch_face_activate(movement_settings_t *settings, void *context) {
+ (void) settings;
+ memset(context, 0, sizeof(stopwatch_state_t));
+}
+
+bool stopwatch_face_loop(movement_event_t event, movement_settings_t *settings, void *context) {
+ (void) settings;
+
+ stopwatch_state_t *stopwatch_state = (stopwatch_state_t *)context;
+ char buf[14];
+
+ switch (event.event_type) {
+ case EVENT_ACTIVATE:
+ watch_set_colon();
+ stopwatch_state->running = false;
+ watch_display_string("st 00000", 0);
+ break;
+ case EVENT_TICK:
+ if (stopwatch_state->running) {
+ stopwatch_state->seconds++;
+ if (stopwatch_state->seconds == 60) {
+ stopwatch_state->minutes++;
+ stopwatch_state->seconds = 0;
+ }
+ if (stopwatch_state->minutes == 60) {
+ stopwatch_state->hours++;
+ stopwatch_state->minutes = 0;
+ }
+ }
+
+ sprintf(buf, "st%2d%02d%02d", stopwatch_state->hours, stopwatch_state->minutes, stopwatch_state->seconds);
+ 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();
+ if (!stopwatch_state->running) {
+ stopwatch_state->seconds = 0;
+ stopwatch_state->minutes = 0;
+ stopwatch_state->hours = 0;
+ watch_display_string("st 00000", 0);
+ }
+ break;
+ case EVENT_ALARM_BUTTON_DOWN:
+ stopwatch_state->running = !stopwatch_state->running;
+ break;
+ case EVENT_TIMEOUT:
+ // explicitly ignore the timeout event so we stay on screen
+ break;
+ case EVENT_LOW_ENERGY_UPDATE:
+ stopwatch_state->running = false;
+ watch_set_indicator(WATCH_INDICATOR_BELL);
+ break;
+ default:
+ break;
+ }
+
+ return true;
+}
+
+void stopwatch_face_resign(movement_settings_t *settings, void *context) {
+ (void) settings;
+ (void) context;
+} \ No newline at end of file