]> git.earman.xyz Git - sensor-watch.git/commitdiff
check_and_act_on_daylight_savings now only occurs in one spot
authorDavid Volovskiy <devolov@gmail.com>
Sun, 4 Aug 2024 14:11:33 +0000 (10:11 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Sun, 4 Aug 2024 14:11:33 +0000 (10:11 -0400)
movement/movement.c
movement/movement.h
movement/watch_faces/clock/clock_face.c
movement/watch_faces/clock/minute_repeater_decimal_face.c
movement/watch_faces/clock/repetition_minute_face.c
movement/watch_faces/clock/simple_clock_bin_led_face.c
movement/watch_faces/clock/simple_clock_face.c

index aead62107701c8faf886a45880854799ea612775..ebd831f4363a990426f3558b04b793d5aed34bc8 100644 (file)
@@ -247,6 +247,31 @@ static inline void _movement_disable_fast_tick_if_possible(void) {
     }
 }
 
+static bool _check_and_act_on_daylight_savings(void) {
+    if (!movement_state.settings.bit.dst_active) return false;
+    watch_date_time date_time = watch_rtc_get_date_time();
+    // No need for all of the unix time calculations for times not at the beginning or end of the hour
+    if (date_time.unit.minute > 1 && date_time.unit.minute < 59) return false; 
+    uint8_t dst_result = get_dst_status(date_time);
+    bool dst_skip_rolling_back = get_dst_skip_rolling_back();
+
+    if (dst_skip_rolling_back && (dst_result == DST_ENDED)) {
+        clear_dst_skip_rolling_back();
+    }
+    else if (dst_result == DST_ENDING && !dst_skip_rolling_back) {
+        date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
+        watch_rtc_set_date_time(date_time);
+        set_dst_skip_rolling_back();
+        return true;
+    }
+    else if (dst_result == DST_STARTING) {
+        date_time.unit.hour = (date_time.unit.hour + 1) % 24;
+        watch_rtc_set_date_time(date_time);  
+        return true;
+    }
+    return false;
+}
+
 static void _movement_handle_background_tasks(void) {
     for(uint8_t i = 0; i < MOVEMENT_NUM_FACES; i++) {
         // For each face, if the watch face wants a background task...
@@ -256,6 +281,7 @@ static void _movement_handle_background_tasks(void) {
             watch_faces[i].loop(background_event, &movement_state.settings, watch_face_contexts[i]);
         }
     }
+    _check_and_act_on_daylight_savings();
     movement_state.needs_background_tasks_handled = false;
 }
 
@@ -430,28 +456,6 @@ uint8_t movement_claim_backup_register(void) {
     return movement_state.next_available_backup_register++;
 }
 
-bool check_and_act_on_daylight_savings(watch_date_time date_time) {
-    if (!movement_state.settings.bit.dst_active) return false;
-    uint8_t dst_result = get_dst_status(date_time);
-    bool dst_skip_rolling_back = get_dst_skip_rolling_back();
-
-    if (dst_skip_rolling_back && (dst_result == DST_ENDED)) {
-        clear_dst_skip_rolling_back();
-    }
-    else if (dst_result == DST_ENDING && !dst_skip_rolling_back) {
-        date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
-        watch_rtc_set_date_time(date_time);
-        set_dst_skip_rolling_back();
-        return true;
-    }
-    else if (dst_result == DST_STARTING) {
-        date_time.unit.hour = (date_time.unit.hour + 1) % 24;
-        watch_rtc_set_date_time(date_time);  
-        return true;
-    }
-    return false;
-}
-
 int16_t get_timezone_offset(uint8_t timezone_idx, watch_date_time date_time) {
     if (!movement_state.settings.bit.dst_active) return movement_timezone_offsets[timezone_idx];
     if (dst_occurring(date_time))
index e75f4e8dc0b35ef36c7c0db5bf93063436722190..d0595fbc07490beca1667dd523afbd51784f0bd8 100644 (file)
@@ -313,7 +313,6 @@ void movement_play_alarm(void);
 void movement_play_alarm_beeps(uint8_t rounds, BuzzerNote alarm_note);
 
 uint8_t movement_claim_backup_register(void);
-bool check_and_act_on_daylight_savings(watch_date_time date_time);  // Returns if the time was changed due to DST
 int16_t get_timezone_offset(uint8_t timezone_idx, watch_date_time date_time);
 
 #endif // MOVEMENT_H_
index e29d587cbf97b6ac1f71e8a7553f2d020d617c43..eab5cd8d3f9f9d9b160d40cb9c5e24f79fc18b35 100644 (file)
@@ -283,9 +283,9 @@ void clock_face_resign(movement_settings_t *settings, void *context) {
 bool clock_face_wants_background_task(movement_settings_t *settings, void *context) {
     (void) settings;
     clock_state_t *state = (clock_state_t *) context;
-    watch_date_time date_time = watch_rtc_get_date_time();
-    check_and_act_on_daylight_savings(date_time);
     if (!state->time_signal_enabled) return false;
 
+    watch_date_time date_time = watch_rtc_get_date_time();
+
     return date_time.unit.minute == 0;
 }
index ab0e6de08ff0b60495eed631b9ea728603408d30..2cedc3075b5d3dae210a71acdd16769b92ace4e8 100644 (file)
@@ -230,9 +230,9 @@ void minute_repeater_decimal_face_resign(movement_settings_t *settings, void *co
 bool minute_repeater_decimal_face_wants_background_task(movement_settings_t *settings, void *context) {
     (void) settings;
     minute_repeater_decimal_state_t *state = (minute_repeater_decimal_state_t *)context;
-    watch_date_time date_time = watch_rtc_get_date_time();
-    check_and_act_on_daylight_savings(date_time);
     if (!state->signal_enabled) return false;
 
+    watch_date_time date_time = watch_rtc_get_date_time();
+
     return date_time.unit.minute == 0;
 }
index 1afc4ce0faa68356408291aa1d7770b210d765a8..e9e5e3197507fd99296498205f063da1c8249482 100644 (file)
@@ -213,9 +213,9 @@ void repetition_minute_face_resign(movement_settings_t *settings, void *context)
 bool repetition_minute_face_wants_background_task(movement_settings_t *settings, void *context) {
     (void) settings;
     repetition_minute_state_t *state = (repetition_minute_state_t *)context;
-    watch_date_time date_time = watch_rtc_get_date_time();
-    check_and_act_on_daylight_savings(date_time);
     if (!state->signal_enabled) return false;
 
+    watch_date_time date_time = watch_rtc_get_date_time();
+
     return date_time.unit.minute == 0;
 }
index 1762cfa52d02d67a9f71e4d43d454eaf4bc2dccb..cf39c1886bb8aa8908a2a47b91a494f9a967e2bf 100644 (file)
@@ -214,9 +214,9 @@ void simple_clock_bin_led_face_resign(movement_settings_t *settings, void *conte
 bool simple_clock_bin_led_face_wants_background_task(movement_settings_t *settings, void *context) {
     (void) settings;
     simple_clock_bin_led_state_t *state = (simple_clock_bin_led_state_t *)context;
-    watch_date_time date_time = watch_rtc_get_date_time();
-    check_and_act_on_daylight_savings(date_time);
     if (!state->signal_enabled) return false;
 
+    watch_date_time date_time = watch_rtc_get_date_time();
+
     return date_time.unit.minute == 0;
 }
index 118dc32dccdfd82000d36b02e49f1d6775c2b3f7..fbc2c4b3ea71aefb8b32615b8c413e1cd2c8a0f5 100644 (file)
@@ -153,9 +153,9 @@ void simple_clock_face_resign(movement_settings_t *settings, void *context) {
 bool simple_clock_face_wants_background_task(movement_settings_t *settings, void *context) {
     (void) settings;
     simple_clock_state_t *state = (simple_clock_state_t *)context;
-    watch_date_time date_time = watch_rtc_get_date_time();
-    check_and_act_on_daylight_savings(date_time);
     if (!state->signal_enabled) return false;
 
+    watch_date_time date_time = watch_rtc_get_date_time();
+
     return date_time.unit.minute == 0;
 }