]> git.earman.xyz Git - sensor-watch.git/commitdiff
movement: add time zone conversion in sunrise/sunset face
authorJoey Castillo <joeycastillo@utexas.edu>
Fri, 21 Jan 2022 05:11:28 +0000 (00:11 -0500)
committerJoey Castillo <joeycastillo@utexas.edu>
Fri, 21 Jan 2022 05:11:43 +0000 (00:11 -0500)
movement/movement_config.h
movement/watch_faces/complications/sunrise_sunset_face.c
watch-library/watch/watch_utility.c
watch-library/watch/watch_utility.h

index 7a807980a4f9ce553b131fa0d5d49d79e85c7b5b..ff0553496b6c85e6adaaf65e32d54b74d3baddad 100644 (file)
@@ -46,6 +46,7 @@
 
 const watch_face_t watch_faces[] = {
     simple_clock_face,
+    sunrise_sunset_face,
     preferences_face,
     set_time_face,
 };
index ceca3515a49526d646808a4442d289055408fe3d..7b52eac0b68494d3a4dbb9379da37e4d6a5a896f 100644 (file)
 #include "watch_utility.h"
 #include "sunriset.h"
 
-static void _sunrise_sunset_face_update() {
+static void _sunrise_sunset_face_update(movement_settings_t *settings) {
     char buf[14];
     double rise, set, minutes;
-    // TODO: allow user to set location, using London for now.
-    double lat = 51.509865;
-    double lon = -0.118092;
+    // TODO: allow user to set location, using New York for now.
+    double lat = 40.730610;
+    double lon = -73.935242;
+
     // TODO: account for time zone, currently only operates in GMT.
     watch_date_time date_time = watch_rtc_get_date_time(); // the current date / time
     watch_date_time scratch_time; // scratchpad, contains different values at different times
@@ -67,6 +68,7 @@ static void _sunrise_sunset_face_update() {
 
         if (date_time.reg < scratch_time.reg) {
             // display today's sunrise, it hasn't happened yet
+            scratch_time = watch_utility_date_time_convert_zone(scratch_time, 0, movement_timezone_offsets[settings->bit.time_zone] * 60);
             sprintf(buf, "rI%2d%2d%02d%02d", scratch_time.unit.day, scratch_time.unit.hour, scratch_time.unit.minute, scratch_time.unit.second);
             watch_display_string(buf, 0);
             return;
@@ -79,6 +81,7 @@ static void _sunrise_sunset_face_update() {
 
         if (date_time.reg < scratch_time.reg) {
             // display today's sunset, it hasn't happened yet
+            scratch_time = watch_utility_date_time_convert_zone(scratch_time, 0, movement_timezone_offsets[settings->bit.time_zone] * 60);
             sprintf(buf, "SE%2d%02d%02d%02d", scratch_time.unit.day, scratch_time.unit.hour, scratch_time.unit.minute, scratch_time.unit.second);
             watch_display_string(buf, 0);
             return;
@@ -114,7 +117,7 @@ bool sunrise_sunset_face_loop(movement_event_t event, movement_settings_t *setti
 
     switch (event.event_type) {
         case EVENT_ACTIVATE:
-            _sunrise_sunset_face_update();
+            _sunrise_sunset_face_update(settings);
             break;
         case EVENT_LOW_ENERGY_UPDATE:
         case EVENT_TICK:
index 02dbfb2534556bcd1fb6131e855b09405cea8f92..835076d939cd1fdabf178ca1ed7fe1f26820a821 100644 (file)
@@ -146,6 +146,11 @@ watch_date_time watch_utility_date_time_from_unix_time(uint32_t timestamp, uint3
     return retval;
 }
 
+watch_date_time watch_utility_date_time_convert_zone(watch_date_time date_time, uint32_t origin_utc_offset, uint32_t destination_utc_offset) {
+    uint32_t timestamp = watch_utility_date_time_to_unix_time(date_time, origin_utc_offset);
+    return watch_utility_date_time_from_unix_time(timestamp, destination_utc_offset);
+}
+
 float watch_utility_thermistor_temperature(uint16_t value, bool highside, float b_coefficient, float nominal_temperature, float nominal_resistance, float series_resistance) {
     float reading = (float)value;
 
index 0a8f2b135184d67304d6562b87b0d7e6b4e9ee94..66af6ed587bd4db4677302d624d23ac5f4b29180 100644 (file)
@@ -70,6 +70,17 @@ uint32_t watch_utility_date_time_to_unix_time(watch_date_time date_time, uint32_
   */
 watch_date_time watch_utility_date_time_from_unix_time(uint32_t timestamp, uint32_t utc_offset);
 
+/** @brief Converts a time from a given time zone to another time zone.
+  * @param date_time The watch_date_time that you wish to convert
+  * @param origin_utc_offset The number of seconds from UTC in the origin time zone
+  * @param destination_utc_offset The number of seconds from UTC in the destination time zone
+  * @return A watch_date_time for the given UNIX timestamp and UTC offset, or if outside the range that
+  *         watch_date_time can represent, a watch_date_time with all fields set to 0.
+  * @note Adapted from MIT-licensed code from musl, Copyright © 2005-2014 Rich Felker, et al.:
+  *       https://github.com/esmil/musl/blob/1cc81f5cb0df2b66a795ff0c26d7bbc4d16e13c6/src/time/__secs_to_tm.c
+  */
+watch_date_time watch_utility_date_time_convert_zone(watch_date_time date_time, uint32_t origin_utc_offset, uint32_t destination_utc_offset);
+
 /** @brief Returns a temperature in degrees Celsius for a given thermistor voltage divider circuit.
   * @param value The raw analog reading from the thermistor pin (0-65535)
   * @param highside True if the thermistor is connected to VCC and the series resistor is connected