From 36764e07fe83f9ffed20072f22ec48d0cb2b2b45 Mon Sep 17 00:00:00 2001 From: martin-s Date: Tue, 6 Jul 2010 17:06:36 +0000 Subject: [PATCH] Fix:Core:Better through traffic restriction handling git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@3481 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/route.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/navit/navit/route.c b/navit/navit/route.c index 263a2d2..cc9095c 100644 --- a/navit/navit/route.c +++ b/navit/navit/route.c @@ -1590,6 +1590,12 @@ route_get_traffic_distortion(struct route_graph_segment *seg, struct route_traff return 0; } +static int +route_through_traffic_allowed(struct vehicleprofile *profile, struct route_graph_segment *seg) +{ + return (seg->data.flags & AF_THROUGH_TRAFFIC_LIMIT) == 0; +} + /** * @brief Returns the "costs" of driving from point from over segment over in direction dir * @@ -1603,6 +1609,8 @@ route_get_traffic_distortion(struct route_graph_segment *seg, struct route_traff static int route_value_seg(struct vehicleprofile *profile, struct route_graph_point *from, struct route_graph_segment *over, int dir) { + int ret; + struct route_traffic_distortion dist,*distp=NULL; #if 0 dbg(0,"flags 0x%x mask 0x%x flags 0x%x\n", over->flags, dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask, profile->flags); #endif @@ -1614,14 +1622,16 @@ route_value_seg(struct vehicleprofile *profile, struct route_graph_point *from, return INT_MAX; if (from && from->seg == over) return INT_MAX; - if (over->data.flags & AF_THROUGH_TRAFFIC_LIMIT) - return profile->through_traffic_penalty; - if ((over->start->flags & RP_TRAFFIC_DISTORTION) && (over->end->flags & RP_TRAFFIC_DISTORTION)) { - struct route_traffic_distortion dist; - if (route_get_traffic_distortion(over, &dist)) - return route_time_seg(profile, &over->data, &dist); - } - return route_time_seg(profile, &over->data, NULL); + if ((over->start->flags & RP_TRAFFIC_DISTORTION) && (over->end->flags & RP_TRAFFIC_DISTORTION) && + route_get_traffic_distortion(over, &dist)) { + distp=&dist; + } + ret=route_time_seg(profile, &over->data, distp); + if (ret == INT_MAX) + return ret; + if (!route_through_traffic_allowed(profile, over) && from && route_through_traffic_allowed(profile, from->seg)) + ret+=profile->through_traffic_penalty; + return ret; } /** -- 2.7.4