diff options
author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2010-11-17 13:34:40 +0000 |
---|---|---|
committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2010-11-17 13:34:40 +0000 |
commit | 6c28a0ae8b4deab9c8ed431830be12eebb26672f (patch) | |
tree | 8fae594c89cc8cd1352560fba630fdf36ad4c633 /navit/track.c | |
parent | c06789f012a156f528c9fd9a11fb3d9e41c66a2b (diff) | |
download | navit-6c28a0ae8b4deab9c8ed431830be12eebb26672f.tar.gz |
Add:Core:Make tracking preferences configurable
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@3685 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/track.c')
-rw-r--r-- | navit/track.c | 76 |
1 files changed, 57 insertions, 19 deletions
diff --git a/navit/track.c b/navit/track.c index 22fe8ffb9..dec8fb2aa 100644 --- a/navit/track.c +++ b/navit/track.c @@ -100,14 +100,14 @@ struct tracking { struct coord_geo coord_geo; enum projection pro; int street_direction; + int angle_pref; + int connected_pref; + int nostop_pref; + int offroad_limit_pref; + int route_pref; }; -int angle_factor=10; -int connected_pref=10; -int nostop_pref=10; -int offroad_limit_pref=5000; -int route_pref=300; static void @@ -537,7 +537,7 @@ tracking_angle_delta(struct tracking *tr, int vehicle_angle, int street_angle, i } static int -tracking_is_connected(struct coord *c1, struct coord *c2) +tracking_is_connected(struct tracking *tr, struct coord *c1, struct coord *c2) { if (c1[0].x == c2[0].x && c1[0].y == c2[0].y) return 0; @@ -547,26 +547,26 @@ tracking_is_connected(struct coord *c1, struct coord *c2) return 0; if (c1[1].x == c2[1].x && c1[1].y == c2[1].y) return 0; - return connected_pref; + return tr->connected_pref; } static int -tracking_is_no_stop(struct coord *c1, struct coord *c2) +tracking_is_no_stop(struct tracking *tr, struct coord *c1, struct coord *c2) { if (c1->x == c2->x && c1->y == c2->y) - return nostop_pref; + return tr->nostop_pref; return 0; } static int -tracking_is_on_route(struct route *rt, struct item *item) +tracking_is_on_route(struct tracking *tr, struct route *rt, struct item *item) { #ifdef USE_ROUTING if (! rt) return 0; if (route_contains(rt, item)) return 0; - return route_pref; + return tr->route_pref; #else return 0; #endif @@ -591,17 +591,17 @@ tracking_value(struct tracking *tr, struct tracking_line *t, int offset, struct if (value >= min) return value; if (flags & 2) - value += tracking_angle_delta(tr, tr->curr_angle, t->angle[offset], sd->flags)*angle_factor>>4; + value += tracking_angle_delta(tr, tr->curr_angle, t->angle[offset], sd->flags)*tr->angle_pref>>4; if (value >= min) return value; if (flags & 4) - value += tracking_is_connected(tr->last, &sd->c[offset]); + value += tracking_is_connected(tr, tr->last, &sd->c[offset]); if (flags & 8) - value += tracking_is_no_stop(lpnt, &tr->last_out); + value += tracking_is_no_stop(tr, lpnt, &tr->last_out); if (value >= min) return value; if (flags & 16) - value += tracking_is_on_route(tr->rt, &sd->item); + value += tracking_is_on_route(tr, tr->rt, &sd->item); return value; } @@ -711,9 +711,9 @@ tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *v struct coord lpnt_tmp; dbg(1,"lpnt.x=0x%x,lpnt.y=0x%x pos=%d %d+%d+%d+%d=%d\n", lpnt.x, lpnt.y, i, transform_distance_line_sq(&sd->c[i], &sd->c[i+1], &cin, &lpnt_tmp), - tracking_angle_delta(tr, tr->curr_angle, t->angle[i], 0)*angle_factor, - tracking_is_connected(tr->last, &sd->c[i]) ? connected_pref : 0, - lpnt.x == tr->last_out.x && lpnt.y == tr->last_out.y ? nostop_pref : 0, + tracking_angle_delta(tr, tr->curr_angle, t->angle[i], 0)*tr->angle_pref, + tracking_is_connected(tr, tr->last, &sd->c[i]) ? tr->connected_pref : 0, + lpnt.x == tr->last_out.x && lpnt.y == tr->last_out.y ? tr->nostop_pref : 0, value ); tr->curr_out.x=lpnt.x; @@ -731,7 +731,7 @@ tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *v t=t->next; } dbg(1,"tr->curr_line=%p min=%d\n", tr->curr_line, min); - if (!tr->curr_line || min > offroad_limit_pref) { + if (!tr->curr_line || min > tr->offroad_limit_pref) { tr->curr_out=tr->curr_in; tr->coord_geo_valid=0; tr->street_direction=0; @@ -739,15 +739,53 @@ tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *v dbg(1,"found 0x%x,0x%x\n", tr->curr_out.x, tr->curr_out.y); } +static int +tracking_set_attr_do(struct tracking *tr, struct attr *attr, int initial) +{ + switch (attr->type) { + case attr_angle_pref: + tr->angle_pref=attr->u.num; + return 1; + case attr_connected_pref: + tr->connected_pref=attr->u.num; + return 1; + case attr_nostop_pref: + tr->nostop_pref=attr->u.num; + return 1; + case attr_offroad_limit_pref: + tr->offroad_limit_pref=attr->u.num; + return 1; + case attr_route_pref: + tr->route_pref=attr->u.num; + return 1; + default: + return 0; + } +} + +int +tracking_set_attr(struct tracking *tr, struct attr *attr) +{ + return tracking_set_attr_do(tr, attr, 0); +} + struct tracking * tracking_new(struct attr *parent, struct attr **attrs) { struct tracking *this=g_new0(struct tracking, 1); struct attr hist_size; + this->angle_pref=10; + this->connected_pref=10; + this->nostop_pref=10; + this->offroad_limit_pref=5000; + this->route_pref=300; + if (! attr_generic_get_attr(attrs, NULL, attr_cdf_histsize, &hist_size, NULL)) { hist_size.u.num = 0; } + for (;*attrs; attrs++) + tracking_set_attr_do(this, *attrs, 1); tracking_init_cdf(&this->cdf, hist_size.u.num); |