Add:Core:Better support for route map
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 28 Dec 2007 10:04:39 +0000 (10:04 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 28 Dec 2007 10:04:39 +0000 (10:04 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@674 ffa7fe5e-494d-0410-b361-a75ebd5db220

13 files changed:
navit/src/attr.h
navit/src/attr_def.h
navit/src/graphics.c
navit/src/graphics.h
navit/src/main.c
navit/src/map.c
navit/src/map.h
navit/src/navit.c
navit/src/navit.h
navit/src/route.c
navit/src/route.h
navit/src/track.c
navit/src/vehicle/demo/vehicle_demo.c

index 13b935c..e3ddeb4 100644 (file)
@@ -37,6 +37,7 @@ struct attr {
                struct navit *navit;
                struct callback *callback;
                struct log *log;
+               struct route *route;
        } u;
 };
 
index 17940f9..299001f 100644 (file)
@@ -94,4 +94,5 @@ ATTR2(0x00080000,type_object_begin)
 ATTR(navit)
 ATTR(log)
 ATTR(callback)
+ATTR(route)
 ATTR2(0x0008ffff,type_object_end)
index 815fcd7..dc2e631 100644 (file)
@@ -475,6 +475,10 @@ do_draw_map(struct displaylist *displaylist, struct transformation *t, struct ma
                mr=map_rect_new(m, route_selection);
        else
                mr=map_rect_new(m, sel);
+       if (! mr) {
+               map_selection_destroy(sel);
+               return;
+       }
        while ((item=map_rect_get_item(mr))) {
                count=item_coord_get(item, ca, item->type < type_line ? 1: max);
                if (item->type >= type_line && count < 2) {
@@ -518,7 +522,7 @@ do_draw_map(struct displaylist *displaylist, struct transformation *t, struct ma
 }
 
 static void
-do_draw(struct displaylist *displaylist, struct transformation *t, GList *mapsets, int order, struct route *route)
+do_draw(struct displaylist *displaylist, struct transformation *t, GList *mapsets, int order)
 {
        struct mapset *ms;
        struct map *m;
@@ -532,11 +536,6 @@ do_draw(struct displaylist *displaylist, struct transformation *t, GList *mapset
                do_draw_map(displaylist, t, m, order);
        }
        mapset_close(h);
-       if (route) {
-               m = route_get_map(route);
-               if (m)
-                       do_draw_map(displaylist, t, m, order);
-       }
 }
 
 int
@@ -546,7 +545,7 @@ graphics_ready(struct graphics *this_)
 }
 
 void
-graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, GList *layouts, struct route *route)
+graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, GList *layouts)
 {
        int order=transform_get_order(trans);
        gra->meth.draw_mode(gra->priv, draw_mode_begin);
@@ -573,7 +572,7 @@ graphics_displaylist_move(struct displaylist *displaylist, int dx, int dy)
 
 
 void
-graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, GList *layouts, struct route *route)
+graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, GList *layouts)
 {
        int order=transform_get_order(trans);
 
@@ -593,9 +592,9 @@ graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *maps
        }
 #endif
        profile(0,NULL);
-       do_draw(displaylist, trans, mapsets, order, route);
+       do_draw(displaylist, trans, mapsets, order);
        profile(1,"do_draw");
-       graphics_displaylist_draw(gra, displaylist, trans, layouts, route);
+       graphics_displaylist_draw(gra, displaylist, trans, layouts);
        profile(1,"xdisplay_draw");
        profile(0,"end");
   
index 33ccd18..47fc321 100644 (file)
@@ -117,7 +117,9 @@ void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct
 void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h);
 void display_add(struct displaylist *displaylist, struct item *item, int count, struct point *pnt, char *label);
 int graphics_ready(struct graphics *this_);
+void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, GList *layouts);
 void graphics_displaylist_move(struct displaylist *displaylist, int dx, int dy);
+void graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, GList *layouts);
 struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist);
 struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh);
 void graphics_displaylist_close(struct displaylist_handle *dlh);
index 0acdfff..020b7d4 100644 (file)
@@ -137,6 +137,7 @@ int main(int argc, char **argv)
        if (s) {
                setenv("SDL_WINDOWID", s, 0);
        }
+       route_init();
        config_file=NULL;
        if (argc > 1) 
                config_file=argv[1];
index f7a872d..c86ad5b 100644 (file)
 #include "plugin.h"
 #include "country.h"
 
+
+struct map {
+       struct map_methods meth;
+       struct map_priv *priv;
+       char *type;
+       char *filename;
+       int active;
+};
+
 struct map_rect {
        struct map *m;
        struct map_rect_priv *priv;
@@ -106,6 +115,10 @@ map_rect_new(struct map *m, struct map_selection *sel)
        mr=g_new0(struct map_rect, 1);
        mr->m=m;
        mr->priv=m->meth.map_rect_new(m->priv, sel);
+       if (! mr->priv) {
+               g_free(mr);
+               mr=NULL;
+       }
 
        return mr;
 }
index 9392a20..74da1a3 100644 (file)
@@ -29,14 +29,6 @@ struct map_methods {
        struct item *           (*map_search_get_item)(struct map_search_priv *ms);
 };
 
-struct map {
-       struct map_methods meth;
-       struct map_priv *priv;
-       char *type;
-       char *filename;
-       int active;
-};
-
 static inline int
 map_selection_contains_point(struct map_selection *sel, struct coord *c)
 {
index ab18bf1..8cf7454 100644 (file)
@@ -71,6 +71,8 @@ struct navit {
        struct statusbar *statusbar;
        struct menu *menubar;
        struct route *route;
+       struct map *route_map;
+       struct map *route_graph_map;
        struct navigation *navigation;
        struct speech *speech;
        struct tracking *tracking;
@@ -133,7 +135,7 @@ navit_draw(struct navit *this_)
        struct navit_vehicle *nv;
 
        transform_setup_source_rect(this_->trans);
-       graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts, this_->route);
+       graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts);
        l=this_->vehicles;
        while (l) {
                nv=l->data;
@@ -146,9 +148,8 @@ navit_draw(struct navit *this_)
 void
 navit_draw_displaylist(struct navit *this_)
 {
-       if (this_->ready) {
-               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts, this_->route);
-       }
+       if (this_->ready) 
+               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts);
 }
 
 static void
@@ -233,7 +234,7 @@ navit_motion_timeout(void *data)
        if (dx || dy) {
                this_->last=this_->current;
                graphics_displaylist_move(this_->displaylist, dx, dy);
-               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts, this_->route);
+               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts);
                this_->moved=1;
        }
        this_->motion_timeout=0;
@@ -1020,6 +1021,10 @@ navit_init(struct navit *this_)
        }
        if (this_->mapsets) {
                ms=this_->mapsets->data;
+               if (this_->route_map)
+                       mapset_add(ms, this_->route_map);
+               if (this_->route_graph_map)
+                       mapset_add(ms, this_->route_graph_map);
                if (this_->route)
                        route_set_mapset(this_->route, ms);
                if (this_->tracking)
@@ -1323,7 +1328,20 @@ navit_tracking_add(struct navit *this_, struct tracking *tracking)
 void
 navit_route_add(struct navit *this_, struct route *route)
 {
+       struct attr route_attr={.type=attr_route,.u.route=route};
+       struct attr data_attr={.type=attr_data,.u.str=""};
+       struct attr *attrs_route[]={&route_attr, &data_attr, NULL};
+       struct attr *attrs_route_graph[]={&route_attr, &data_attr, NULL};
        this_->route=route;
+       this_->route_map=map_new("route",attrs_route);
+       this_->route_graph_map=map_new("route_graph",attrs_route_graph);
+       map_set_active(this_->route_graph_map, 0);
+}
+
+struct map *
+navit_get_route_map(struct navit *this_)
+{
+       return this_->route_map;
 }
 
 void
@@ -1377,13 +1395,4 @@ navit_destroy(struct navit *this_)
        g_free(this_);
 }
 
-void
-navit_toggle_routegraph_display(struct navit *nav)
-{
-       if (!nav->route)
-               return;
-       route_toggle_routegraph_display(nav->route);
-       navit_draw(nav);
-}
-
 /** @} */
index 812d73d..20588d3 100644 (file)
@@ -72,6 +72,7 @@ void navit_remove_init_cb(struct navit *this_, struct callback *cb);
 void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv);
 void navit_tracking_add(struct navit *this_, struct tracking *tracking);
 void navit_route_add(struct navit *this_, struct route *route);
+struct map *navit_get_route_map(struct navit *this_);
 void navit_navigation_add(struct navit *this_, struct navigation *navigation);
 void navit_set_speech(struct navit *this_, struct speech *speech);
 struct gui *navit_get_gui(struct navit *this_);
index 74bd7cb..61dac6d 100644 (file)
 #include "point.h"
 #include "graphics.h"
 #include "transform.h"
+#include "plugin.h"
 #include "fib.h"
 
-#if 0
-static int speed_list[]={
-       10, /* street_0 */
-       10, /* street_1_city */
-       30, /* street_2_city */
-       40, /* street_3_city */
-       50, /* street_4_city */
-       80, /* highway_city */
-       60, /* street_1_land */
-       65, /* street_2_land */
-       70, /* street_3_land */
-       80, /* street_4_land */
-       120, /* street_n_lanes */
-       120, /* highway_land */
-       40, /* ramp */
-       30, /* ferry */
+
+struct map_priv {
+       struct route *route;
 };
-#endif
 
 int debug_route=0;
 
@@ -106,7 +93,6 @@ struct route_path {
 struct route {
        int version;
        struct mapset *ms;
-       struct map route_map;
        unsigned flags;
        struct route_info *pos;
        struct route_info *dst;
@@ -253,6 +239,7 @@ route_set_position(struct route *this, struct pcoord *pos)
 {
        if (this->pos)
                route_info_free(this->pos);
+       this->pos=NULL;
        this->pos=route_find_nearest_street(this->ms, pos);
        dbg(1,"this->pos=%p\n", this->pos);
        if (! this->pos)
@@ -276,6 +263,7 @@ route_set_position_from_tracking(struct route *this, struct tracking *tracking)
        }
        if (this->pos)
                route_info_free(this->pos);
+       this->pos=NULL;
        ret->c=*c;
        ret->lp=*c;
        ret->pos=tracking_get_segment_pos(tracking);
@@ -646,113 +634,6 @@ route_path_close(struct route_path_handle *h)
        g_free(h);
 }
 
-struct route_path_coord_handle {
-       struct route *route;
-       int pos;        /* -1 = Begin, 0 = Middle, 1 = End */
-       int dir;
-       int spos;
-       struct coord last;
-       struct route_info_handle *ri;
-       struct route_path_handle *rp;
-       struct street_data *street_data;
-};
-
-struct route_path_coord_handle *
-route_path_coord_open(struct route *this)
-{
-       struct route_path_coord_handle *ret;
-
-       if (! route_get_pos(this) || ! route_get_dst(this))
-               return NULL;
-
-       ret=g_new0(struct route_path_coord_handle, 1);
-       if (!ret) {
-               printf("%s:Out of memory\n", __FUNCTION__);
-               return ret;
-       }
-       ret->route=this;
-       ret->ri=route_info_open(route_get_pos(this), route_get_dst(this), 0);
-       if (!ret->ri) {
-               ret->ri=route_info_open(route_get_pos(this), NULL, 0);
-               ret->pos=-1;
-       }
-       else
-               ret->pos=1;
-       return ret;
-}
-
-struct coord *
-route_path_coord_get(struct route_path_coord_handle *h)
-{
-       struct coord *c;
-       struct route_path_segment *seg;
-       struct item *item, *item2;
-       struct map_rect *mr;
-
-       switch(h->pos) {
-       case -1:
-               c=route_info_get(h->ri);
-               if (c) {
-                       h->last=*c;
-                       return c;
-               }
-               h->pos=0;
-               h->rp=route_path_open(h->route);
-       case 0:
-               if (! h->street_data && h->rp) {
-                       seg=route_path_get_segment(h->rp);
-                       if (seg) {
-                               item=route_path_segment_get_item(seg);
-                               mr=map_rect_new(item->map,NULL);
-                               item2=map_rect_get_item_byid(mr, item->id_hi, item->id_lo);
-                               h->street_data=street_get_data(item2);
-                               map_rect_destroy(mr);
-                               if (h->street_data->c[0].x == h->last.x && h->street_data->c[0].y == h->last.y) {
-                                       h->spos=1;
-                                       h->dir=1;
-                               } else {
-                                       h->spos=h->street_data->count-2;
-                                       h->dir=-1;
-                               }
-                       }
-               }
-               if (h->street_data) {
-                       c=&h->street_data->c[h->spos];
-                       h->last=*c;
-                       h->spos+=h->dir;
-                       if (h->spos < 0 || h->spos >= h->street_data->count) {
-                               street_data_free(h->street_data);
-                               h->street_data=NULL;
-                       }
-                       return c;
-               }
-               h->pos=1;
-       case 1: 
-               c=route_info_get(h->ri);
-               if (c) {
-                       h->last=*c;
-                       return c;
-               }
-               h->pos=2;
-       default:
-               return NULL;
-       }
-
-}
-
-void
-route_path_coord_close(struct route_path_coord_handle *h)
-{
-       if (h->street_data)
-               street_data_free(h->street_data);       
-       if (h->rp)
-               route_path_close(h->rp);
-       if (h->ri)
-               route_info_close(h->ri);
-       g_free(h);
-}
-
-
 static void
 route_graph_free_segments(struct route_graph *this)
 {
@@ -1116,6 +997,8 @@ route_graph_build(struct mapset *ms, struct coord *c1, struct coord *c2)
        h=mapset_open(ms);
        while ((m=mapset_next(h,1))) {
                mr=map_rect_new(m, sel);
+               if (! mr)
+                       continue;
                while ((item=map_rect_get_item(mr))) {
                        if (item->type >= type_street_0 && item->type <= type_ferry) {
                                route_process_street_graph(ret, item);
@@ -1218,6 +1101,8 @@ route_find_nearest_street(struct mapset *ms, struct pcoord *pc)
                        transform_from_geo(map_projection(m), &g, &c);
                }
                mr=map_rect_new(m, sel);
+               if (! mr)
+                       continue;
                while ((item=map_rect_get_item(mr))) {
                        if (item->type >= type_street_0 && item->type <= type_ferry) {
                                sd=street_get_data(item);
@@ -1454,11 +1339,10 @@ struct map_rect_priv {
        struct route_info_handle *ri;
        int pos_next;
        int pos;
-       struct route *mpriv;
+       struct map_priv *mpriv;
        struct item item;
        unsigned int last_coord;
        struct route_path_segment *seg;
-       int segsdone;
        struct route_graph_point *point;
        char *label;
 };
@@ -1575,25 +1459,43 @@ static struct item_methods methods_point_item = {
 static void
 rm_destroy(struct map_priv *priv)
 {
+       g_free(priv);
 }
 
 static struct map_rect_priv * 
-rm_rect_new(struct map_priv *map, struct map_selection *sel)
+rm_rect_new(struct map_priv *priv, struct map_selection *sel)
 {
-       struct route *route=(struct route *)map;
        struct map_rect_priv * mr;
        dbg(1,"enter\n");
+       if (! route_get_pos(priv->route))
+               return NULL;
+       if (! route_get_dst(priv->route))
+               return NULL;
+       if (! priv->route->path2)
+               return NULL;
        mr=g_new0(struct map_rect_priv, 1);
-       mr->mpriv = route;
-       mr->ri=route_info_open(route_get_pos(route), route_get_dst(route), 0);
+       mr->mpriv = priv;
+       mr->ri=route_info_open(route_get_pos(priv->route), route_get_dst(priv->route), 0);
        mr->pos_next=1;
        if (!mr->ri) {
-               mr->ri=route_info_open(route_get_pos(route), NULL, 0);
+               mr->ri=route_info_open(route_get_pos(priv->route), NULL, 0);
                mr->pos_next=-1;
        }
        return mr;
 }
 
+static struct map_rect_priv * 
+rp_rect_new(struct map_priv *priv, struct map_selection *sel)
+{
+       struct map_rect_priv * mr;
+       dbg(1,"enter\n");
+       if (! priv->route->graph || ! priv->route->graph->route_points)
+               return NULL;
+       mr=g_new0(struct map_rect_priv, 1);
+       mr->mpriv = priv;
+       return mr;
+}
+
 static void
 rm_rect_destroy(struct map_rect_priv *mr)
 {
@@ -1605,37 +1507,35 @@ rm_rect_destroy(struct map_rect_priv *mr)
 }
 
 static struct item *
+rp_get_item(struct map_rect_priv *mr)
+{
+       struct route *r = mr->mpriv->route;
+       struct route_graph_point *p = mr->point;
+
+       if (!p)
+               p = r->graph->route_points;
+       else
+               p = p->next;
+       if (!p)
+               return NULL;
+       mr->point = p;
+       mr->last_coord = 0;
+       mr->item.id_hi = 0;
+       mr->item.id_lo = 0;
+       mr->item.map = NULL;
+       mr->item.priv_data = mr;
+       mr->item.type = type_rg_point;
+       mr->item.meth = &methods_point_item;
+       return &mr->item;
+}
+
+static struct item *
 rm_get_item(struct map_rect_priv *mr)
 {
-       struct route *r = mr->mpriv;
+       struct route *r = mr->mpriv->route;
        struct route_path_segment *seg = mr->seg;
        dbg(1,"enter\n", mr->pos);
 
-rep:
-       if (mr->segsdone) {
-               if (!(r->flags & RF_SHOWGRAPH))
-                       return NULL;
-               else {
-                       struct route_graph_point *p = mr->point;
-                       if (!p)
-                               p = r->graph->route_points;
-                       else
-                               p = p->next;
-                       if (!p)
-                               return NULL;
-                       mr->point = p;
-                       mr->last_coord = 0;
-                       mr->item.id_hi = 0;
-                       mr->item.id_lo = 0;
-                       mr->item.map = NULL;
-//                     mr->item = NULL;
-                       mr->item.priv_data = mr;
-                       mr->item.type = type_rg_point;
-                       mr->item.meth = &methods_point_item;
-                       return &mr->item;
-               }
-       }
-
        mr->pos=mr->pos_next;
        switch(mr->pos) {
        case -1:
@@ -1657,9 +1557,6 @@ rep:
                mr->pos_next=2;
                break;
        case 2:
-               mr->segsdone = 1;
-               if (r->flags & RF_SHOWGRAPH)
-                       goto rep;
                return NULL;
        }
        mr->seg = seg;
@@ -1676,12 +1573,12 @@ rep:
 static struct item *
 rm_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo)
 {
-       printf("%s called on Route map\n", __FUNCTION__);
+       dbg(0,"called on Route map\n");
        return NULL;
 }
 
 static struct map_methods route_meth = {
-       projection_none,
+       projection_mg,
        NULL,
        rm_destroy,
        rm_rect_new,
@@ -1693,27 +1590,18 @@ static struct map_methods route_meth = {
        NULL,
 };
 
-static void 
-route_init_map(struct route *route)
-{
-       struct map *m = &route->route_map;
-       m->priv = (struct map_priv *)route;
-       m->type = "Route";
-       m->filename = NULL;
-       m->active = 0;
-       m->meth = route_meth;
-       m->meth.pro = route_projection(route);
-}
-
-struct map *
-route_get_map(struct route *route)
-{
-       if (route->pos && route->dst && route->path2) {
-               route_init_map(route);
-               return &route->route_map;
-       }
-       return NULL;
-}
+static struct map_methods route_graph_meth = {
+       projection_mg,
+       NULL,
+       rm_destroy,
+       rp_rect_new,
+       rm_rect_destroy,
+       rp_get_item,
+       rm_get_item_byid,
+       NULL,
+       NULL,
+       NULL,
+};
 
 void 
 route_toggle_routegraph_display(struct route *route)
@@ -1724,3 +1612,43 @@ route_toggle_routegraph_display(struct route *route)
                route->flags |= RF_SHOWGRAPH;
        }
 }
+
+static struct map_priv *
+route_map_new_helper(struct map_methods *meth, struct attr **attrs, int graph)
+{
+       struct map_priv *ret;
+       struct attr *route_attr;
+
+       route_attr=attr_search(attrs, NULL, attr_route);
+       if (! route_attr)
+               return NULL;
+       ret=g_new0(struct map_priv, 1);
+       if (graph)
+               *meth=route_graph_meth;
+       else
+               *meth=route_meth;
+       ret->route=route_attr->u.route;
+
+       return ret;
+}
+
+static struct map_priv *
+route_map_new(struct map_methods *meth, struct attr **attrs)
+{
+       return route_map_new_helper(meth, attrs, 0);
+}
+
+static struct map_priv *
+route_graph_map_new(struct map_methods *meth, struct attr **attrs)
+{
+       return route_map_new_helper(meth, attrs, 1);
+}
+
+
+
+void
+route_init(void)
+{
+       plugin_register_map_type("route", route_map_new);
+       plugin_register_map_type("route_graph", route_graph_map_new);
+}
index 6455cff..06575e0 100644 (file)
@@ -74,6 +74,7 @@ void route_info_close(struct route_info_handle *h);
 void route_draw(struct route *this, struct transformation *t, struct displaylist *dsp);
 struct map *route_get_map(struct route *route);
 void route_toggle_routegraph_display(struct route *route);
+void route_init(void);
 /* end of prototypes */
 
 #endif
index 268ec6e..1f10d4c 100644 (file)
@@ -123,6 +123,8 @@ tracking_doupdate_lines(struct tracking *tr, struct coord *cc)
         h=mapset_open(tr->ms);
         while ((m=mapset_next(h,1))) {
                mr=map_rect_new(m, sel);
+               if (! mr)
+                       continue;
                while ((item=map_rect_get_item(mr))) {
                        if (item->type >= type_street_0 && item->type <= type_ferry) {
                                street=street_get_data(item);
index a87e873..b6c7e20 100644 (file)
@@ -3,6 +3,7 @@
 #include "coord.h"
 #include "item.h"
 #include "navit.h"
+#include "map.h"
 #include "route.h"
 #include "callback.h"
 #include "transform.h"
@@ -67,9 +68,11 @@ struct vehicle_methods vehicle_demo_methods = {
 static int
 vehicle_demo_timer(struct vehicle_priv *priv)
 {
-       struct route_path_coord_handle *h=NULL;
-       struct coord *c, *pos=NULL, ci;
+       struct coord c, pos, ci;
        int slen, len, dx, dy;
+       struct map *route_map=NULL;
+       struct map_rect *mr=NULL;
+       struct item *item=NULL;
 
        len = (priv->speed * priv->interval / 1000)/ 3.6;
        dbg(1, "###### Entering simulation loop\n");
@@ -77,38 +80,37 @@ vehicle_demo_timer(struct vehicle_priv *priv)
                dbg(1, "vehicle->navit is not set. Can't simulate\n");
                return 1;
        }
-       struct route *vehicle_route = navit_get_route(priv->navit);
-       if (vehicle_route) 
-               h = route_path_coord_open(vehicle_route);
-       if (h) 
-               pos = route_path_coord_get(h);
-       dbg(1, "current pos=%p\n", pos);
-       if (pos) {
+       route_map=navit_get_route_map(priv->navit);
+       if (route_map)
+               mr=map_rect_new(route_map, NULL);
+       if (mr) 
+               item=map_rect_get_item(mr);     
+       if (mr && item_coord_get(item, &pos, 1)) {
                priv->position_set=0;
-               dbg(1, "current pos=0x%x,0x%x\n", pos->x, pos->y);
+               dbg(1, "current pos=0x%x,0x%x\n", pos.x, pos.y);
                dbg(1, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y);
-               if (priv->last.x == pos->x && priv->last.y == pos->y) {
+               if (priv->last.x == pos.x && priv->last.y == pos.y) {
                        dbg(1, "endless loop\n");
                }
-               priv->last = *pos;
-               for (;;) {
-                       c = route_path_coord_get(h);
-                       dbg(1, "next pos=%p\n", c);
-                       if (!c)
-                               break;
-                       dbg(1, "next pos=0x%x,0x%x\n", c->x, c->y);
-                       slen = transform_distance(projection_mg, pos, c);
+               priv->last = pos;
+               while (item) {
+                       if (!item_coord_get(item, &c, 1)) {
+                               item=map_rect_get_item(mr);
+                               continue;
+                       }
+                       dbg(1, "next pos=0x%x,0x%x\n", c.x, c.y);
+                       slen = transform_distance(projection_mg, &pos, &c);
                        dbg(1, "len=%d slen=%d\n", len, slen);
                        if (slen < len) {
                                len -= slen;
                                pos = c;
                        } else {
-                               dx = c->x - pos->x;
-                               dy = c->y - pos->y;
-                               ci.x = pos->x + dx * len / slen;
-                               ci.y = pos->y + dy * len / slen;
+                               dx = c.x - pos.x;
+                               dy = c.y - pos.y;
+                               ci.x = pos.x + dx * len / slen;
+                               ci.y = pos.y + dy * len / slen;
                                priv->direction =
-                                   transform_get_angle_delta(pos, c, 0);
+                                   transform_get_angle_delta(&pos, &c, 0);
                                dbg(1, "ci=0x%x,0x%x\n", ci.x, ci.y);
                                transform_to_geo(projection_mg, &ci,
                                                 &priv->geo);
@@ -120,6 +122,8 @@ vehicle_demo_timer(struct vehicle_priv *priv)
                if (priv->position_set) 
                        callback_list_call_0(priv->cbl);
        }
+       if (mr)
+               map_rect_destroy(mr);
        return 1;
 }