summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOLFDB <olf@eisenzelt.de>2023-01-11 07:44:43 +0100
committerGitHub <noreply@github.com>2023-01-11 07:44:43 +0100
commit216ccc8bfcae6c0fa6b284024214917e6c8d376b (patch)
tree62832d67fc6d123e6beefe7480485a9cb5c0e074
parent0d5abca5d7e4ca54d04b73c8199d0ba003fe88bc (diff)
downloadnavit-216ccc8bfcae6c0fa6b284024214917e6c8d376b.tar.gz
fix:core:Fix sunrise/sunset layout switch
Fix #1185 2 (#1216) * Initial commit * Fix:1185 Verified against https://api.sunrise-sunset.org for any integer coordinate -180 -90, -179,-90 ... 179 90, 180 90. * Changed loglevel
-rw-r--r--navit/navit.c47
1 files changed, 35 insertions, 12 deletions
diff --git a/navit/navit.c b/navit/navit.c
index e6e43064d..f3733c057 100644
--- a/navit/navit.c
+++ b/navit/navit.c
@@ -3521,7 +3521,7 @@ void navit_layout_switch(struct navit *n) {
int currTs=0;
struct attr iso8601_attr,geo_attr,valid_attr,layout_attr;
- double trise,tset,trise_actual;
+ double trise,tset;
struct layout *l;
int year, month, day;
int after_sunrise = FALSE;
@@ -3541,9 +3541,9 @@ void navit_layout_switch(struct navit *n) {
//Check that we aren't calculating too fast
if (vehicle_get_attr(n->vehicle->vehicle, attr_position_time_iso8601,&iso8601_attr,NULL)==1) {
currTs=iso8601_to_secs(iso8601_attr.u.str);
- dbg(lvl_debug,"currTs: %u:%u",currTs%86400/3600,((currTs%86400)%3600)/60);
+ dbg(lvl_debug,"currTs: %02u:%02u",currTs%86400/3600,((currTs%86400)%3600)/60);
}
- dbg(lvl_debug,"prevTs: %u:%u",n->prevTs%86400/3600,((n->prevTs%86400)%3600)/60);
+ dbg(lvl_debug,"prevTs: %02u:%02u",n->prevTs%86400/3600,((n->prevTs%86400)%3600)/60);
if (n->auto_switch == FALSE)
return;
@@ -3596,24 +3596,47 @@ void navit_layout_switch(struct navit *n) {
if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,n->sunrise_degrees,1,&trise,
&tset)!=0) {
dbg(lvl_debug,"near the pole sun never rises/sets, so we should never switch profiles");
- dbg(lvl_debug,"trise: %u:%u",HOURS(trise),MINUTES(trise));
- dbg(lvl_debug,"tset: %u:%u",HOURS(tset),MINUTES(tset));
+ dbg(lvl_debug,"trise: %02u:%02u",HOURS(trise),MINUTES(trise));
+ dbg(lvl_debug,"tset: %02u:%02u",HOURS(tset),MINUTES(tset));
n->prevTs=currTs;
return;
}
- trise_actual=trise;
- dbg(lvl_debug,"trise: %u:%u",HOURS(trise),MINUTES(trise));
- dbg(lvl_debug,"tset: %u:%u",HOURS(tset),MINUTES(tset));
+
+ dbg(lvl_debug,"trise: %02u:%02u",HOURS(trise),MINUTES(trise));
+ dbg(lvl_debug,"tset: %02u:%02u",HOURS(tset),MINUTES(tset));
dbg(lvl_debug,"dayname = %s, name =%s ",l->dayname, l->name);
dbg(lvl_debug,"nightname = %s, name = %s ",l->nightname, l->name);
- if (HOURS(trise)*60+MINUTES(trise)<(currTs%86400)/60) {
+
+ // We want any times to be in [0;1439].
+ if(trise<0)
+ trise+=24;
+ if(tset>=24)
+ tset-=24;
+
+ int trmin=HOURS(trise)*60+MINUTES(trise); // rise time in minutes
+ int tsmin=HOURS(tset)*60+MINUTES(tset); // set time in minutes
+ int tcur=(currTs%86400)/60; // minutes elapsed today
+
+ if (trmin<=tcur) { // use <= to have defined values for after_sunrise for any value of tcur
after_sunrise = TRUE;
}
- if (((HOURS(tset)*60+MINUTES(tset)<(currTs%86400)/60)) ||
- ((HOURS(trise_actual)*60+MINUTES(trise_actual)>(currTs%86400)/60))) {
- after_sunset = TRUE;
+ if (tsmin>trmin) { // set > rise
+ if (trmin<=tcur) {
+ after_sunrise = TRUE;
+ }
+ if (tsmin<=tcur || trmin>tcur) {
+ after_sunset = TRUE;
+ }
+ } else { // rise > set
+ if((tcur<=tsmin) || (tcur>=trmin)) {
+ after_sunrise = TRUE;
+ }
+ if(tcur>tsmin && tcur<trmin) {
+ after_sunset = TRUE;
+ }
}
+
if (after_sunrise && !after_sunset && l->dayname) {
navit_set_layout_by_name(n,l->dayname);
dbg(lvl_debug,"layout set to day");