From: martin-s Date: Tue, 6 Jul 2010 17:06:36 +0000 (+0000) Subject: Fix:Core:Better through traffic restriction handling X-Git-Tag: navit-0.5.0.5194svn~1711 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=36764e07fe83f9ffed20072f22ec48d0cb2b2b45;p=profile%2Fivi%2Fnavit.git Fix:Core:Better through traffic restriction handling git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@3481 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- 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; } /**