diff options
author | Joey Castillo <joeycastillo@utexas.edu> | 2022-01-21 00:11:28 -0500 |
---|---|---|
committer | Joey Castillo <joeycastillo@utexas.edu> | 2022-01-21 00:11:43 -0500 |
commit | 68f17c89705ac3b4e6c685807d8e799684e2b136 (patch) | |
tree | 62b48418bb952884edf97dcaee11831648de9bc8 | |
parent | 3efdcd78a1fd470ca47fdd30c3251170d2f4f03b (diff) | |
download | Sensor-Watch-68f17c89705ac3b4e6c685807d8e799684e2b136.tar.gz Sensor-Watch-68f17c89705ac3b4e6c685807d8e799684e2b136.tar.bz2 Sensor-Watch-68f17c89705ac3b4e6c685807d8e799684e2b136.zip |
movement: add time zone conversion in sunrise/sunset face
-rw-r--r-- | movement/movement_config.h | 1 | ||||
-rw-r--r-- | movement/watch_faces/complications/sunrise_sunset_face.c | 13 | ||||
-rw-r--r-- | watch-library/watch/watch_utility.c | 5 | ||||
-rw-r--r-- | watch-library/watch/watch_utility.h | 11 |
4 files changed, 25 insertions, 5 deletions
diff --git a/movement/movement_config.h b/movement/movement_config.h index 7a807980..ff055349 100644 --- a/movement/movement_config.h +++ b/movement/movement_config.h @@ -46,6 +46,7 @@ const watch_face_t watch_faces[] = { simple_clock_face, + sunrise_sunset_face, preferences_face, set_time_face, }; diff --git a/movement/watch_faces/complications/sunrise_sunset_face.c b/movement/watch_faces/complications/sunrise_sunset_face.c index ceca3515..7b52eac0 100644 --- a/movement/watch_faces/complications/sunrise_sunset_face.c +++ b/movement/watch_faces/complications/sunrise_sunset_face.c @@ -33,12 +33,13 @@ #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: diff --git a/watch-library/watch/watch_utility.c b/watch-library/watch/watch_utility.c index 02dbfb25..835076d9 100644 --- a/watch-library/watch/watch_utility.c +++ b/watch-library/watch/watch_utility.c @@ -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; diff --git a/watch-library/watch/watch_utility.h b/watch-library/watch/watch_utility.h index 0a8f2b13..66af6ed5 100644 --- a/watch-library/watch/watch_utility.h +++ b/watch-library/watch/watch_utility.h @@ -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 |