Time now auto-updates with DST

This commit is contained in:
David Volovskiy
2024-08-02 01:23:21 -04:00
parent 2ce07f9539
commit 149911e4ad
7 changed files with 105 additions and 16 deletions

View File

@@ -280,12 +280,28 @@ void clock_face_resign(movement_settings_t *settings, void *context) {
(void) context;
}
bool clock_face_wants_background_task(movement_settings_t *settings, void *context) {
(void) settings;
clock_state_t *state = (clock_state_t *) context;
if (!state->time_signal_enabled) return false;
static void check_and_act_on_daylight_savings(bool dst_active, watch_date_time date_time) {
if (!dst_active) return;
uint8_t dst_result = is_dst(date_time);
switch (dst_result)
{
case DST_STARTED:
date_time.unit.hour = (date_time.unit.hour + 1) % 24;
break;
case DST_ENDING:
date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
break;
default:
return;
}
watch_rtc_set_date_time(date_time);
}
bool clock_face_wants_background_task(movement_settings_t *settings, void *context) {
clock_state_t *state = (clock_state_t *) context;
watch_date_time date_time = watch_rtc_get_date_time();
check_and_act_on_daylight_savings(settings->bit.dst_active, date_time);
if (!state->time_signal_enabled) return false;
return date_time.unit.minute == 0;
}

View File

@@ -150,12 +150,28 @@ void simple_clock_face_resign(movement_settings_t *settings, void *context) {
(void) context;
}
bool simple_clock_face_wants_background_task(movement_settings_t *settings, void *context) {
(void) settings;
simple_clock_state_t *state = (simple_clock_state_t *)context;
if (!state->signal_enabled) return false;
static void check_and_act_on_daylight_savings(bool dst_active, watch_date_time date_time) {
if (!dst_active) return;
uint8_t dst_result = is_dst(date_time);
switch (dst_result)
{
case DST_STARTED:
date_time.unit.hour = (date_time.unit.hour + 1) % 24;
break;
case DST_ENDING:
date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
break;
default:
return;
}
watch_rtc_set_date_time(date_time);
}
bool simple_clock_face_wants_background_task(movement_settings_t *settings, void *context) {
simple_clock_state_t *state = (simple_clock_state_t *)context;
watch_date_time date_time = watch_rtc_get_date_time();
check_and_act_on_daylight_savings(settings->bit.dst_active, date_time);
if (!state->signal_enabled) return false;
return date_time.unit.minute == 0;
}

View File

@@ -67,13 +67,6 @@ static void _handle_alarm_button(movement_settings_t *settings, watch_date_time
if (settings->bit.time_zone > 40) settings->bit.time_zone = 0;
break;
case 7: // daylight savings time
if (settings->bit.dst_active) { // deactivate DST
date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
settings->bit.time_zone = movement_dst_inverse_jump_table[settings->bit.time_zone];
} else { // activate DST
date_time.unit.hour = (date_time.unit.hour + 1) % 24;
settings->bit.time_zone = movement_dst_jump_table[settings->bit.time_zone];
}
settings->bit.dst_active = !settings->bit.dst_active;
break;
}
@@ -161,8 +154,9 @@ bool set_time_face_loop(movement_event_t event, movement_settings_t *settings, v
watch_clear_colon();
sprintf(buf, "%s ", set_time_face_titles[current_page]);
} else {
int16_t tz = get_timezone_offset(settings->bit.time_zone, date_time);
watch_set_colon();
sprintf(buf, "%s %3d%02d ", set_time_face_titles[current_page], (int8_t) (movement_timezone_offsets[settings->bit.time_zone] / 60), (int8_t) (movement_timezone_offsets[settings->bit.time_zone] % 60) * (movement_timezone_offsets[settings->bit.time_zone] < 0 ? -1 : 1));
sprintf(buf, "%s %3d%02d ", set_time_face_titles[current_page], (int8_t) (tz / 60), (int8_t) (tz % 60) * (tz < 0 ? -1 : 1));
}
} else { // daylight savings
watch_clear_colon();