]> git.earman.xyz Git - sensor-watch.git/commitdiff
Optimize finetune and nanosec faces to work with rtc-counter32
authorAlessandro Genova <ales.genova@gmail.com>
Sun, 3 Aug 2025 03:06:45 +0000 (23:06 -0400)
committerAlessandro Genova <ales.genova@gmail.com>
Sat, 3 Jan 2026 01:02:36 +0000 (20:02 -0500)
movement.c
movement.h
watch-faces/settings/finetune_face.c
watch-faces/settings/finetune_face.h
watch-faces/settings/nanosec_face.c

index 186aaeb547ee2ba185a762a405d4f22a52d06f13..70bd63b7ddba74d9b63f3e942a033c6b49a1d8d5 100644 (file)
@@ -535,8 +535,22 @@ watch_date_time_t movement_get_local_date_time(void) {
     return watch_utility_date_time_from_unix_time(timestamp, movement_get_current_timezone_offset());
 }
 
+uint32_t movement_get_utc_timestamp(void) {
+    return watch_rtc_get_unix_time();
+}
+
 void movement_set_utc_date_time(watch_date_time_t date_time) {
-    watch_rtc_set_date_time(date_time);
+    movement_set_utc_timestamp(watch_utility_date_time_to_unix_time(date_time, 0));
+}
+
+void movement_set_local_date_time(watch_date_time_t date_time) {
+    int32_t current_offset = movement_get_current_timezone_offset();
+    watch_date_time_t utc_date_time = watch_utility_date_time_convert_zone(date_time, current_offset, 0);
+    movement_set_utc_date_time(utc_date_time);
+}
+
+void movement_set_utc_timestamp(uint32_t timestamp) {
+    watch_rtc_set_unix_time(timestamp);
 
     // If the time was changed, the top of the minute alarm needs to be reset accordingly
     _movement_set_top_of_minute_alarm();
@@ -547,11 +561,6 @@ void movement_set_utc_date_time(watch_date_time_t date_time) {
     _movement_update_dst_offset_cache();
 }
 
-void movement_set_local_date_time(watch_date_time_t date_time) {
-    int32_t current_offset = movement_get_current_timezone_offset();
-    watch_date_time_t utc_date_time = watch_utility_date_time_convert_zone(date_time, current_offset, 0);
-    movement_set_utc_date_time(utc_date_time);
-}
 
 bool movement_button_should_sound(void) {
     return movement_state.settings.bit.button_should_sound;
index 0288c9c91d947c4aac30c70f094b3a1a5979c061..c1ac756f10c116d32641ebceebfb33d5583d7ef9 100644 (file)
@@ -331,9 +331,11 @@ void movement_set_timezone_index(uint8_t value);
 watch_date_time_t movement_get_utc_date_time(void);
 watch_date_time_t movement_get_local_date_time(void);
 watch_date_time_t movement_get_date_time_in_zone(uint8_t zone_index);
+uint32_t movement_get_utc_timestamp(void);
 
 void movement_set_utc_date_time(watch_date_time_t date_time);
 void movement_set_local_date_time(watch_date_time_t date_time);
+void movement_set_utc_timestamp(uint32_t timestamp);
 
 bool movement_button_should_sound(void);
 void movement_set_button_should_sound(bool value);
index 4c77c4ea550261d7e8582f0ae5736e7df3a956a8..fe75d8fa4ecabd9cf1eb431104005a7770c0bf05 100644 (file)
@@ -27,7 +27,6 @@
 #include <math.h>
 #include "finetune_face.h"
 #include "nanosec_face.h"
-#include "watch_utility.h"
 #include "delay.h"
 
 extern nanosec_state_t nanosec_state;
@@ -51,7 +50,7 @@ void finetune_face_activate(void *context) {
 }
 
 static float finetune_get_hours_passed(void) {
-    uint32_t current_time = watch_utility_date_time_to_unix_time(watch_rtc_get_date_time(), 0);
+    uint32_t current_time = movement_get_utc_timestamp();
     return (current_time - nanosec_state.last_correction_time) / 3600.0f;
 }
 
@@ -64,7 +63,7 @@ static void finetune_update_display(void) {
 
     if (finetune_page == 0) {
         watch_display_text_with_fallback(WATCH_POSITION_TOP_LEFT, "FTU", "FT");
-        watch_date_time_t date_time = watch_rtc_get_date_time();
+        watch_date_time_t date_time = movement_get_utc_date_time();
         sprintf(buf, "%04d%02d", abs(total_adjustment), date_time.unit.second);
         watch_display_text(WATCH_POSITION_BOTTOM, buf);
 
@@ -106,17 +105,9 @@ static void finetune_adjust_subseconds(int delta) {
     watch_rtc_enable(false);
     delay_ms(delta);
     if (delta > 500) {
-        watch_date_time_t date_time = movement_get_utc_date_time();
-        date_time.unit.second = (date_time.unit.second + 1) % 60;
-        if (date_time.unit.second == 0) { // Overflow
-            date_time.unit.minute = (date_time.unit.minute + 1) % 60;
-            if (date_time.unit.minute == 0) { // Overflow
-                date_time.unit.hour = (date_time.unit.hour + 1) % 24;
-                if (date_time.unit.hour == 0) // Overflow
-                    date_time.unit.day++;
-            }
-        }
-        movement_set_utc_date_time(date_time);
+        uint32_t timestamp = movement_get_utc_timestamp();
+        timestamp += 1;
+        movement_set_utc_timestamp(timestamp);
     }
     watch_rtc_enable(true);
 }
@@ -126,7 +117,7 @@ static void finetune_update_correction_time(void) {
     nanosec_state.freq_correction += roundf(nanosec_get_aging() * 100);
 
     // Remember when we last corrected time
-    nanosec_state.last_correction_time = watch_utility_date_time_to_unix_time(watch_rtc_get_date_time(), 0);
+    nanosec_state.last_correction_time = movement_get_utc_timestamp();
     nanosec_save();
     movement_move_to_face(0); // Go to main face after saving settings
 }
@@ -146,7 +137,7 @@ bool finetune_face_loop(movement_event_t event, void *context) {
             // We flash green LED once per minute to measure clock error, when we are not on first screen
             if (finetune_page!=0) {
                 watch_date_time_t date_time;
-                date_time = watch_rtc_get_date_time();
+                date_time = movement_get_utc_date_time();
                 if (date_time.unit.second == 0) {
                     watch_set_led_green();
                     #ifndef __EMSCRIPTEN__
index 905df760e5d9ec4b821d7dc750cd292a8e0a0053..76ae7e2353e649380dfdd66ccaf7bc01d809bafe 100644 (file)
  * worry about aging only on second/third years of watch calibration (if you
  * are really looking at less than 10 seconds per year of error).
  *
- * Warning, do not use at the first second of a month, as you might stay at
- * the same month and it will surprise you. Just wait 1 second...We are not
- * fully replicating RTC timer behavior when RTC is off.
- * Simulating months and years is... too much complexity.
- *
  * For full usage instructions, please refer to the wiki:
  *  https://www.sensorwatch.net/docs/watchfaces/nanosec/
  */
index d4d7b9f525af1a01bc95c479b406e84f4678440c..f49b22adc1d20db1e0e6bc78d65b25a6f06b204d 100644 (file)
@@ -27,7 +27,6 @@
 #include <math.h>
 #include "nanosec_face.h"
 #include "filesystem.h"
-#include "watch_utility.h"
 
 int16_t freq_correction_residual = 0; // Dithering 0.1ppm correction, does not need to be configured.
 int16_t freq_correction_previous = -30000;
@@ -44,8 +43,7 @@ const float voltage_coefficient = 0.241666667 * dithering; // 10 * ppm/V. Nomina
 static void nanosec_init_profile(void) {
     nanosec_changed = true;
     nanosec_state.correction_cadence = 10;
-    watch_date_time_t date_time = watch_rtc_get_date_time();
-    nanosec_state.last_correction_time = watch_utility_date_time_to_unix_time(date_time, 0);
+    nanosec_state.last_correction_time = movement_get_utc_timestamp();
 
     // init data after changing profile - do that once per profile selection
     switch (nanosec_state.correction_profile) {
@@ -265,8 +263,8 @@ static void nanosec_next_edit_screen(void) {
 
 float nanosec_get_aging() // Returns aging correction in ppm
 {
-    watch_date_time_t date_time = watch_rtc_get_date_time();
-    float years = (watch_utility_date_time_to_unix_time(date_time, 0) - nanosec_state.last_correction_time) / 31536000.0f; // Years passed since finetune
+    uint32_t timestamp = movement_get_utc_timestamp();
+    float years = (timestamp - nanosec_state.last_correction_time) / 31536000.0f; // Years passed since finetune
     return years*nanosec_state.aging_ppm_pa/100.0f;
 }
 
@@ -377,7 +375,7 @@ movement_watch_face_advisory_t nanosec_face_advise(void *context) {
 
     // No need for background correction if we are on profile 0 - static hardware correction.
     if (nanosec_state.correction_profile != 0) {
-        watch_date_time_t date_time = watch_rtc_get_date_time();
+        watch_date_time_t date_time = movement_get_utc_date_time();
         retval.wants_background_task = date_time.unit.minute % nanosec_state.correction_cadence == 0;
     }