]> git.earman.xyz Git - sensor-watch.git/commitdiff
DST roll is now a global variable in watch_rtc
authorDavid Volovskiy <devolov@gmail.com>
Sat, 3 Aug 2024 13:33:49 +0000 (09:33 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Sat, 3 Aug 2024 14:07:57 +0000 (10:07 -0400)
12 files changed:
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
movement/watch_faces/settings/set_time_face.c
movement/watch_faces/settings/set_time_hackwatch_face.c
watch-library/hardware/watch/watch_rtc.c
watch-library/shared/watch/watch_rtc.h
watch-library/simulator/watch/watch_rtc.c

index 4afe2739e67065ee5e6c3370a81353724b5637a8..eabc29c244ffc728b5388e52c44457f43b2c8605 100644 (file)
@@ -430,6 +430,26 @@ uint8_t movement_claim_backup_register(void) {
     return movement_state.next_available_backup_register++;
 }
 
+uint8_t check_and_act_on_daylight_savings(watch_date_time date_time) {
+    if (movement_state.settings.bit.dst_active) return date_time.unit.hour;
+    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) {
+        set_dst_skip_rolling_back();
+        date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
+        watch_rtc_set_date_time(date_time);
+    }
+    else if (dst_result == DST_STARTING) {
+        date_time.unit.hour = (date_time.unit.hour + 1) % 24;
+        watch_rtc_set_date_time(date_time);  
+    }
+    return date_time.unit.hour;
+}
+
 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 d0595fbc07490beca1667dd523afbd51784f0bd8..6dd38ba7f32d87abb8ac181099ac1befce9d9585 100644 (file)
@@ -313,6 +313,7 @@ void movement_play_alarm(void);
 void movement_play_alarm_beeps(uint8_t rounds, BuzzerNote alarm_note);
 
 uint8_t movement_claim_backup_register(void);
+uint8_t check_and_act_on_daylight_savings(watch_date_time date_time);  // Returns the currently set hour
 int16_t get_timezone_offset(uint8_t timezone_idx, watch_date_time date_time);
 
 #endif // MOVEMENT_H_
index f9ec58a90de5781938d54d9fc466c4cdc251d146..af601ce77167f2df87c3308df3d08af50ece2de0 100644 (file)
@@ -280,31 +280,16 @@ void clock_face_resign(movement_settings_t *settings, void *context) {
     (void) context;
 }
 
-static void check_and_act_on_daylight_savings(movement_settings_t *settings, watch_date_time date_time) {
-    if (!settings ->bit.dst_active) return;
-    uint8_t dst_result = get_dst_status(date_time);
-
-    if (settings ->bit.dst_skip_rolling_back && dst_result == DST_ENDED) {
-        settings ->bit.dst_skip_rolling_back = false;
-        return;
-    }
-    else if (dst_result == DST_ENDING && !settings ->bit.dst_skip_rolling_back) {
-        settings ->bit.dst_skip_rolling_back = true;
-        date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
-        watch_rtc_set_date_time(date_time);
-        return;
-    }
-    else if (dst_result == DST_STARTING) {
-        date_time.unit.hour = (date_time.unit.hour + 1) % 24;
-        watch_rtc_set_date_time(date_time);
-        return;    
-    }
-}
-
 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(settings, date_time);
+    uint8_t hour_dst = check_and_act_on_daylight_savings(date_time);
+    if(hour_dst != date_time.unit.hour) {
+        char buf[3 + 1];
+        sprintf(buf, "%2d", hour_dst);
+        watch_display_string(buf, 4);
+    }
     if (!state->time_signal_enabled) return false;
 
     return date_time.unit.minute == 0;
index 2cedc3075b5d3dae210a71acdd16769b92ace4e8..ab0e6de08ff0b60495eed631b9ea728603408d30 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;
-    if (!state->signal_enabled) return false;
-
     watch_date_time date_time = watch_rtc_get_date_time();
+    check_and_act_on_daylight_savings(date_time);
+    if (!state->signal_enabled) return false;
 
     return date_time.unit.minute == 0;
 }
index e9e5e3197507fd99296498205f063da1c8249482..1afc4ce0faa68356408291aa1d7770b210d765a8 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;
-    if (!state->signal_enabled) return false;
-
     watch_date_time date_time = watch_rtc_get_date_time();
+    check_and_act_on_daylight_savings(date_time);
+    if (!state->signal_enabled) return false;
 
     return date_time.unit.minute == 0;
 }
index cf39c1886bb8aa8908a2a47b91a494f9a967e2bf..1762cfa52d02d67a9f71e4d43d454eaf4bc2dccb 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;
-    if (!state->signal_enabled) return false;
-
     watch_date_time date_time = watch_rtc_get_date_time();
+    check_and_act_on_daylight_savings(date_time);
+    if (!state->signal_enabled) return false;
 
     return date_time.unit.minute == 0;
 }
index a7e08a9da3fd5c81f09aeade84c104045118d911..3866e2c26d57afaaf6e53306f1f710dbe31f3344 100644 (file)
@@ -150,31 +150,15 @@ void simple_clock_face_resign(movement_settings_t *settings, void *context) {
     (void) context;
 }
 
-static void check_and_act_on_daylight_savings(movement_settings_t *settings, watch_date_time date_time) {
-    if (!settings ->bit.dst_active) return;
-    uint8_t dst_result = get_dst_status(date_time);
-
-    if (settings ->bit.dst_skip_rolling_back && (dst_result == DST_ENDED)) {
-        settings ->bit.dst_skip_rolling_back = false;
-        return;
-    }
-    else if (dst_result == DST_ENDING && !settings ->bit.dst_skip_rolling_back) {
-        settings ->bit.dst_skip_rolling_back = true;
-        date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
-        watch_rtc_set_date_time(date_time);
-        return;
-    }
-    else if (dst_result == DST_STARTING) {
-        date_time.unit.hour = (date_time.unit.hour + 1) % 24;
-        watch_rtc_set_date_time(date_time);
-        return;    
-    }
-}
-
 bool simple_clock_face_wants_background_task(movement_settings_t *settings, void *context) {
     simple_clock_state_t *state = (simple_clock_state_t *)context;
-    date_time = watch_rtc_get_date_time();
-    check_and_act_on_daylight_savings(settings, date_time);
+    watch_date_time date_time = watch_rtc_get_date_time();
+    uint8_t hour_dst = check_and_act_on_daylight_savings(date_time);
+    if(hour_dst != date_time.unit.hour) {
+        char buf[3 + 1];
+        sprintf(buf, "%2d", hour_dst);
+        watch_display_string(buf, 4);
+    }
     if (!state->signal_enabled) return false;
 
     return date_time.unit.minute == 0;
index 3f7d0c76a1474814a4c88f0d1ea5cc7b28b8042d..b16cb6d17b24c369142d3be18f2e392492fdbc74 100644 (file)
@@ -72,7 +72,6 @@ static void _handle_alarm_button(movement_settings_t *settings, watch_date_time
             break;
     }
     watch_rtc_set_date_time(date_time);
-    settings->bit.dst_skip_rolling_back = false;
 }
 
 static void _abort_quick_ticks() {
index be293abae543506c1e41a7af259314d7fbd9e177..44ae04e296384fbe4d7c5ab54dc640dd21be37d7 100644 (file)
@@ -94,7 +94,6 @@ bool set_time_hackwatch_face_loop(movement_event_t event, movement_settings_t *s
                 }
                 date_time_settings.unit.second = 0;
                 watch_rtc_set_date_time(date_time_settings);
-                settings->bit.dst_skip_rolling_back = false;
             }
             break;
         case EVENT_ALARM_BUTTON_DOWN:
@@ -137,7 +136,6 @@ bool set_time_hackwatch_face_loop(movement_event_t event, movement_settings_t *s
             }
             if (current_page != 2) { // Do not set time when we are at seconds, it was already set previously
                 watch_rtc_set_date_time(date_time_settings);
-                settings->bit.dst_skip_rolling_back = false;
             }
             break;
         
@@ -183,7 +181,6 @@ bool set_time_hackwatch_face_loop(movement_event_t event, movement_settings_t *s
             }
             if (current_page != 2) { // Do not set time when we are at seconds, it was already set previously
                 watch_rtc_set_date_time(date_time_settings);
-                settings->bit.dst_skip_rolling_back = false;
             }
             //TODO: Do not update whole RTC, just what we are changing
             break;
index 93cb9f1cfb6e30c9d67e66d26a61eda3d46afc04..67ecb5315dfaeb9b589183118d8c207834ecbd1a 100644 (file)
@@ -30,6 +30,19 @@ ext_irq_cb_t btn_alarm_callback;
 ext_irq_cb_t a2_callback;
 ext_irq_cb_t a4_callback;
 
+static bool dst_skip_rolling_back;
+bool get_dst_skip_rolling_back(void) {
+    return dst_skip_rolling_back;
+}
+
+void set_dst_skip_rolling_back(void) {
+    dst_skip_rolling_back = true;
+}
+
+void clear_dst_skip_rolling_back(void) {
+    dst_skip_rolling_back = false;
+}
+
 bool _watch_rtc_is_enabled(void) {
     return RTC->MODE2.CTRLA.bit.ENABLE;
 }
@@ -60,6 +73,7 @@ void watch_rtc_set_date_time(watch_date_time date_time) {
     _sync_rtc(); // Double sync as without it at high Hz faces setting time is unrealiable (specifically, set_time_hackwatch)
     RTC->MODE2.CLOCK.reg = date_time.reg;
     _sync_rtc();
+    clear_dst_skip_rolling_back();
 }
 
 watch_date_time watch_rtc_get_date_time(void) {
index 3e63bb55893f856bed19751094bd88ad8d0bc9dd..a9134eb281b58dc6f55700622fff56f09ebda75e 100644 (file)
@@ -157,5 +157,11 @@ void watch_rtc_enable(bool en);
   */
 void watch_rtc_freqcorr_write(int16_t value, int16_t sign);
 
+/** @brief Returns if we're currently at a point where the we rolled back for DST and need to ignore the next DST segment
+  */
+bool get_dst_skip_rolling_back(void);
+void set_dst_skip_rolling_back(void);
+void clear_dst_skip_rolling_back(void);
+
 /// @}
 #endif
index 2bb6074c714ceda61f6c6e94fa01f77cbff6d194..9fe9e2965cd5cd5efa7e71683688473f275f11b1 100644 (file)
@@ -39,6 +39,19 @@ ext_irq_cb_t btn_alarm_callback;
 ext_irq_cb_t a2_callback;
 ext_irq_cb_t a4_callback;
 
+static bool dst_skip_rolling_back;
+bool get_dst_skip_rolling_back(void) {
+    return dst_skip_rolling_back;
+}
+
+void set_dst_skip_rolling_back(void) {
+    dst_skip_rolling_back = true;
+}
+
+void clear_dst_skip_rolling_back(void) {
+    dst_skip_rolling_back = false;
+}
+
 bool _watch_rtc_is_enabled(void) {
     return true;
 }
@@ -57,6 +70,7 @@ void watch_rtc_set_date_time(watch_date_time date_time) {
         const date = new Date(year, month - 1, day, hour, minute, second);
         return date - Date.now();
     }, date_time.reg);
+    clear_dst_skip_rolling_back();
 }
 
 watch_date_time watch_rtc_get_date_time(void) {