struct navit *navit;
struct callback *callback;
struct log *log;
+ struct route *route;
} u;
};
ATTR(navit)
ATTR(log)
ATTR(callback)
+ATTR(route)
ATTR2(0x0008ffff,type_object_end)
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) {
}
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;
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
}
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);
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);
}
#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");
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);
if (s) {
setenv("SDL_WINDOWID", s, 0);
}
+ route_init();
config_file=NULL;
if (argc > 1)
config_file=argv[1];
#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;
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;
}
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)
{
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;
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;
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
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;
}
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)
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
g_free(this_);
}
-void
-navit_toggle_routegraph_display(struct navit *nav)
-{
- if (!nav->route)
- return;
- route_toggle_routegraph_display(nav->route);
- navit_draw(nav);
-}
-
/** @} */
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_);
#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;
struct route {
int version;
struct mapset *ms;
- struct map route_map;
unsigned flags;
struct route_info *pos;
struct route_info *dst;
{
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)
}
if (this->pos)
route_info_free(this->pos);
+ this->pos=NULL;
ret->c=*c;
ret->lp=*c;
ret->pos=tracking_get_segment_pos(tracking);
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)
{
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);
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);
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;
};
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)
{
}
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:
mr->pos_next=2;
break;
case 2:
- mr->segsdone = 1;
- if (r->flags & RF_SHOWGRAPH)
- goto rep;
return NULL;
}
mr->seg = seg;
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,
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)
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);
+}
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
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);
#include "coord.h"
#include "item.h"
#include "navit.h"
+#include "map.h"
#include "route.h"
#include "callback.h"
#include "transform.h"
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");
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);
if (priv->position_set)
callback_list_call_0(priv->cbl);
}
+ if (mr)
+ map_rect_destroy(mr);
return 1;
}