]> git.earman.xyz Git - sensor-watch.git/commitdiff
Add stopwatch face to movement
authorWesley Ellis <tahnok@gmail.com>
Thu, 4 Nov 2021 01:10:10 +0000 (21:10 -0400)
committerWesley Ellis <tahnok@gmail.com>
Thu, 11 Nov 2021 02:17:24 +0000 (21:17 -0500)
Simple stopwatch that only counts seconds (not subseconds), minutes
and yes, even hours

movement/make/Makefile
movement/movement_config.h
movement/watch_faces/complications/stopwatch_face.c [new file with mode: 0644]
movement/watch_faces/complications/stopwatch_face.h [new file with mode: 0644]

index aecd6b5888d5c35d5fa5c8376dd93837ae234464..b595d2dd541157a03758b57108d3601c1336d934 100755 (executable)
@@ -36,6 +36,7 @@ SRCS += \
   ../watch_faces/demos/voltage_face.c \
   ../watch_faces/complications/beats_face.c \
   ../watch_faces/complications/day_one_face.c \
+  ../watch_faces/complications/stopwatch_face.c \
 
 # Leave this line at the bottom of the file; it has all the targets for making your project.
 include $(TOP)/rules.mk
index 70bedc22c539864dbeffe8e4645a3101e9914878..fa5ddf1882af56afbf530a806f052287d9a87dca 100644 (file)
@@ -11,6 +11,7 @@
 #include "beats_face.h"
 #include "day_one_face.h"
 #include "voltage_face.h"
+#include "stopwatch_face.h"
 
 const watch_face_t watch_faces[] = {
     simple_clock_face,
diff --git a/movement/watch_faces/complications/stopwatch_face.c b/movement/watch_faces/complications/stopwatch_face.c
new file mode 100644 (file)
index 0000000..d1d1ee7
--- /dev/null
@@ -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
diff --git a/movement/watch_faces/complications/stopwatch_face.h b/movement/watch_faces/complications/stopwatch_face.h
new file mode 100644 (file)
index 0000000..537c01c
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef STOPWATCH_FACE_H_
+#define STOPWATCH_FACE_H_
+
+#include "movement.h"
+
+typedef struct {
+    bool running;
+    uint8_t seconds;
+    uint8_t minutes;
+    uint8_t hours;
+} stopwatch_state_t;
+
+void stopwatch_face_setup(movement_settings_t *settings, void ** context_ptr);
+void stopwatch_face_activate(movement_settings_t *settings, void *context);
+bool stopwatch_face_loop(movement_event_t event, movement_settings_t *settings, void *context);
+void stopwatch_face_resign(movement_settings_t *settings, void *context);
+
+static const watch_face_t stopwatch_face = {
+    stopwatch_face_setup,
+    stopwatch_face_activate,
+    stopwatch_face_loop,
+    stopwatch_face_resign,
+    NULL
+};
+
+#endif // STOPWATCH_FACE_H_
\ No newline at end of file