return movement_state.next_available_backup_register++;
}
+uint8_t check_and_act_on_daylight_savings(watch_date_time date_time) {
+ if (movement_state.settings.bit.dst_active) return date_time.unit.hour;
+ uint8_t dst_result = get_dst_status(date_time);
+ bool dst_skip_rolling_back = get_dst_skip_rolling_back();
+
+ if (dst_skip_rolling_back && (dst_result == DST_ENDED)) {
+ clear_dst_skip_rolling_back();
+ }
+ else if (dst_result == DST_ENDING && !dst_skip_rolling_back) {
+ set_dst_skip_rolling_back();
+ date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
+ watch_rtc_set_date_time(date_time);
+ }
+ else if (dst_result == DST_STARTING) {
+ date_time.unit.hour = (date_time.unit.hour + 1) % 24;
+ watch_rtc_set_date_time(date_time);
+ }
+ return date_time.unit.hour;
+}
+
int16_t get_timezone_offset(uint8_t timezone_idx, watch_date_time date_time) {
if (!movement_state.settings.bit.dst_active) return movement_timezone_offsets[timezone_idx];
if (dst_occurring(date_time))
void movement_play_alarm_beeps(uint8_t rounds, BuzzerNote alarm_note);
uint8_t movement_claim_backup_register(void);
+uint8_t check_and_act_on_daylight_savings(watch_date_time date_time); // Returns the currently set hour
int16_t get_timezone_offset(uint8_t timezone_idx, watch_date_time date_time);
#endif // MOVEMENT_H_
(void) context;
}
-static void check_and_act_on_daylight_savings(movement_settings_t *settings, watch_date_time date_time) {
- if (!settings ->bit.dst_active) return;
- uint8_t dst_result = get_dst_status(date_time);
-
- if (settings ->bit.dst_skip_rolling_back && dst_result == DST_ENDED) {
- settings ->bit.dst_skip_rolling_back = false;
- return;
- }
- else if (dst_result == DST_ENDING && !settings ->bit.dst_skip_rolling_back) {
- settings ->bit.dst_skip_rolling_back = true;
- date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
- watch_rtc_set_date_time(date_time);
- return;
- }
- else if (dst_result == DST_STARTING) {
- date_time.unit.hour = (date_time.unit.hour + 1) % 24;
- watch_rtc_set_date_time(date_time);
- return;
- }
-}
-
bool clock_face_wants_background_task(movement_settings_t *settings, void *context) {
+ (void) settings;
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, date_time);
+ uint8_t hour_dst = check_and_act_on_daylight_savings(date_time);
+ if(hour_dst != date_time.unit.hour) {
+ char buf[3 + 1];
+ sprintf(buf, "%2d", hour_dst);
+ watch_display_string(buf, 4);
+ }
if (!state->time_signal_enabled) return false;
return date_time.unit.minute == 0;
bool minute_repeater_decimal_face_wants_background_task(movement_settings_t *settings, void *context) {
(void) settings;
minute_repeater_decimal_state_t *state = (minute_repeater_decimal_state_t *)context;
- if (!state->signal_enabled) return false;
-
watch_date_time date_time = watch_rtc_get_date_time();
+ check_and_act_on_daylight_savings(date_time);
+ if (!state->signal_enabled) return false;
return date_time.unit.minute == 0;
}
bool repetition_minute_face_wants_background_task(movement_settings_t *settings, void *context) {
(void) settings;
repetition_minute_state_t *state = (repetition_minute_state_t *)context;
- if (!state->signal_enabled) return false;
-
watch_date_time date_time = watch_rtc_get_date_time();
+ check_and_act_on_daylight_savings(date_time);
+ if (!state->signal_enabled) return false;
return date_time.unit.minute == 0;
}
bool simple_clock_bin_led_face_wants_background_task(movement_settings_t *settings, void *context) {
(void) settings;
simple_clock_bin_led_state_t *state = (simple_clock_bin_led_state_t *)context;
- if (!state->signal_enabled) return false;
-
watch_date_time date_time = watch_rtc_get_date_time();
+ check_and_act_on_daylight_savings(date_time);
+ if (!state->signal_enabled) return false;
return date_time.unit.minute == 0;
}
(void) context;
}
-static void check_and_act_on_daylight_savings(movement_settings_t *settings, watch_date_time date_time) {
- if (!settings ->bit.dst_active) return;
- uint8_t dst_result = get_dst_status(date_time);
-
- if (settings ->bit.dst_skip_rolling_back && (dst_result == DST_ENDED)) {
- settings ->bit.dst_skip_rolling_back = false;
- return;
- }
- else if (dst_result == DST_ENDING && !settings ->bit.dst_skip_rolling_back) {
- settings ->bit.dst_skip_rolling_back = true;
- date_time.unit.hour = (date_time.unit.hour + 24 - 1) % 24;
- watch_rtc_set_date_time(date_time);
- return;
- }
- else if (dst_result == DST_STARTING) {
- date_time.unit.hour = (date_time.unit.hour + 1) % 24;
- watch_rtc_set_date_time(date_time);
- return;
- }
-}
-
bool simple_clock_face_wants_background_task(movement_settings_t *settings, void *context) {
simple_clock_state_t *state = (simple_clock_state_t *)context;
- date_time = watch_rtc_get_date_time();
- check_and_act_on_daylight_savings(settings, date_time);
+ watch_date_time date_time = watch_rtc_get_date_time();
+ uint8_t hour_dst = check_and_act_on_daylight_savings(date_time);
+ if(hour_dst != date_time.unit.hour) {
+ char buf[3 + 1];
+ sprintf(buf, "%2d", hour_dst);
+ watch_display_string(buf, 4);
+ }
if (!state->signal_enabled) return false;
return date_time.unit.minute == 0;
break;
}
watch_rtc_set_date_time(date_time);
- settings->bit.dst_skip_rolling_back = false;
}
static void _abort_quick_ticks() {
}
date_time_settings.unit.second = 0;
watch_rtc_set_date_time(date_time_settings);
- settings->bit.dst_skip_rolling_back = false;
}
break;
case EVENT_ALARM_BUTTON_DOWN:
}
if (current_page != 2) { // Do not set time when we are at seconds, it was already set previously
watch_rtc_set_date_time(date_time_settings);
- settings->bit.dst_skip_rolling_back = false;
}
break;
}
if (current_page != 2) { // Do not set time when we are at seconds, it was already set previously
watch_rtc_set_date_time(date_time_settings);
- settings->bit.dst_skip_rolling_back = false;
}
//TODO: Do not update whole RTC, just what we are changing
break;
ext_irq_cb_t a2_callback;
ext_irq_cb_t a4_callback;
+static bool dst_skip_rolling_back;
+bool get_dst_skip_rolling_back(void) {
+ return dst_skip_rolling_back;
+}
+
+void set_dst_skip_rolling_back(void) {
+ dst_skip_rolling_back = true;
+}
+
+void clear_dst_skip_rolling_back(void) {
+ dst_skip_rolling_back = false;
+}
+
bool _watch_rtc_is_enabled(void) {
return RTC->MODE2.CTRLA.bit.ENABLE;
}
_sync_rtc(); // Double sync as without it at high Hz faces setting time is unrealiable (specifically, set_time_hackwatch)
RTC->MODE2.CLOCK.reg = date_time.reg;
_sync_rtc();
+ clear_dst_skip_rolling_back();
}
watch_date_time watch_rtc_get_date_time(void) {
*/
void watch_rtc_freqcorr_write(int16_t value, int16_t sign);
+/** @brief Returns if we're currently at a point where the we rolled back for DST and need to ignore the next DST segment
+ */
+bool get_dst_skip_rolling_back(void);
+void set_dst_skip_rolling_back(void);
+void clear_dst_skip_rolling_back(void);
+
/// @}
#endif
ext_irq_cb_t a2_callback;
ext_irq_cb_t a4_callback;
+static bool dst_skip_rolling_back;
+bool get_dst_skip_rolling_back(void) {
+ return dst_skip_rolling_back;
+}
+
+void set_dst_skip_rolling_back(void) {
+ dst_skip_rolling_back = true;
+}
+
+void clear_dst_skip_rolling_back(void) {
+ dst_skip_rolling_back = false;
+}
+
bool _watch_rtc_is_enabled(void) {
return true;
}
const date = new Date(year, month - 1, day, hour, minute, second);
return date - Date.now();
}, date_time.reg);
+ clear_dst_skip_rolling_back();
}
watch_date_time watch_rtc_get_date_time(void) {