Rename attr_limit to attr_flags and define what the flags are
authorzaxl <zaxl@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 20 Nov 2007 18:55:41 +0000 (18:55 +0000)
committerzaxl <zaxl@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 20 Nov 2007 18:55:41 +0000 (18:55 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@570 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/src/attr.h
navit/src/attr_def.h
navit/src/data/garmin/garmin.c
navit/src/data/mg/street.c
navit/src/osm2navit.c
navit/src/route.c
navit/src/route.h
navit/src/track.c

index e9d678a..0d0b7df 100644 (file)
@@ -17,6 +17,13 @@ enum attr_type {
 #undef ATTR
 };
 
+#define AF_ONEWAY      (1<<0)
+#define AF_ONEWAYREV   (1<<1)
+#define AF_NOPASS      (AF_ONEWAY|AF_ONEWAYREV)
+#define AF_ONEWAYMASK  (AF_ONEWAY|AF_ONEWAYREV)
+#define AF_SEGMENTED   (1<<2)
+
+
 struct attr {
        enum attr_type type;
        union {
index 8b52400..e93f767 100644 (file)
@@ -16,7 +16,7 @@ ATTR2(0x0001ffff,type_item_end)
 ATTR2(0x00020000,type_int_begin)
 ATTR(h)
 ATTR(id)
-ATTR(limit)
+ATTR(flags)
 ATTR(w)
 ATTR(x)
 ATTR(y)
index 8717fd1..595acf8 100644 (file)
@@ -311,7 +311,7 @@ point_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
        case attr_street_name:
                attr->type = attr_street_name;
                return garmin_object_label(g, attr);
-       case attr_limit:
+       case attr_flags:
                return 0;
        default:
                dlog(1, "Dont know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type));
@@ -507,6 +507,7 @@ garmin_get_selection(struct map_rect_priv *map, struct map_selection *sel)
                && sel->order[layer_street]) {
                // Get all roads 
                flags = GO_GET_ROUTABLE;
+               sel = NULL;
        } else if (sel)
                flags = GO_GET_SORTED;
 
index b1a7220..2a93eb6 100644 (file)
@@ -242,7 +242,7 @@ street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
                attr->u.str=street->name.name2;
                return ((attr->u.str && attr->u.str[0]) ? 1:0);
        case attr_street_name_systematic:
-               street->attr_next=attr_limit;
+               street->attr_next=attr_flags;
                nameid=L(street->str->nameid);
                if (! nameid)
                        return 0;
@@ -250,13 +250,13 @@ street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
                        street_name_get_by_id(&street->name,street->name_file,nameid);
                attr->u.str=street->name.name1;
                return ((attr->u.str && attr->u.str[0]) ? 1:0);
-       case attr_limit:
+       case attr_flags:
                if (street->str->type & 0x40) {
-                       attr->u.num=(street->str->limit & 0x30) ? 2:0;
-                       attr->u.num|=(street->str->limit & 0x03) ? 1:0;
+                       attr->u.num=(street->str->limit & 0x30) ? AF_ONEWAYREV:0;
+                       attr->u.num|=(street->str->limit & 0x03) ? AF_ONEWAY:0;
                } else {
-                       attr->u.num=(street->str->limit & 0x30) ? 1:0;
-                       attr->u.num|=(street->str->limit & 0x03) ? 2:0;
+                       attr->u.num=(street->str->limit & 0x30) ? AF_ONEWAY:0;
+                       attr->u.num|=(street->str->limit & 0x03) ? AF_ONEWAYREV:0;
                }
                street->attr_next=attr_country_id;
                return 1;
index bb188cd..0a6ad30 100644 (file)
@@ -163,10 +163,10 @@ struct attr_bin debug_attr = {
 };
 char debug_attr_buffer[1024];
 
-struct attr_bin limit_attr = {
-       0, attr_limit
+struct attr_bin flags_attr = {
+       0, attr_flags
 };
-int limit_attr_value;
+int flags_attr_value;
 
 static void
 pad_text_attr(struct attr_bin *a, char *buffer)
@@ -218,12 +218,12 @@ add_tag(char *k, char *v)
                level=7;
        if (! strcmp(k,"oneway")) {
                if (! strcmp(v,"true") || !strcmp(v,"yes")) {
-                       limit_attr_value=1;
-                       limit_attr.len=2;
+                       flags_attr_value=AF_ONEWAY;
+                       flags_attr.len=2;
                }
                if (! strcmp(v,"-1")) {
-                       limit_attr_value=2;
-                       limit_attr.len=2;
+                       flags_attr_value=AF_ONEWAYREV;
+                       flags_attr.len=2;
                }
                if (!in_way)
                        level=6;
@@ -459,7 +459,7 @@ add_way(int id)
        item.type=type_street_unkn;
        label_attr.len=0;
        debug_attr.len=0;
-       limit_attr.len=0;
+       flags_attr.len=0;
        sprintf(debug_attr_buffer,"way_id=%d", wayid);
 }
 
@@ -497,15 +497,15 @@ end_way(FILE *out)
                alen+=label_attr.len+1; 
        if (debug_attr.len)
                alen+=debug_attr.len+1; 
-       if (limit_attr.len)
-               alen+=limit_attr.len+1; 
+       if (flags_attr.len)
+               alen+=flags_attr.len+1; 
        item.clen=coord_count*2;
        item.len=item.clen+2+alen;
        fwrite(&item, sizeof(item), 1, out);
        fwrite(coord_buffer, coord_count*sizeof(struct coord), 1, out);
        write_attr(out, &label_attr, label_attr_buffer);
        write_attr(out, &debug_attr, debug_attr_buffer);
-       write_attr(out, &limit_attr, &limit_attr_value);
+       write_attr(out, &flags_attr, &flags_attr_value);
 }
 
 static void
index 3c60490..002ab58 100644 (file)
@@ -63,7 +63,7 @@ struct route_graph_segment {
        struct route_graph_point *start;
        struct route_graph_point *end;
        struct item item;
-       int limit;
+       int flags;
        int len;
 };
 
@@ -395,7 +395,7 @@ route_graph_free_points(struct route_graph *this)
 }
 
 static void
-route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, struct route_graph_point *end, int len, struct item *item, int limit)
+route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, struct route_graph_point *end, int len, struct item *item, int flags)
 {
        struct route_graph_segment *s;
        s=g_new0(struct route_graph_segment,1);
@@ -408,7 +408,7 @@ route_graph_add_segment(struct route_graph *this, struct route_graph_point *star
        g_assert(len >= 0);
        s->len=len;
        s->item=*item;
-       s->limit=limit;
+       s->flags=flags;
        s->next=this->route_segments;
        this->route_segments=s;
        if (debug_route)
@@ -673,7 +673,7 @@ route_process_street_graph(struct route_graph *this, struct item *item)
                }
                e_pnt=route_graph_add_point(this,&l);
                g_assert(len >= 0);
-               if (item_attr_get(item, attr_limit, &attr)) 
+               if (item_attr_get(item, attr_flags, &attr)) 
                        route_graph_add_segment(this, s_pnt, e_pnt, len, item, attr.u.num);
                else
                        route_graph_add_segment(this, s_pnt, e_pnt, len, item, 0);
@@ -729,14 +729,14 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedli
        heap = fh_makeheap();   
        fh_setcmp(heap, compare);
 
-       if (! (sd->limit & 2)) {
+       if (! (sd->flags & AF_ONEWAYREV)) {
                end=route_graph_get_point(this, &sd->c[0]);
                g_assert(end != 0);
                end->value=route_value(speedlist, &sd->item, route_info_length(NULL, dst, -1));
                end->el=fh_insert(heap, end);
        }
 
-       if (! (sd->limit & 1)) {
+       if (! (sd->flags & AF_ONEWAY)) {
                end=route_graph_get_point(this, &sd->c[sd->count-1]);
                g_assert(end != 0);
                end->value=route_value(speedlist, &sd->item, route_info_length(NULL, dst, 1));
@@ -761,7 +761,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedli
                        new=min+val;
                        if (debug_route)
                                printf("begin %d len %d vs %d (0x%x,0x%x)\n",new,val,s->end->value, s->end->c.x, s->end->c.y);
-                       if (new < s->end->value && !(s->limit & 1)) {
+                       if (new < s->end->value && !(s->flags & AF_ONEWAY)) {
                                s->end->value=new;
                                s->end->seg=s;
                                if (! s->end->el) {
@@ -787,7 +787,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedli
                        new=min+val;
                        if (debug_route)
                                printf("end %d len %d vs %d (0x%x,0x%x)\n",new,val,s->start->value,s->start->c.x, s->start->c.y);
-                       if (new < s->start->value && !(s->limit & 2)) {
+                       if (new < s->start->value && !(s->flags & AF_ONEWAYREV)) {
                                old=s->start->value;
                                s->start->value=new;
                                s->start->seg=s;
@@ -826,14 +826,14 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in
        struct street_data *sd=pos->street;
        struct route_path *ret;
 
-       if (! (sd->limit & 1)) {
+       if (! (sd->flags & AF_ONEWAY)) {
                start1=route_graph_get_point(this, &sd->c[0]);
                if (! start1)
                        return NULL;
                val1=start1->value+route_value(speedlist, &sd->item, route_info_length(pos, NULL, -1));
                dbg(1,"start1: %d(route)+%d=%d\n", start1->value, val1-start1->value, val1);
        }
-       if (! (sd->limit & 2)) {
+       if (! (sd->flags & AF_ONEWAYREV)) {
                start2=route_graph_get_point(this, &sd->c[sd->count-1]);
                if (! start2)
                        return NULL;
@@ -881,7 +881,7 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in
        }
        sd=dst->street;
        dbg(1,"start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y);
-       dbg(1,"dst sd->limit=%d sd->c[0]=0x%x,0x%x sd->c[sd->count-1]=0x%x,0x%x\n", sd->limit, sd->c[0].x,sd->c[0].y, sd->c[sd->count-1].x, sd->c[sd->count-1].y);
+       dbg(1,"dst sd->flags=%d sd->c[0]=0x%x,0x%x sd->c[sd->count-1]=0x%x,0x%x\n", sd->flags, sd->c[0].x,sd->c[0].y, sd->c[sd->count-1].x, sd->c[sd->count-1].y);
        if (start->c.x == sd->c[0].x && start->c.y == sd->c[0].y)
                dst->dir=-1;
        else if (start->c.x == sd->c[sd->count-1].x && start->c.y == sd->c[sd->count-1].y)
@@ -976,10 +976,10 @@ street_get_data (struct item *item)
        ret=g_malloc(sizeof(struct street_data)+count*sizeof(struct coord));
        ret->item=*item;
        ret->count=count;
-       if (item_attr_get(item, attr_limit, &attr)) 
-               ret->limit=attr.u.num;
+       if (item_attr_get(item, attr_flags, &attr)) 
+               ret->flags=attr.u.num;
        else
-               ret->limit=0;
+               ret->flags=0;
        memcpy(ret->c, c, count*sizeof(struct coord));
 
        return ret;
@@ -1018,12 +1018,24 @@ route_find_nearest_street(struct mapset *ms, struct pcoord *pc)
        struct coord lp, sc[1000];
        struct street_data *sd;
        struct coord c;
+       struct coord_geo g;
 
        c.x = pc->x;
        c.y = pc->y;
+       /*
+        * This is not correct for two reasons:
+        * - You may need to go back first
+        * - Currently we allow mixing of mapsets
+        */
        sel = route_rect(18, &c, &c, 0, max_dist);
        h=mapset_open(ms);
        while ((m=mapset_next(h,1))) {
+               c.x = pc->x;
+               c.y = pc->y;
+               if (map_projection(m) != pc->pro) {
+                       transform_to_geo(pc->pro, &c, &g);
+                       transform_from_geo(map_projection(m), &g, &c);
+               }
                mr=map_rect_new(m, sel);
                while ((item=map_rect_get_item(mr))) {
                        if (item->type >= type_street_0 && item->type <= type_ferry) {
index bf2c18c..d4f9f5d 100644 (file)
@@ -14,7 +14,7 @@ struct route_crossings {
 struct street_data {
        struct item item;
        int count;
-       int limit;
+       int flags;
        struct coord c[0];
 };
 
index 73c87cf..fb75bd2 100644 (file)
@@ -247,7 +247,7 @@ tracking_update(struct tracking *tr, struct coord *c, int angle)
        while (t) {
                struct street_data *sd=t->street;
                int dir;
-               switch(sd->limit & 3) {
+               switch(sd->flags & AF_ONEWAYMASK) {
                case 0:
                        dir=0;
                        break;