From ee95229e19ea56680828bb57e366729e6f95d079 Mon Sep 17 00:00:00 2001 From: Joey Castillo Date: Sat, 12 Feb 2022 22:52:26 -0500 Subject: world clock: store settings in backup register if possible --- movement/watch_faces/clock/world_clock_face.c | 47 +++++++++++++++------------ movement/watch_faces/clock/world_clock_face.h | 13 +++++--- 2 files changed, 34 insertions(+), 26 deletions(-) (limited to 'movement/watch_faces') diff --git a/movement/watch_faces/clock/world_clock_face.c b/movement/watch_faces/clock/world_clock_face.c index de4eeaff..f0f7e954 100644 --- a/movement/watch_faces/clock/world_clock_face.c +++ b/movement/watch_faces/clock/world_clock_face.c @@ -33,10 +33,13 @@ void world_clock_face_setup(movement_settings_t *settings, uint8_t watch_face_in (void) watch_face_index; if (*context_ptr == NULL) { *context_ptr = malloc(sizeof(world_clock_state_t)); - world_clock_state_t *state = (world_clock_state_t *)*context_ptr; - state->settings.char_0 = 0; - state->settings.char_1 = 0; - state->settings.timezone_index = 0; // start at UTC + memset(*context_ptr, 0, sizeof(world_clock_state_t)); + uint8_t backup_register = movement_claim_backup_register(); + if (backup_register) { + world_clock_state_t *state = (world_clock_state_t *)*context_ptr; + state->settings.reg = watch_get_backup_data(backup_register); + state->backup_register = backup_register; + } } } @@ -64,7 +67,7 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se case EVENT_LOW_ENERGY_UPDATE: date_time = watch_rtc_get_date_time(); timestamp = watch_utility_date_time_to_unix_time(date_time, movement_timezone_offsets[settings->bit.time_zone] * 60); - date_time = watch_utility_date_time_from_unix_time(timestamp, movement_timezone_offsets[state->settings.timezone_index] * 60); + date_time = watch_utility_date_time_from_unix_time(timestamp, movement_timezone_offsets[state->settings.bit.timezone_index] * 60); previous_date_time = state->previous_date_time; state->previous_date_time = date_time.reg; @@ -92,15 +95,15 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { if (!watch_tick_animation_is_running()) watch_start_tick_animation(500); sprintf(buf, "%c%c%2d%2d%02d ", - movement_valid_position_0_chars[state->settings.char_0], - movement_valid_position_1_chars[state->settings.char_1], + movement_valid_position_0_chars[state->settings.bit.char_0], + movement_valid_position_1_chars[state->settings.bit.char_1], date_time.unit.day, date_time.unit.hour, date_time.unit.minute); } else { sprintf(buf, "%c%c%2d%2d%02d%02d", - movement_valid_position_0_chars[state->settings.char_0], - movement_valid_position_1_chars[state->settings.char_1], + movement_valid_position_0_chars[state->settings.bit.char_0], + movement_valid_position_1_chars[state->settings.bit.char_1], date_time.unit.day, date_time.unit.hour, date_time.unit.minute, @@ -129,6 +132,7 @@ 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) { switch (event.event_type) { case EVENT_MODE_BUTTON_UP: + if (state->backup_register) watch_store_backup_data(state->settings.reg, state->backup_register); movement_move_to_next_face(); return false; case EVENT_LIGHT_BUTTON_DOWN: @@ -137,26 +141,27 @@ static bool _world_clock_face_do_settings_mode(movement_event_t event, movement_ movement_request_tick_frequency(1); state->current_screen = 0; state->previous_date_time = 0xFFFFFFFF; + if (state->backup_register) watch_store_backup_data(state->settings.reg, state->backup_register); world_clock_face_do_display_mode(event, settings, state); } break; case EVENT_ALARM_BUTTON_DOWN: switch (state->current_screen) { case 1: - state->settings.char_0++; - if (state->settings.char_0 >= strlen(movement_valid_position_0_chars)) { - state->settings.char_0 = 0; + state->settings.bit.char_0++; + if (state->settings.bit.char_0 >= strlen(movement_valid_position_0_chars)) { + state->settings.bit.char_0 = 0; } break; case 2: - state->settings.char_1++; - if (state->settings.char_1 >= strlen(movement_valid_position_1_chars)) { - state->settings.char_1 = 0; + state->settings.bit.char_1++; + if (state->settings.bit.char_1 >= strlen(movement_valid_position_1_chars)) { + state->settings.bit.char_1 = 0; } break; case 3: - state->settings.timezone_index++; - if (state->settings.timezone_index > 40) state->settings.timezone_index = 0; + state->settings.bit.timezone_index++; + if (state->settings.bit.timezone_index > 40) state->settings.bit.timezone_index = 0; break; } break; @@ -169,10 +174,10 @@ static bool _world_clock_face_do_settings_mode(movement_event_t event, movement_ char buf[13]; sprintf(buf, "%c%c %3d%02d ", - movement_valid_position_0_chars[state->settings.char_0], - movement_valid_position_1_chars[state->settings.char_1], - (int8_t) (movement_timezone_offsets[state->settings.timezone_index] / 60), - (int8_t) (movement_timezone_offsets[state->settings.timezone_index] % 60) * (movement_timezone_offsets[state->settings.timezone_index] < 0 ? -1 : 1)); + movement_valid_position_0_chars[state->settings.bit.char_0], + movement_valid_position_1_chars[state->settings.bit.char_1], + (int8_t) (movement_timezone_offsets[state->settings.bit.timezone_index] / 60), + (int8_t) (movement_timezone_offsets[state->settings.bit.timezone_index] % 60) * (movement_timezone_offsets[state->settings.bit.timezone_index] < 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 36960f53..669dcaa8 100644 --- a/movement/watch_faces/clock/world_clock_face.h +++ b/movement/watch_faces/clock/world_clock_face.h @@ -26,15 +26,18 @@ #define WORLD_CLOCK_FACE_H_ #include "movement.h" - -typedef struct { - uint8_t char_0; - uint8_t char_1; - uint8_t timezone_index; +typedef union { + struct { + uint8_t char_0; + uint8_t char_1; + uint8_t timezone_index; + } bit; + uint32_t reg; } world_clock_settings_t; typedef struct { world_clock_settings_t settings; + uint8_t backup_register; uint8_t current_screen; uint32_t previous_date_time; } world_clock_state_t; -- cgit v1.2.3