]> git.earman.xyz Git - sensor-watch.git/commitdiff
Add hours support to the countdown face
authorJeremy O'Brien <neutral@fastmail.com>
Wed, 2 Nov 2022 16:22:34 +0000 (12:22 -0400)
committerJeremy O'Brien <neutral@fastmail.com>
Wed, 2 Nov 2022 16:22:34 +0000 (12:22 -0400)
movement/watch_faces/complication/countdown_face.c
movement/watch_faces/complication/countdown_face.h

index 194006b1e4ee7600b69724765749ed2303e641f2..6969a55f25421d6be46918afbdc73b8bb5c4f8a9 100644 (file)
@@ -31,7 +31,7 @@
 #include "watch_utility.h"
 
 
-#define CD_SELECTIONS 2
+#define CD_SELECTIONS 3
 #define DEFAULT_MINUTES 3
 
 
@@ -44,7 +44,7 @@ static void start(countdown_state_t *state, movement_settings_t *settings) {
 
     state->mode = cd_running;
     state->now_ts = watch_utility_date_time_to_unix_time(now, get_tz_offset(settings));
-    state->target_ts = watch_utility_offset_timestamp(state->now_ts, 0, state->minutes, state->seconds);
+    state->target_ts = watch_utility_offset_timestamp(state->now_ts, state->hours, state->minutes, state->seconds);
     watch_date_time target_dt = watch_utility_date_time_from_unix_time(state->target_ts, get_tz_offset(settings));
     movement_schedule_background_task(target_dt);
     watch_set_indicator(WATCH_INDICATOR_BELL);
@@ -55,28 +55,33 @@ static void draw(countdown_state_t *state, uint8_t subsecond) {
 
     uint32_t delta;
     div_t result;
-    uint8_t min, sec;
+    uint8_t hour, min, sec;
 
     switch (state->mode) {
         case cd_running:
             delta = state->target_ts - state->now_ts;
             result = div(delta, 60);
-            min = result.quot;
             sec = result.rem;
+            result = div(result.quot, 60);
+            hour = result.quot;
+            min = result.rem;
 
-            sprintf(buf, "CD    %2d%02d", min, sec);
+            sprintf(buf, "CD  %2d%02d%02d", hour, min, sec);
             break;
         case cd_waiting:
-            sprintf(buf, "CD    %2d%02d", state->minutes, state->seconds);
+            sprintf(buf, "CD  %2d%02d%02d", state->hours, state->minutes, state->seconds);
             break;
         case cd_setting:
-            sprintf(buf, "CD    %2d%02d", state->minutes, state->seconds);
+            sprintf(buf, "CD  %2d%02d%02d", state->hours, state->minutes, state->seconds);
             if (subsecond % 2) {
                 switch(state->selection) {
                     case 0:
-                        buf[6] = buf[7] = ' ';
+                        buf[4] = buf[5] = ' ';
                         break;
                     case 1:
+                        buf[6] = buf[7] = ' ';
+                        break;
+                    case 2:
                         buf[8] = buf[9] = ' ';
                         break;
                     default:
@@ -102,9 +107,12 @@ static void ring(countdown_state_t *state) {
 static void settings_increment(countdown_state_t *state) {
     switch(state->selection) {
         case 0:
-            state->minutes = (state->minutes + 1) % 100;
+            state->hours = (state->hours + 1) % 24;
             break;
         case 1:
+            state->minutes = (state->minutes + 1) % 60;
+            break;
+        case 2:
             state->seconds = (state->seconds + 1) % 60;
             break;
         default:
@@ -179,7 +187,7 @@ bool countdown_face_loop(movement_event_t event, movement_settings_t *settings,
                     reset(state);
                     break;
                 case cd_waiting:
-                    if (!(state->minutes == 0 && state->seconds == 0)) {
+                    if (!(state->hours == 0 && state->minutes == 0 && state->seconds == 0)) {
                         // Only start the timer if we have a valid time.
                         start(state, settings);
                     }
@@ -195,6 +203,7 @@ bool countdown_face_loop(movement_event_t event, movement_settings_t *settings,
             break;
         case EVENT_ALARM_LONG_PRESS:
             if (state->mode == cd_setting) {
+                    state->hours = 0;
                     state->minutes = 0;
                     state->seconds = 0;
                     draw(state, event.subsecond);
index 657c63772abe9fdd591e9d82d2dcd4f4601b511c..f6c845d694fa0eb907f3c90882c08c814da82a07 100644 (file)
 /*
 A countdown/timer face
 
-Max countdown is 99 minutes and 59 seconds since we have to prevent the watch
-from going to deep sleep using movement_schedule_background_task
+Max countdown is 23 hours, 59 minutes and 59 seconds.
+
+Note: we have to prevent the watch from going to deep sleep using
+movement_schedule_background_task() while the timer is running.
 */
 
 
@@ -46,6 +48,7 @@ typedef enum {
 typedef struct {
     uint32_t target_ts;
     uint32_t now_ts;
+    uint8_t hours;
     uint8_t minutes;
     uint8_t seconds;
     uint8_t selection;