Add:Core:More support for waypoints
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 3 Sep 2010 09:58:39 +0000 (09:58 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 3 Sep 2010 09:58:39 +0000 (09:58 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@3552 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/bookmarks.c
navit/navit/navit.c
navit/navit/route.c
navit/navit/route.h

index c05d249..3938498 100644 (file)
@@ -666,7 +666,10 @@ bookmarks_append_coord(struct bookmarks *this_, char *file, struct pcoord *c, in
        if (f) {
                if (c) {
                        int i;
-                       fprintf(f,"type=%s label=\"%s\"\n", type, description);
+                       if (description) 
+                               fprintf(f,"type=%s label=\"%s\"\n", type, description);
+                       else
+                               fprintf(f,"type=%s\n", type);
                        for (i = 0 ; i < count ; i++) {
                                prostr = projection_to_name(c[i].pro,NULL);
                                fprintf(f,"%s%s%s0x%x %s0x%x\n",
index 5952cbc..5361407 100644 (file)
@@ -860,6 +860,34 @@ navit_set_destination(struct navit *this_, struct pcoord *c, const char *descrip
 }
 
 /**
+ * Start the route computing to a given set of coordinates including waypoints
+ *
+ * @param navit The navit instance
+ * @param c The coordinate to start routing to
+ * @param description A label which allows the user to later identify this destination in the former destinations selection
+ * @returns nothing
+ */
+void
+navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async)
+{
+       if (c && count) {
+               this_->destination=c[count-1];
+               this_->destination_valid=1;
+       } else
+               this_->destination_valid=0;
+       char *destination_file = bookmarks_get_destination_file(TRUE);
+       bookmarks_append_coord(this_->bookmarks, destination_file, c, count, "former_itinerary", description, NULL, this_->recentdest_count);
+       g_free(destination_file);
+       callback_list_call_attr_0(this_->attr_cbl, attr_destination);
+       if (this_->route) {
+               route_set_destinations(this_->route, c, count, async);
+
+               if (this_->ready == 3)
+                       navit_draw(this_);
+       }
+}
+
+/**
  * @brief Checks if a route is calculated
  *
  * This function checks if a route is calculated.
@@ -899,7 +927,7 @@ navit_add_former_destinations_from_file(struct navit *this_)
 {
        char *destination_file = bookmarks_get_destination_file(FALSE);
        struct attr parent={attr_navit, .u.navit=this_};
-       struct attr type={attr_type, {"textfile"}}, data={attr_data, {destination_file}}, flags={attr_flags, {1}};
+       struct attr type={attr_type, {"textfile"}}, data={attr_data, {destination_file}}, flags={attr_flags, {(void *)1}};
        struct attr *attrs[]={&type, &data, &flags, NULL};
        struct map_rect *mr;
        struct item *item;
@@ -1987,10 +2015,12 @@ navit_vehicle_update(struct navit *this_, struct navit_vehicle *nv)
        struct pcoord cursor_pc;
        struct point cursor_pnt, *pnt=&cursor_pnt;
        struct tracking *tracking=NULL;
+       struct pcoord pc[16];
        enum projection pro=transform_get_projection(this_->trans);
-       int border=16;
+       int count,border=16;
        int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *);
        void *attr_object;
+       char *destination_file;
 
        profile(0,NULL);
        if (this_->ready != 3) {
@@ -2057,6 +2087,9 @@ navit_vehicle_update(struct navit *this_, struct navit_vehicle *nv)
                switch(route_destination_reached(this_->route)) {
                case 1:
                        route_remove_waypoint(this_->route);
+                       count=route_get_destinations(this_->route, pc, 16);
+                       destination_file = bookmarks_get_destination_file(TRUE);
+                       bookmarks_append_coord(this_->bookmarks, destination_file, pc, count, "former_itinerary_part", NULL, NULL, this_->recentdest_count);
                        break;  
                case 2:
                        navit_set_destination(this_, NULL, NULL, 0);
index b6571b3..4b9d417 100644 (file)
@@ -1035,6 +1035,23 @@ route_set_destinations(struct route *this, struct pcoord *dst, int count, int as
        route_path_update(this, 1, async);
        profile(0,"end");
 }
+
+int
+route_get_destinations(struct route *this, struct pcoord *pc, int count)
+{
+       int ret=0;
+       GList *l=this->destinations;
+       while (l && ret < count) {
+               struct route_info *dst=l->data;
+               pc->x=dst->c.x;
+               pc->y=dst->c.y;
+               pc->pro=projection_mg; /* FIXME */
+               pc++;
+               ret++;
+               l=g_list_next(l);
+       }
+       return ret;
+}
  
 void
 route_set_destination(struct route *this, struct pcoord *dst, int async)
index 3878ec4..0781339 100644 (file)
@@ -66,63 +66,46 @@ struct street_data {
 };
 
 /* prototypes */
-enum item_type;
+enum attr_type;
+enum projection;
+struct attr;
+struct attr_iter;
 struct coord;
-struct displaylist;
 struct item;
+struct map;
 struct map_selection;
 struct mapset;
+struct pcoord;
 struct route;
 struct route_info;
-struct route_info_handle;
-struct route_path_coord_handle;
-struct route_path_handle;
-struct route_path_segment;
-struct route_preferences;
 struct street_data;
 struct tracking;
-struct transformation;
+struct vehicleprofile;
 struct route *route_new(struct attr *parent, struct attr **attrs);
-void route_set_mapset(struct route *, struct mapset *ms);
-void route_set_profile(struct route *, struct vehicleprofile *prof);
-struct mapset *route_get_mapset(struct route *);
-struct route_info *route_get_pos(struct route *);
-struct route_info *route_get_dst(struct route *);
-int *route_get_speedlist(struct route *);
-int route_get_path_set(struct route *);
-int route_set_speed(struct route *, enum item_type type, int value);
-int route_contains(struct route *, struct item *item);
-void route_set_position(struct route *, struct pcoord *pos);
-void route_set_position_from_tracking(struct route *, struct tracking *tracking, enum projection pro);
+void route_set_mapset(struct route *this, struct mapset *ms);
+void route_set_profile(struct route *this, struct vehicleprofile *prof);
+struct mapset *route_get_mapset(struct route *this);
+struct route_info *route_get_pos(struct route *this);
+struct route_info *route_get_dst(struct route *this);
+int route_get_path_set(struct route *this);
+int route_contains(struct route *this, struct item *item);
+int route_destination_reached(struct route *this);
+void route_set_position(struct route *this, struct pcoord *pos);
+void route_set_position_from_tracking(struct route *this, struct tracking *tracking, enum projection pro);
 struct map_selection *route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs);
-void route_set_destination(struct route *, struct pcoord *dst, int async);
-struct route_path_handle *route_path_open(struct route *);
-struct route_path_segment *route_path_get_segment(struct route_path_handle *h);
-struct coord *route_path_segment_get_start(struct route_path_segment *s);
-struct coord *route_path_segment_get_end(struct route_path_segment *s);
-struct item *route_path_segment_get_item(struct route_path_segment *s);
-int route_path_segment_get_length(struct route_path_segment *s);
-int route_path_segment_get_time(struct route_path_segment *s);
-void route_path_close(struct route_path_handle *h);
-struct route_path_coord_handle *route_path_coord_open(struct route *);
-struct coord *route_path_coord_get(struct route_path_coord_handle *h);
-void route_path_coord_close(struct route_path_coord_handle *h);
-int route_time(struct route_preferences *preferences, struct item *item, int len, int maxspeed);
-int route_info_length(struct route_info *pos, struct route_info *dst, int dir);
+void route_set_destinations(struct route *this, struct pcoord *dst, int count, int async);
+int route_get_destinations(struct route *this, struct pcoord *pc, int count);
+void route_set_destination(struct route *this, struct pcoord *dst, int async);
+void route_remove_waypoint(struct route *this);
+struct coord route_get_coord_dist(struct route *this_, int dist);
 struct street_data *street_get_data(struct item *item);
 struct street_data *street_data_dup(struct street_data *orig);
 void street_data_free(struct street_data *sd);
 void route_info_free(struct route_info *inf);
 struct street_data *route_info_street(struct route_info *rinf);
-struct coord *route_info_point(struct route_info *rinf, int point);
-struct route_info_handle *route_info_open(struct route_info *start, struct route_info *end, int dir);
-struct coord *route_info_get(struct route_info_handle *h);
-void route_info_close(struct route_info_handle *h);
-void route_draw(struct route *, struct transformation *t, struct displaylist *dsp);
-struct map *route_get_map(struct route *route);
-struct map *route_get_graph_map(struct route *route);
+struct map *route_get_map(struct route *this_);
+struct map *route_get_graph_map(struct route *this_);
 void route_set_projection(struct route *this_, enum projection pro);
-int route_destination_reached(struct route *);
 void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async);
 int route_set_attr(struct route *this_, struct attr *attr);
 int route_add_attr(struct route *this_, struct attr *attr);
@@ -131,10 +114,7 @@ struct attr_iter * route_attr_iter_new(void);
 void route_attr_iter_destroy(struct attr_iter *iter);
 int route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter);
 void route_init(void);
-int route_pos_contains(struct route *, struct item *item);
-struct coord route_get_coord_dist(struct route *this_, int dist);
 void route_destroy(struct route *this_);
-
 /* end of prototypes */
 #ifdef __cplusplus
 }