2 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2008 Navit Team
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
34 struct vehicle_priv *priv;
35 struct vehicle_methods meth;
36 struct callback_list *cbl;
37 struct log *nmea_log, *gpx_log;
41 vehicle_log_nmea(struct vehicle *this_, struct log *log)
44 if (!this_->meth.position_attr_get)
46 if (!this_->meth.position_attr_get(this_->priv, attr_position_nmea, &pos_attr))
48 log_write(log, pos_attr.u.str, strlen(pos_attr.u.str));
52 vehicle_log_gpx(struct vehicle *this_, struct log *log)
58 g_get_current_time(&time);
61 if (!this_->meth.position_attr_get)
63 if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr))
66 sprintf(buffer,"<trkpt lat=\"%f\" lon=\"%f\">\n\t<time>%s</time>\n</trkpt>\n",
67 pos_attr.u.coord_geo->lat, pos_attr.u.coord_geo->lng, g_time_val_to_iso8601(&time));
69 sprintf(buffer,"<trkpt lat=\"%f\" lon=\"%f\">\n</trkpt>\n",
70 pos_attr.u.coord_geo->lat, pos_attr.u.coord_geo->lng);
72 log_write(log, buffer, strlen(buffer));
77 vehicle_log_textfile(struct vehicle *this_, struct log *log)
81 if (!this_->meth.position_attr_get)
83 if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr))
85 sprintf(buffer,"%f %f type=trackpoint\n", pos_attr.u.coord_geo->lng, pos_attr.u.coord_geo->lat);
86 log_write(log, buffer, strlen(buffer));
90 vehicle_add_log(struct vehicle *this_, struct log *log)
93 struct attr type_attr;
94 if (!log_get_attr(log, attr_type, &type_attr, NULL))
97 if (!strcmp(type_attr.u.str, "nmea")) {
98 cb=callback_new_2(callback_cast(vehicle_log_nmea), this_, log);
99 } else if (!strcmp(type_attr.u.str, "gpx")) {
101 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gpx version=\"1.0\" creator=\"Navit http://navit.sourceforge.net\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.topografix.com/GPX/1/0\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n<trk>\n<trkseg>\n";
102 char *trailer = "</trkseg>\n</trk>\n</gpx>\n";
103 log_set_header(log, header, strlen(header));
104 log_set_trailer(log, trailer, strlen(trailer));
105 cb=callback_new_2(callback_cast(vehicle_log_gpx), this_, log);
106 } else if (!strcmp(type_attr.u.str, "textfile")) {
107 char *header = "type=track\n";
108 log_set_header(log, header, strlen(header));
109 cb=callback_new_2(callback_cast(vehicle_log_textfile), this_, log);
112 callback_list_add(this_->cbl, cb);
117 vehicle_new(struct attr **attrs)
119 struct vehicle *this_;
121 struct vehicle_priv *(*vehicletype_new) (struct vehicle_methods *
123 struct callback_list *
125 struct attr ** attrs);
130 source = attr_search(attrs, NULL, attr_source);
132 dbg(0, "no source\n");
136 type = g_strdup(source->u.str);
137 colon = index(type, ':');
140 dbg(1, "source='%s' type='%s'\n", source->u.str, type);
142 vehicletype_new = plugin_get_vehicle_type(type);
143 if (!vehicletype_new) {
144 dbg(0, "invalid type '%s'\n", type);
147 this_ = g_new0(struct vehicle, 1);
148 this_->cbl = callback_list_new();
149 this_->priv = vehicletype_new(&this_->meth, this_->cbl, attrs);
151 dbg(0, "vehicletype_new failed\n");
152 callback_list_destroy(this_->cbl);
158 if ((name=attr_search(attrs, NULL, attr_name))) {
159 this_->name=g_strdup(name->u.str);
161 this_->name=g_strdup("Noname");
167 vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr)
171 attr->u.str=this_->name;
174 if (this_->meth.position_attr_get) {
175 return this_->meth.position_attr_get(this_->priv, type, attr);
185 vehicle_set_attr(struct vehicle *this_, struct attr *attr,
188 if (this_->meth.set_attr)
189 return this_->meth.set_attr(this_->priv, attr, attrs);
194 vehicle_add_attr(struct vehicle *this_, struct attr *attr)
196 switch (attr->type) {
198 callback_list_add(this_->cbl, attr->u.callback);
201 return vehicle_add_log(this_, attr->u.log);
209 vehicle_remove_attr(struct vehicle *this_, struct attr *attr)
211 switch (attr->type) {
213 callback_list_remove(this_->cbl, attr->u.callback);
222 vehicle_destroy(struct vehicle *this_)
224 callback_list_destroy(this_->cbl);
225 if(this_->name) g_free(this_->name);