Merge PR #471 - add DST to sunrise/sunset presets

Implements automatic DST data to the sunrise/sunset presets,
making the whole system more automatic and therefore more reliable.

Reviewed-by: Matheus Afonso Martins Moreira <matheus@matheusmoreira.com>
GitHub-Pull-Request: https://github.com/joeycastillo/Sensor-Watch/pull/471
This commit is contained in:
Matheus Afonso Martins Moreira 2024-09-08 21:12:24 -03:00
commit 0cc28b9811
2 changed files with 28 additions and 15 deletions

View file

@ -49,20 +49,29 @@ static void _sunrise_sunset_face_update(movement_settings_t *settings, sunrise_s
double rise, set, minutes, seconds; double rise, set, minutes, seconds;
bool show_next_match = false; bool show_next_match = false;
movement_location_t movement_location; movement_location_t movement_location;
if (state->longLatToUse == 0 || _location_count <= 1) int16_t tz;
watch_date_time date_time = watch_rtc_get_date_time(); // the current local date / time
if (state->longLatToUse == 0 || _location_count <= 1) {
tz = get_timezone_offset(settings->bit.time_zone, date_time);
movement_location = (movement_location_t) watch_get_backup_data(1); movement_location = (movement_location_t) watch_get_backup_data(1);
}
else{ else{
movement_location.bit.latitude = longLatPresets[state->longLatToUse].latitude; movement_location.bit.latitude = longLatPresets[state->longLatToUse].latitude;
movement_location.bit.longitude = longLatPresets[state->longLatToUse].longitude; movement_location.bit.longitude = longLatPresets[state->longLatToUse].longitude;
if (longLatPresets[state->longLatToUse].uses_dst && dst_occurring(date_time))
tz = movement_timezone_dst_offsets[longLatPresets[state->longLatToUse].timezone];
else
tz = movement_timezone_offsets[longLatPresets[state->longLatToUse].timezone];
} }
if (movement_location.reg == 0) { if (movement_location.reg == 0) {
watch_clear_all_indicators();
watch_clear_colon();
watch_display_string("RI no Loc", 0); watch_display_string("RI no Loc", 0);
return; return;
} }
watch_date_time date_time = watch_rtc_get_date_time(); // the current local 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 watch_date_time scratch_time; // scratchpad, contains different values at different times
scratch_time.reg = utc_now.reg; scratch_time.reg = utc_now.reg;
@ -77,7 +86,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. // 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. // 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. // 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)state->tz) / 60.0; double hours_from_utc = ((double)tz) / 60.0;
// we loop twice because if it's after sunset today, we need to recalculate to display values for tomorrow. // 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++) { for(int i = 0; i < 2; i++) {
@ -334,7 +343,6 @@ void sunrise_sunset_face_activate(movement_settings_t *settings, void *context)
movement_location_t movement_location = (movement_location_t) watch_get_backup_data(1); 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_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->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) { bool sunrise_sunset_face_loop(movement_event_t event, movement_settings_t *settings, void *context) {
@ -399,11 +407,11 @@ bool sunrise_sunset_face_loop(movement_event_t event, movement_settings_t *setti
break; break;
case EVENT_ALARM_LONG_PRESS: case EVENT_ALARM_LONG_PRESS:
if (state->page == 0) { if (state->page == 0) {
if (state->longLatToUse != 0) { if (state->longLatToUse != 0) {
state->longLatToUse = 0; state->longLatToUse = 0;
_sunrise_sunset_face_update(settings, state); _sunrise_sunset_face_update(settings, state);
break; break;
} }
state->page++; state->page++;
state->active_digit = 0; state->active_digit = 0;
watch_clear_display(); watch_clear_display();

View file

@ -52,13 +52,14 @@ typedef struct {
uint8_t rise_index; uint8_t rise_index;
uint8_t active_digit; uint8_t active_digit;
bool location_changed; bool location_changed;
int16_t tz;
watch_date_time rise_set_expires; watch_date_time rise_set_expires;
sunrise_sunset_lat_lon_settings_t working_latitude; sunrise_sunset_lat_lon_settings_t working_latitude;
sunrise_sunset_lat_lon_settings_t working_longitude; sunrise_sunset_lat_lon_settings_t working_longitude;
uint8_t longLatToUse; uint8_t longLatToUse;
} sunrise_sunset_state_t; } sunrise_sunset_state_t;
#define SUNRISE_USE_LOCAL_TZ 0xFF
void sunrise_sunset_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); void sunrise_sunset_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
void sunrise_sunset_face_activate(movement_settings_t *settings, void *context); void sunrise_sunset_face_activate(movement_settings_t *settings, void *context);
bool sunrise_sunset_face_loop(movement_event_t event, movement_settings_t *settings, void *context); bool sunrise_sunset_face_loop(movement_event_t event, movement_settings_t *settings, void *context);
@ -76,14 +77,18 @@ typedef struct {
char name[2]; char name[2];
int16_t latitude; int16_t latitude;
int16_t longitude; int16_t longitude;
uint8_t timezone; // References element in movement_timezone_offsets
bool uses_dst;
} long_lat_presets_t; } long_lat_presets_t;
// Locations must either use the same timezone as local time, or not observe DST.
static const long_lat_presets_t longLatPresets[] = static const long_lat_presets_t longLatPresets[] =
{ {
{ .name = " "}, // Default, the long and lat get replaced by what's set in the watch { .name = " "}, // Default, the long, lat, and timezone get replaced by what's set in the watch
// { .name = "Ny", .latitude = 4072, .longitude = -7401 }, // New York City, NY // { .name = "Ny", .latitude = 4072, .longitude = -7401, .timezone = 33, .uses_dst = true }, // New York City, NY
// { .name = "LA", .latitude = 3405, .longitude = -11824 }, // Los Angeles, CA // { .name = "LA", .latitude = 3405, .longitude = -11824, .timezone = 30, .uses_dst = true }, // Los Angeles, CA
// { .name = "dE", .latitude = 4221, .longitude = -8305 }, // Detroit, MI // { .name = "dE", .latitude = 4221, .longitude = -8305, .timezone = 33, .uses_dst = true }, // Detroit, MI
// { .name = "To", .latitude = 3567, .longitude = 13965, .timezone = 15, .uses_dst = false }, // Tokyo, JP
}; };
#endif // SUNRISE_SUNSET_FACE_H_ #endif // SUNRISE_SUNSET_FACE_H_