From bae8c6582559e2617ceae22ed34f7d0be8e10a9f Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 2 Aug 2024 07:37:30 -0400 Subject: [PATCH] Made the faces I care about not need to continuously re-find the timezone --- movement/watch_faces/clock/world_clock2_face.c | 9 ++++----- movement/watch_faces/clock/world_clock2_face.h | 1 + movement/watch_faces/clock/world_clock_face.c | 15 +++++---------- movement/watch_faces/clock/world_clock_face.h | 1 + .../watch_faces/complication/moon_phase_face.c | 1 + .../complication/sunrise_sunset_face.c | 6 +++--- .../complication/sunrise_sunset_face.h | 1 + 7 files changed, 16 insertions(+), 18 deletions(-) diff --git a/movement/watch_faces/clock/world_clock2_face.c b/movement/watch_faces/clock/world_clock2_face.c index 6ff806bf..cf37a409 100644 --- a/movement/watch_faces/clock/world_clock2_face.c +++ b/movement/watch_faces/clock/world_clock2_face.c @@ -154,6 +154,7 @@ void world_clock2_face_activate(movement_settings_t *settings, void *context) movement_request_tick_frequency(4); break; } + state->tz = get_timezone_offset(settings->bit.time_zone, watch_rtc_get_date_time()); refresh_face = true; } @@ -165,7 +166,6 @@ static bool mode_display(movement_event_t event, movement_settings_t *settings, uint32_t timestamp; uint32_t previous_date_time; watch_date_time date_time; - int16_t tz; switch (event.event_type) { case EVENT_ACTIVATE: @@ -184,9 +184,8 @@ static bool mode_display(movement_event_t event, movement_settings_t *settings, /* Determine current time at time zone and store date/time */ date_time = watch_rtc_get_date_time(); - tz = get_timezone_offset(settings->bit.time_zone, date_time); - timestamp = watch_utility_date_time_to_unix_time(date_time, tz * 60); - date_time = watch_utility_date_time_from_unix_time(timestamp, tz * 60); + timestamp = watch_utility_date_time_to_unix_time(date_time, state->tz * 60); + date_time = watch_utility_date_time_from_unix_time(timestamp, state->tz * 60); previous_date_time = state->previous_date_time; state->previous_date_time = date_time.reg; @@ -286,7 +285,7 @@ static bool mode_settings(movement_event_t event, movement_settings_t *settings, watch_clear_indicator(WATCH_INDICATOR_PM); refresh_face = false; } - result = div(get_timezone_offset(state->current_zone, watch_rtc_get_date_time()), 60); + result = div(state->tz, 60); hours = result.quot; minutes = result.rem; diff --git a/movement/watch_faces/clock/world_clock2_face.h b/movement/watch_faces/clock/world_clock2_face.h index 0baac212..efc107e1 100644 --- a/movement/watch_faces/clock/world_clock2_face.h +++ b/movement/watch_faces/clock/world_clock2_face.h @@ -104,6 +104,7 @@ typedef struct { world_clock2_mode_t current_mode; uint8_t current_zone; uint32_t previous_date_time; + int16_t tz; } world_clock2_state_t; void world_clock2_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void **context_ptr); diff --git a/movement/watch_faces/clock/world_clock_face.c b/movement/watch_faces/clock/world_clock_face.c index c34db921..e7f393e8 100644 --- a/movement/watch_faces/clock/world_clock_face.c +++ b/movement/watch_faces/clock/world_clock_face.c @@ -54,13 +54,13 @@ void world_clock_face_activate(movement_settings_t *settings, void *context) { static bool world_clock_face_do_display_mode(movement_event_t event, movement_settings_t *settings, world_clock_state_t *state) { char buf[11]; uint8_t pos; - int16_t tz; uint32_t timestamp; uint32_t previous_date_time; watch_date_time date_time; switch (event.event_type) { case EVENT_ACTIVATE: + state->tz = get_timezone_offset(settings->bit.time_zone, watch_rtc_get_date_time()); if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); watch_set_colon(); state->previous_date_time = 0xFFFFFFFF; @@ -68,9 +68,8 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se case EVENT_TICK: case EVENT_LOW_ENERGY_UPDATE: date_time = watch_rtc_get_date_time(); - tz = get_timezone_offset(settings->bit.time_zone, date_time); - timestamp = watch_utility_date_time_to_unix_time(date_time, tz * 60); - date_time = watch_utility_date_time_from_unix_time(timestamp, tz * 60); + timestamp = watch_utility_date_time_to_unix_time(date_time, state->tz * 60); + date_time = watch_utility_date_time_from_unix_time(timestamp, state->tz * 60); previous_date_time = state->previous_date_time; state->previous_date_time = date_time.reg; @@ -127,8 +126,6 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se } static bool _world_clock_face_do_settings_mode(movement_event_t event, movement_settings_t *settings, world_clock_state_t *state) { - watch_date_time date_time; - int16_t tz; switch (event.event_type) { case EVENT_MODE_BUTTON_UP: if (state->backup_register) watch_store_backup_data(state->settings.reg, state->backup_register); @@ -172,13 +169,11 @@ static bool _world_clock_face_do_settings_mode(movement_event_t event, movement_ } char buf[13]; - date_time = watch_rtc_get_date_time(); - tz = get_timezone_offset(settings->bit.time_zone, date_time); sprintf(buf, "%c%c %3d%02d ", movement_valid_position_0_chars[state->settings.bit.char_0], movement_valid_position_1_chars[state->settings.bit.char_1], - (int8_t) (tz / 60), - (int8_t) (tz % 60) * (tz < 0 ? -1 : 1)); + (int8_t) (state->tz / 60), + (int8_t) (state->tz % 60) * (state->tz < 0 ? -1 : 1)); watch_set_colon(); watch_clear_indicator(WATCH_INDICATOR_PM); diff --git a/movement/watch_faces/clock/world_clock_face.h b/movement/watch_faces/clock/world_clock_face.h index 92e91a6f..e76d85ea 100644 --- a/movement/watch_faces/clock/world_clock_face.h +++ b/movement/watch_faces/clock/world_clock_face.h @@ -62,6 +62,7 @@ typedef struct { uint8_t backup_register; uint8_t current_screen; uint32_t previous_date_time; + int16_t tz; } world_clock_state_t; void world_clock_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); diff --git a/movement/watch_faces/complication/moon_phase_face.c b/movement/watch_faces/complication/moon_phase_face.c index 47ed6e6d..c5718434 100644 --- a/movement/watch_faces/complication/moon_phase_face.c +++ b/movement/watch_faces/complication/moon_phase_face.c @@ -139,6 +139,7 @@ bool moon_phase_face_loop(movement_event_t event, movement_settings_t *settings, switch (event.event_type) { case EVENT_ACTIVATE: + _update(settings, state, state->offset); break; case EVENT_TICK: diff --git a/movement/watch_faces/complication/sunrise_sunset_face.c b/movement/watch_faces/complication/sunrise_sunset_face.c index a6ec764a..ad03d883 100644 --- a/movement/watch_faces/complication/sunrise_sunset_face.c +++ b/movement/watch_faces/complication/sunrise_sunset_face.c @@ -54,8 +54,7 @@ static void _sunrise_sunset_face_update(movement_settings_t *settings, sunrise_s } watch_date_time date_time = watch_rtc_get_date_time(); // the current local date / time - int16_t tz = get_timezone_offset(settings->bit.time_zone, date_time); - watch_date_time utc_now = watch_utility_date_time_convert_zone(date_time, tz * 60, 0); // the current date / time in UTC + watch_date_time utc_now = watch_utility_date_time_convert_zone(date_time, state->tz * 60, 0); // the current date / time in UTC watch_date_time scratch_time; // scratchpad, contains different values at different times scratch_time.reg = utc_now.reg; @@ -70,7 +69,7 @@ static void _sunrise_sunset_face_update(movement_settings_t *settings, sunrise_s // sunriset returns the rise/set times as signed decimal hours in UTC. // this can mean hours below 0 or above 31, which won't fit into a watch_date_time struct. // to deal with this, we set aside the offset in hours, and add it back before converting it to a watch_date_time. - double hours_from_utc = ((double)tz) / 60.0; + double hours_from_utc = ((double)state->tz) / 60.0; // we loop twice because if it's after sunset today, we need to recalculate to display values for tomorrow. for(int i = 0; i < 2; i++) { @@ -317,6 +316,7 @@ void sunrise_sunset_face_activate(movement_settings_t *settings, void *context) movement_location_t movement_location = (movement_location_t) watch_get_backup_data(1); state->working_latitude = _sunrise_sunset_face_struct_from_latlon(movement_location.bit.latitude); state->working_longitude = _sunrise_sunset_face_struct_from_latlon(movement_location.bit.longitude); + state->tz = get_timezone_offset(settings->bit.time_zone, watch_rtc_get_date_time()); } bool sunrise_sunset_face_loop(movement_event_t event, movement_settings_t *settings, void *context) { diff --git a/movement/watch_faces/complication/sunrise_sunset_face.h b/movement/watch_faces/complication/sunrise_sunset_face.h index 16e65b73..71b8462a 100644 --- a/movement/watch_faces/complication/sunrise_sunset_face.h +++ b/movement/watch_faces/complication/sunrise_sunset_face.h @@ -52,6 +52,7 @@ typedef struct { uint8_t rise_index; uint8_t active_digit; bool location_changed; + int16_t tz; watch_date_time rise_set_expires; sunrise_sunset_lat_lon_settings_t working_latitude; sunrise_sunset_lat_lon_settings_t working_longitude;