summaryrefslogtreecommitdiff
path: root/navit/vehicle
diff options
context:
space:
mode:
Diffstat (limited to 'navit/vehicle')
-rw-r--r--navit/vehicle/android/vehicle_android.c355
-rw-r--r--navit/vehicle/demo/vehicle_demo.c483
-rw-r--r--navit/vehicle/file/vehicle_file.c1699
-rw-r--r--navit/vehicle/file/vehicle_pipe.c6
-rw-r--r--navit/vehicle/file/vehicle_serial.c6
-rw-r--r--navit/vehicle/file/vehicle_socket.c6
-rw-r--r--navit/vehicle/gpsd/CMakeLists.txt8
-rw-r--r--navit/vehicle/gpsd/vehicle_gpsd.c690
-rw-r--r--navit/vehicle/gpsd_dbus/CMakeLists.txt2
-rw-r--r--navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c363
-rw-r--r--navit/vehicle/gypsy/vehicle_gypsy.c617
-rw-r--r--navit/vehicle/iphone/corelocation.h2
-rw-r--r--navit/vehicle/iphone/corelocation.m6
-rw-r--r--navit/vehicle/iphone/vehicle_iphone.c221
-rw-r--r--navit/vehicle/maemo/CMakeLists.txt2
-rw-r--r--navit/vehicle/maemo/vehicle_maemo.c538
-rw-r--r--navit/vehicle/null/vehicle_null.c200
-rw-r--r--navit/vehicle/qt5/vehicle_qt5.cpp128
-rw-r--r--navit/vehicle/webos/bluetooth.c1079
-rw-r--r--navit/vehicle/webos/cJSON.c1069
-rw-r--r--navit/vehicle/webos/cJSON.h12
-rw-r--r--navit/vehicle/webos/vehicle_webos.c580
-rw-r--r--navit/vehicle/wince/vehicle_wince.c1649
23 files changed, 4920 insertions, 4801 deletions
diff --git a/navit/vehicle/android/vehicle_android.c b/navit/vehicle/android/vehicle_android.c
index 89882d048..f6173e1b3 100644
--- a/navit/vehicle/android/vehicle_android.c
+++ b/navit/vehicle/android/vehicle_android.c
@@ -1,6 +1,4 @@
-/** @file vehicle_android.c
- * @brief android uses dbus signals
- *
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -18,8 +16,6 @@
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
- * @Author Tim Niemeyer <reddog@mastersword.de>
- * @date 2008-2009
*/
#include <config.h>
@@ -35,40 +31,48 @@
#include "android.h"
#include "vehicle.h"
+/**
+ * @defgroup vehicle-android Vehicle Android
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from android.
+ * @author Tim Niemeyer <reddog@mastersword.de>
+ * @date 2008-2009
+ *
+ */
+
struct vehicle_priv {
- struct callback_list *cbl;
- struct coord_geo geo; /**< The last known position of the vehicle **/
- double speed; /**< Speed in km/h **/
- double direction; /**< Bearing in degrees **/
- double height; /**< Elevation in meters **/
- double radius; /**< Position accuracy in meters **/
- int fix_type; /**< Type of last fix (1 = valid, 0 = invalid) **/
- time_t fix_time; /**< Timestamp of last fix (not used) **/
- char fixiso8601[128]; /**< Timestamp of last fix in ISO 8601 format **/
- int sats; /**< Number of satellites in view **/
- int sats_used; /**< Number of satellites used in fix **/
- int valid; /**< Whether the vehicle coordinates in {@code geo} are valid **/
- struct attr ** attrs;
- struct callback *pcb; /**< The callback function for position updates **/
- struct callback *scb; /**< The callback function for status updates **/
- struct callback *fcb; /**< The callback function for fix status updates **/
- jclass NavitVehicleClass; /**< The {@code NavitVehicle} class **/
- jobject NavitVehicle; /**< An instance of {@code NavitVehicle} **/
- jclass LocationClass; /**< Android's {@code Location} class **/
- jmethodID Location_getLatitude, Location_getLongitude, Location_getSpeed, Location_getBearing, Location_getAltitude, Location_getTime, Location_getAccuracy;
+ struct callback_list *cbl;
+ struct coord_geo geo; /**< The last known position of the vehicle **/
+ double speed; /**< Speed in km/h **/
+ double direction; /**< Bearing in degrees **/
+ double height; /**< Elevation in meters **/
+ double radius; /**< Position accuracy in meters **/
+ int fix_type; /**< Type of last fix (1 = valid, 0 = invalid) **/
+ time_t fix_time; /**< Timestamp of last fix (not used) **/
+ char fixiso8601[128]; /**< Timestamp of last fix in ISO 8601 format **/
+ int sats; /**< Number of satellites in view **/
+ int sats_used; /**< Number of satellites used in fix **/
+ int valid; /**< Whether the vehicle coordinates in {@code geo} are valid **/
+ struct attr ** attrs;
+ struct callback *pcb; /**< The callback function for position updates **/
+ struct callback *scb; /**< The callback function for status updates **/
+ struct callback *fcb; /**< The callback function for fix status updates **/
+ jclass NavitVehicleClass; /**< The {@code NavitVehicle} class **/
+ jobject NavitVehicle; /**< An instance of {@code NavitVehicle} **/
+ jclass LocationClass; /**< Android's {@code Location} class **/
+ jmethodID Location_getLatitude, Location_getLongitude, Location_getSpeed, Location_getBearing, Location_getAltitude,
+ Location_getTime, Location_getAccuracy;
};
/**
* @brief Free the android_vehicle
- *
+ *
* @param priv vehicle_priv structure for the vehicle
* @returns nothing
*/
-static void
-vehicle_android_destroy(struct vehicle_priv *priv)
-{
- dbg(lvl_debug,"enter\n");
- g_free(priv);
+static void vehicle_android_destroy(struct vehicle_priv *priv) {
+ dbg(lvl_debug,"enter");
+ g_free(priv);
}
/**
@@ -79,55 +83,53 @@ vehicle_android_destroy(struct vehicle_priv *priv)
* @param attr Points to an attr structure that will receive the attribute data
* @returns True for success, false for failure
*/
-static int
-vehicle_android_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- dbg(lvl_debug,"enter %s\n",attr_to_name(type));
- switch (type) {
- case attr_position_fix_type:
- attr->u.num = priv->fix_type;
- break;
- case attr_position_height:
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_radius:
- attr->u.numd = &priv->radius;
- break;
- case attr_position_qual:
- attr->u.num = priv->sats;
- break;
- case attr_position_sats_used:
- attr->u.num = priv->sats_used;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- if (priv->valid == attr_position_valid_invalid)
- return 0;
- break;
- case attr_position_time_iso8601:
- attr->u.str=priv->fixiso8601;
- break;
- case attr_position_valid:
- attr->u.num = priv->valid;
- break;
- default:
- return 0;
- }
- dbg(lvl_debug,"ok\n");
- attr->type = type;
- return 1;
+static int vehicle_android_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ dbg(lvl_debug,"enter %s",attr_to_name(type));
+ switch (type) {
+ case attr_position_fix_type:
+ attr->u.num = priv->fix_type;
+ break;
+ case attr_position_height:
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_radius:
+ attr->u.numd = &priv->radius;
+ break;
+ case attr_position_qual:
+ attr->u.num = priv->sats;
+ break;
+ case attr_position_sats_used:
+ attr->u.num = priv->sats_used;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ if (priv->valid == attr_position_valid_invalid)
+ return 0;
+ break;
+ case attr_position_time_iso8601:
+ attr->u.str=priv->fixiso8601;
+ break;
+ case attr_position_valid:
+ attr->u.num = priv->valid;
+ break;
+ default:
+ return 0;
+ }
+ dbg(lvl_debug,"ok");
+ attr->type = type;
+ return 1;
}
struct vehicle_methods vehicle_android_methods = {
- vehicle_android_destroy,
- vehicle_android_position_attr_get,
+ vehicle_android_destroy,
+ vehicle_android_position_attr_get,
};
/**
@@ -138,27 +140,26 @@ struct vehicle_methods vehicle_android_methods = {
* @param v The {@code struct_vehicle_priv} for the vehicle
* @param location A {@code Location} object describing the new position
*/
-static void
-vehicle_android_position_callback(struct vehicle_priv *v, jobject location) {
- time_t tnow;
- struct tm *tm;
- dbg(lvl_debug,"enter\n");
+static void vehicle_android_position_callback(struct vehicle_priv *v, jobject location) {
+ time_t tnow;
+ struct tm *tm;
+ dbg(lvl_debug,"enter");
- v->geo.lat = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLatitude);
- v->geo.lng = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLongitude);
- v->speed = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getSpeed)*3.6;
- v->direction = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getBearing);
- v->height = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getAltitude);
- v->radius = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getAccuracy);
- tnow=(*jnienv)->CallLongMethod(jnienv, location, v->Location_getTime)/1000;
- tm = gmtime(&tnow);
- strftime(v->fixiso8601, sizeof(v->fixiso8601), "%Y-%m-%dT%TZ", tm);
- dbg(lvl_debug,"lat %f lon %f time %s\n",v->geo.lat,v->geo.lng,v->fixiso8601);
- if (v->valid != attr_position_valid_valid) {
- v->valid = attr_position_valid_valid;
- callback_list_call_attr_0(v->cbl, attr_position_valid);
- }
- callback_list_call_attr_0(v->cbl, attr_position_coord_geo);
+ v->geo.lat = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLatitude);
+ v->geo.lng = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLongitude);
+ v->speed = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getSpeed)*3.6;
+ v->direction = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getBearing);
+ v->height = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getAltitude);
+ v->radius = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getAccuracy);
+ tnow=(*jnienv)->CallLongMethod(jnienv, location, v->Location_getTime)/1000;
+ tm = gmtime(&tnow);
+ strftime(v->fixiso8601, sizeof(v->fixiso8601), "%Y-%m-%dT%TZ", tm);
+ dbg(lvl_debug,"lat %f lon %f time %s",v->geo.lat,v->geo.lng,v->fixiso8601);
+ if (v->valid != attr_position_valid_valid) {
+ v->valid = attr_position_valid_valid;
+ callback_list_call_attr_0(v->cbl, attr_position_valid);
+ }
+ callback_list_call_attr_0(v->cbl, attr_position_coord_geo);
}
/**
@@ -175,16 +176,15 @@ vehicle_android_position_callback(struct vehicle_priv *v, jobject location) {
* @param sats_in_view The number of satellites in view
* @param sats_used The number of satellites currently used to determine the position
*/
-static void
-vehicle_android_status_callback(struct vehicle_priv *v, int sats_in_view, int sats_used) {
- if (v->sats != sats_in_view) {
- v->sats = sats_in_view;
- callback_list_call_attr_0(v->cbl, attr_position_qual);
- }
- if (v->sats_used != sats_used) {
- v->sats_used = sats_used;
- callback_list_call_attr_0(v->cbl, attr_position_sats_used);
- }
+static void vehicle_android_status_callback(struct vehicle_priv *v, int sats_in_view, int sats_used) {
+ if (v->sats != sats_in_view) {
+ v->sats = sats_in_view;
+ callback_list_call_attr_0(v->cbl, attr_position_qual);
+ }
+ if (v->sats_used != sats_used) {
+ v->sats_used = sats_used;
+ callback_list_call_attr_0(v->cbl, attr_position_sats_used);
+ }
}
/**
@@ -195,16 +195,15 @@ vehicle_android_status_callback(struct vehicle_priv *v, int sats_in_view, int sa
* @param v The {@code struct_vehicle_priv} for the vehicle
* @param fix_type The fix type (1 = valid, 0 = invalid)
*/
-static void
-vehicle_android_fix_callback(struct vehicle_priv *v, int fix_type) {
- if (v->fix_type != fix_type) {
- v->fix_type = fix_type;
- callback_list_call_attr_0(v->cbl, attr_position_fix_type);
- if (!fix_type && (v->valid == attr_position_valid_valid)) {
- v->valid = attr_position_valid_extrapolated_time;
- callback_list_call_attr_0(v->cbl, attr_position_valid);
- }
- }
+static void vehicle_android_fix_callback(struct vehicle_priv *v, int fix_type) {
+ if (v->fix_type != fix_type) {
+ v->fix_type = fix_type;
+ callback_list_call_attr_0(v->cbl, attr_position_fix_type);
+ if (!fix_type && (v->valid == attr_position_valid_valid)) {
+ v->valid = attr_position_valid_extrapolated_time;
+ callback_list_call_attr_0(v->cbl, attr_position_valid);
+ }
+ }
}
/**
@@ -212,85 +211,81 @@ vehicle_android_fix_callback(struct vehicle_priv *v, int fix_type) {
*
* @return True on success, false on failure
*/
-static int
-vehicle_android_init(struct vehicle_priv *ret)
-{
- jmethodID cid;
+static int vehicle_android_init(struct vehicle_priv *ret) {
+ jmethodID cid;
- if (!android_find_class_global("android/location/Location", &ret->LocationClass))
- return 0;
- if (!android_find_method(ret->LocationClass, "getLatitude", "()D", &ret->Location_getLatitude))
- return 0;
- if (!android_find_method(ret->LocationClass, "getLongitude", "()D", &ret->Location_getLongitude))
- return 0;
- if (!android_find_method(ret->LocationClass, "getSpeed", "()F", &ret->Location_getSpeed))
- return 0;
- if (!android_find_method(ret->LocationClass, "getBearing", "()F", &ret->Location_getBearing))
- return 0;
- if (!android_find_method(ret->LocationClass, "getAltitude", "()D", &ret->Location_getAltitude))
- return 0;
- if (!android_find_method(ret->LocationClass, "getTime", "()J", &ret->Location_getTime))
- return 0;
- if (!android_find_method(ret->LocationClass, "getAccuracy", "()F", &ret->Location_getAccuracy))
- return 0;
- if (!android_find_class_global("org/navitproject/navit/NavitVehicle", &ret->NavitVehicleClass))
- return 0;
- dbg(lvl_debug,"at 3\n");
- cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "<init>", "(Landroid/content/Context;III)V");
- if (cid == NULL) {
- dbg(lvl_error,"no method found\n");
- return 0; /* exception thrown */
- }
- dbg(lvl_debug, "at 4 android_activity=%p\n", android_activity);
- ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity,
- (int) ret->pcb, (int) ret->scb, (int) ret->fcb);
- dbg(lvl_debug,"result=%p\n",ret->NavitVehicle);
- if (!ret->NavitVehicle)
- return 0;
- if (ret->NavitVehicle)
- ret->NavitVehicle = (*jnienv)->NewGlobalRef(jnienv, ret->NavitVehicle);
+ if (!android_find_class_global("android/location/Location", &ret->LocationClass))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getLatitude", "()D", &ret->Location_getLatitude))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getLongitude", "()D", &ret->Location_getLongitude))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getSpeed", "()F", &ret->Location_getSpeed))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getBearing", "()F", &ret->Location_getBearing))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getAltitude", "()D", &ret->Location_getAltitude))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getTime", "()J", &ret->Location_getTime))
+ return 0;
+ if (!android_find_method(ret->LocationClass, "getAccuracy", "()F", &ret->Location_getAccuracy))
+ return 0;
+ if (!android_find_class_global("org/navitproject/navit/NavitVehicle", &ret->NavitVehicleClass))
+ return 0;
+ dbg(lvl_debug,"at 3");
+ cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "<init>", "(Landroid/content/Context;III)V");
+ if (cid == NULL) {
+ dbg(lvl_error,"no method found");
+ return 0; /* exception thrown */
+ }
+ dbg(lvl_debug, "at 4 android_application=%p", android_application);
+ ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_application,
+ (int) ret->pcb, (int) ret->scb, (int) ret->fcb);
+ dbg(lvl_debug,"result=%p",ret->NavitVehicle);
+ if (!ret->NavitVehicle)
+ return 0;
+ if (ret->NavitVehicle)
+ ret->NavitVehicle = (*jnienv)->NewGlobalRef(jnienv, ret->NavitVehicle);
- return 1;
+ return 1;
}
/**
* @brief Create android_vehicle
- *
+ *
* @param meth
* @param cbl
* @param attrs
* @returns vehicle_priv
*/
-static struct vehicle_priv *
-vehicle_android_new_android(struct vehicle_methods *meth,
- struct callback_list *cbl,
- struct attr **attrs)
-{
- struct vehicle_priv *ret;
+static struct vehicle_priv *vehicle_android_new_android(struct vehicle_methods *meth,
+ struct callback_list *cbl,
+ struct attr **attrs) {
+ struct vehicle_priv *ret;
- dbg(lvl_debug, "enter\n");
- ret = g_new0(struct vehicle_priv, 1);
- ret->cbl = cbl;
- ret->pcb = callback_new_1(callback_cast(vehicle_android_position_callback), ret);
- ret->scb = callback_new_1(callback_cast(vehicle_android_status_callback), ret);
- ret->fcb = callback_new_1(callback_cast(vehicle_android_fix_callback), ret);
- ret->valid = attr_position_valid_invalid;
- ret->sats = 0;
- ret->sats_used = 0;
- *meth = vehicle_android_methods;
- vehicle_android_init(ret);
- dbg(lvl_debug, "return\n");
- return ret;
+ dbg(lvl_debug, "enter");
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->cbl = cbl;
+ ret->pcb = callback_new_1(callback_cast(vehicle_android_position_callback), ret);
+ ret->scb = callback_new_1(callback_cast(vehicle_android_status_callback), ret);
+ ret->fcb = callback_new_1(callback_cast(vehicle_android_fix_callback), ret);
+ ret->valid = attr_position_valid_invalid;
+ ret->sats = 0;
+ ret->sats_used = 0;
+ *meth = vehicle_android_methods;
+ vehicle_android_init(ret);
+ dbg(lvl_debug, "return");
+ return ret;
}
/**
* @brief register vehicle_android
- *
+ *
* @returns nothing
*/
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("android", vehicle_android_new_android);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("android", vehicle_android_new_android);
}
+
+/** @} */
diff --git a/navit/vehicle/demo/vehicle_demo.c b/navit/vehicle/demo/vehicle_demo.c
index 4a47c1476..06ab2117a 100644
--- a/navit/vehicle/demo/vehicle_demo.c
+++ b/navit/vehicle/demo/vehicle_demo.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -34,271 +34,268 @@
#include "event.h"
#include "util.h"
+/**
+ * @defgroup vehicle-demo Vehicle Demo
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle for a demo. It followes the route automatically
+ *
+ */
+
struct vehicle_priv {
- int interval;
- int position_set;
- struct callback_list *cbl;
- struct navit *navit;
- struct route *route;
- struct coord_geo geo;
- struct coord last;
- double config_speed;
- double speed;
- double direction;
- struct callback *timer_callback;
- struct event_timeout *timer;
- char *timep;
- char *nmea;
- enum attr_position_valid valid; /**< Whether the vehicle has valid position data **/
+ int interval;
+ int position_set;
+ struct callback_list *cbl;
+ struct navit *navit;
+ struct route *route;
+ struct coord_geo geo;
+ struct coord last;
+ double config_speed;
+ double speed;
+ double direction;
+ struct callback *timer_callback;
+ struct event_timeout *timer;
+ char *timep;
+ char *nmea;
+ enum attr_position_valid valid; /**< Whether the vehicle has valid position data **/
};
-static void
-vehicle_demo_destroy(struct vehicle_priv *priv)
-{
- if (priv->timer)
- event_remove_timeout(priv->timer);
- callback_destroy(priv->timer_callback);
- g_free(priv->timep);
- g_free(priv);
+static void vehicle_demo_destroy(struct vehicle_priv *priv) {
+ if (priv->timer)
+ event_remove_timeout(priv->timer);
+ callback_destroy(priv->timer_callback);
+ g_free(priv->timep);
+ g_free(priv);
}
-static void
-nmea_chksum(char *nmea)
-{
- int i;
- if (nmea && strlen(nmea) > 3) {
- unsigned char csum=0;
- for (i = 1 ; i < strlen(nmea)-4 ; i++)
- csum^=(unsigned char)(nmea[i]);
- sprintf(nmea+strlen(nmea)-3,"%02X\n",csum);
- }
+static void nmea_chksum(char *nmea) {
+ int i;
+ if (nmea && strlen(nmea) > 3) {
+ unsigned char csum=0;
+ for (i = 1 ; i < strlen(nmea)-4 ; i++)
+ csum^=(unsigned char)(nmea[i]);
+ sprintf(nmea+strlen(nmea)-3,"%02X\n",csum);
+ }
}
-static int
-vehicle_demo_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- char ns='N',ew='E',*timep,*rmc,*gga;
- int hr,min,sec,year,mon,day;
- double lat,lng;
- switch (type) {
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_time_iso8601:
- g_free(priv->timep);
- priv->timep=current_to_iso8601();
- attr->u.str=priv->timep;
- break;
- case attr_position_fix_type:
- attr->u.num = 2;
- break;
- case attr_position_sats_used:
- attr->u.num = 9;
- break;
- case attr_position_nmea:
- lat=priv->geo.lat;
- if (lat < 0) {
- lat=-lat;
- ns='S';
- }
- lng=priv->geo.lng;
- if (lng < 0) {
- lng=-lng;
- ew='W';
- }
- timep=current_to_iso8601();
- sscanf(timep,"%d-%d-%dT%d:%d:%d",&year,&mon,&day,&hr,&min,&sec);
- g_free(timep);
- gga=g_strdup_printf("$GPGGA,%02d%02d%02d,%02.0f%07.4f,%c,%03.0f%07.4f,%c,1,08,2.5,0,M,,,,0000* \n",hr,min,sec,floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew);
- nmea_chksum(gga);
- rmc=g_strdup_printf("$GPRMC,%02d%02d%02d,A,%02.0f%07.4f,%c,%03.0f%07.4f,%c,%3.1f,%3.1f,%02d%02d%02d,,* \n",hr,min,sec,floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew,priv->speed/1.852,(double)priv->direction,day,mon,year%100);
- nmea_chksum(rmc);
- g_free(priv->nmea);
- priv->nmea=g_strdup_printf("%s%s",gga,rmc);
- g_free(gga);
- g_free(rmc);
- attr->u.str=priv->nmea;
- break;
- case attr_position_valid:
- attr->u.num=priv->valid;
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_demo_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ char ns='N',ew='E',*timep,*rmc,*gga;
+ int hr,min,sec,year,mon,day;
+ double lat,lng;
+ switch (type) {
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_time_iso8601:
+ g_free(priv->timep);
+ priv->timep=current_to_iso8601();
+ attr->u.str=priv->timep;
+ break;
+ case attr_position_fix_type:
+ attr->u.num = 2;
+ break;
+ case attr_position_sats_used:
+ attr->u.num = 9;
+ break;
+ case attr_position_nmea:
+ lat=priv->geo.lat;
+ if (lat < 0) {
+ lat=-lat;
+ ns='S';
+ }
+ lng=priv->geo.lng;
+ if (lng < 0) {
+ lng=-lng;
+ ew='W';
+ }
+ timep=current_to_iso8601();
+ sscanf(timep,"%d-%d-%dT%d:%d:%d",&year,&mon,&day,&hr,&min,&sec);
+ g_free(timep);
+ gga=g_strdup_printf("$GPGGA,%02d%02d%02d,%02.0f%07.4f,%c,%03.0f%07.4f,%c,1,08,2.5,0,M,,,,0000* \n",hr,min,sec,
+ floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew);
+ nmea_chksum(gga);
+ rmc=g_strdup_printf("$GPRMC,%02d%02d%02d,A,%02.0f%07.4f,%c,%03.0f%07.4f,%c,%3.1f,%3.1f,%02d%02d%02d,,* \n",hr,min,sec,
+ floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew,priv->speed/1.852,(double)priv->direction,day,mon,
+ year%100);
+ nmea_chksum(rmc);
+ g_free(priv->nmea);
+ priv->nmea=g_strdup_printf("%s%s",gga,rmc);
+ g_free(gga);
+ g_free(rmc);
+ attr->u.str=priv->nmea;
+ break;
+ case attr_position_valid:
+ attr->u.num=priv->valid;
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
-static int
-vehicle_demo_set_attr_do(struct vehicle_priv *priv, struct attr *attr)
-{
- switch(attr->type) {
- case attr_navit:
- priv->navit = attr->u.navit;
- break;
- case attr_route:
- priv->route = attr->u.route;
- break;
- case attr_speed:
- priv->config_speed=attr->u.num;
- break;
- case attr_interval:
- priv->interval=attr->u.num;
- if (priv->timer)
- event_remove_timeout(priv->timer);
- priv->timer=event_add_timeout(priv->interval, 1, priv->timer_callback);
- break;
- case attr_position_coord_geo:
- priv->geo=*(attr->u.coord_geo);
- if (priv->valid != attr_position_valid_valid) {
- priv->valid = attr_position_valid_valid;
- callback_list_call_attr_0(priv->cbl, attr_position_valid);
- }
- priv->position_set=1;
- dbg(lvl_debug,"position_set %f %f\n", priv->geo.lat, priv->geo.lng);
- break;
- case attr_profilename:
- case attr_source:
- case attr_name:
- case attr_follow:
- case attr_active:
- // Ignore; used by Navit's infrastructure, but not relevant for this vehicle.
- break;
- default:
- dbg(lvl_error,"unsupported attribute %s\n",attr_to_name(attr->type));
- return 0;
- }
- return 1;
+static int vehicle_demo_set_attr_do(struct vehicle_priv *priv, struct attr *attr) {
+ switch(attr->type) {
+ case attr_navit:
+ priv->navit = attr->u.navit;
+ break;
+ case attr_route:
+ priv->route = attr->u.route;
+ break;
+ case attr_speed:
+ priv->config_speed=attr->u.num;
+ break;
+ case attr_interval:
+ priv->interval=attr->u.num;
+ if (priv->timer)
+ event_remove_timeout(priv->timer);
+ priv->timer=event_add_timeout(priv->interval, 1, priv->timer_callback);
+ break;
+ case attr_position_coord_geo:
+ priv->geo=*(attr->u.coord_geo);
+ if (priv->valid != attr_position_valid_valid) {
+ priv->valid = attr_position_valid_valid;
+ callback_list_call_attr_0(priv->cbl, attr_position_valid);
+ }
+ priv->position_set=1;
+ dbg(lvl_debug,"position_set %f %f", priv->geo.lat, priv->geo.lng);
+ break;
+ case attr_profilename:
+ case attr_source:
+ case attr_name:
+ case attr_follow:
+ case attr_active:
+ // Ignore; used by Navit's infrastructure, but not relevant for this vehicle.
+ break;
+ default:
+ dbg(lvl_error,"unsupported attribute %s",attr_to_name(attr->type));
+ return 0;
+ }
+ return 1;
}
-static int
-vehicle_demo_set_attr(struct vehicle_priv *priv, struct attr *attr)
-{
- return vehicle_demo_set_attr_do(priv, attr);
+static int vehicle_demo_set_attr(struct vehicle_priv *priv, struct attr *attr) {
+ return vehicle_demo_set_attr_do(priv, attr);
}
struct vehicle_methods vehicle_demo_methods = {
- vehicle_demo_destroy,
- vehicle_demo_position_attr_get,
- vehicle_demo_set_attr,
+ vehicle_demo_destroy,
+ vehicle_demo_position_attr_get,
+ vehicle_demo_set_attr,
};
-static void
-vehicle_demo_timer(struct vehicle_priv *priv)
-{
- struct coord c, c2, pos, ci;
- int slen, len, dx, dy;
- struct route *route=NULL;
- struct map *route_map=NULL;
- struct map_rect *mr=NULL;
- struct item *item=NULL;
+static void vehicle_demo_timer(struct vehicle_priv *priv) {
+ struct coord c, c2, pos, ci;
+ int slen, len, dx, dy;
+ struct route *route=NULL;
+ struct map *route_map=NULL;
+ struct map_rect *mr=NULL;
+ struct item *item=NULL;
- len = (priv->config_speed * priv->interval / 1000)/ 3.6;
- dbg(lvl_debug, "###### Entering simulation loop\n");
- if (!priv->config_speed)
- return;
- if (priv->route)
- route=priv->route;
- else if (priv->navit)
- route=navit_get_route(priv->navit);
- if (route)
- route_map=route_get_map(route);
- if (route_map)
- mr=map_rect_new(route_map, NULL);
- if (mr)
- item=map_rect_get_item(mr);
- if (item && item->type == type_route_start)
- item=map_rect_get_item(mr);
- while(item && item->type!=type_street_route)
- item=map_rect_get_item(mr);
- if (item && item_coord_get(item, &pos, 1)) {
- priv->position_set=0;
- dbg(lvl_debug, "current pos=0x%x,0x%x\n", pos.x, pos.y);
- dbg(lvl_debug, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y);
- if (priv->last.x == pos.x && priv->last.y == pos.y) {
- dbg(lvl_warning, "endless loop\n");
- }
- priv->last = pos;
- while (item && priv->config_speed) {
- if (!item_coord_get(item, &c, 1)) {
- item=map_rect_get_item(mr);
- continue;
- }
- dbg(lvl_debug, "next pos=0x%x,0x%x\n", c.x, c.y);
- slen = transform_distance(projection_mg, &pos, &c);
- dbg(lvl_debug, "len=%d slen=%d\n", len, slen);
- if (slen < len) {
- len -= slen;
- pos = c;
- } else {
- if (item_coord_get(item, &c2, 1) || map_rect_get_item(mr)) {
- 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);
- priv->speed=priv->config_speed;
- } else {
- ci.x = pos.x;
- ci.y = pos.y;
- priv->speed=0;
- dbg(lvl_debug,"destination reached\n");
- }
- dbg(lvl_debug, "ci=0x%x,0x%x\n", ci.x, ci.y);
- transform_to_geo(projection_mg, &ci,
- &priv->geo);
- if (priv->valid != attr_position_valid_valid) {
- priv->valid = attr_position_valid_valid;
- callback_list_call_attr_0(priv->cbl, attr_position_valid);
- }
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- break;
- }
- }
- } else {
- if (priv->position_set)
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- }
- if (mr)
- map_rect_destroy(mr);
+ len = (priv->config_speed * priv->interval / 1000)/ 3.6;
+ dbg(lvl_debug, "###### Entering simulation loop");
+ if (!priv->config_speed)
+ return;
+ if (priv->route)
+ route=priv->route;
+ else if (priv->navit)
+ route=navit_get_route(priv->navit);
+ if (route)
+ route_map=route_get_map(route);
+ if (route_map)
+ mr=map_rect_new(route_map, NULL);
+ if (mr)
+ item=map_rect_get_item(mr);
+ if (item && item->type == type_route_start)
+ item=map_rect_get_item(mr);
+ while(item && item->type!=type_street_route)
+ item=map_rect_get_item(mr);
+ if (item && item_coord_get(item, &pos, 1)) {
+ priv->position_set=0;
+ dbg(lvl_debug, "current pos=0x%x,0x%x", pos.x, pos.y);
+ dbg(lvl_debug, "last pos=0x%x,0x%x", priv->last.x, priv->last.y);
+ if (priv->last.x == pos.x && priv->last.y == pos.y) {
+ dbg(lvl_warning, "endless loop");
+ }
+ priv->last = pos;
+ while (item && priv->config_speed) {
+ if (!item_coord_get(item, &c, 1)) {
+ item=map_rect_get_item(mr);
+ continue;
+ }
+ dbg(lvl_debug, "next pos=0x%x,0x%x", c.x, c.y);
+ slen = transform_distance(projection_mg, &pos, &c);
+ dbg(lvl_debug, "len=%d slen=%d", len, slen);
+ if (slen < len) {
+ len -= slen;
+ pos = c;
+ } else {
+ if (item_coord_get(item, &c2, 1) || map_rect_get_item(mr)) {
+ 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);
+ priv->speed=priv->config_speed;
+ } else {
+ ci.x = pos.x;
+ ci.y = pos.y;
+ priv->speed=0;
+ dbg(lvl_debug,"destination reached");
+ }
+ dbg(lvl_debug, "ci=0x%x,0x%x", ci.x, ci.y);
+ transform_to_geo(projection_mg, &ci,
+ &priv->geo);
+ if (priv->valid != attr_position_valid_valid) {
+ priv->valid = attr_position_valid_valid;
+ callback_list_call_attr_0(priv->cbl, attr_position_valid);
+ }
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ break;
+ }
+ }
+ } else {
+ if (priv->position_set)
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ }
+ if (mr)
+ map_rect_destroy(mr);
}
-static struct vehicle_priv *
-vehicle_demo_new(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
+static struct vehicle_priv *vehicle_demo_new(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
- dbg(lvl_debug, "enter\n");
- ret = g_new0(struct vehicle_priv, 1);
- ret->cbl = cbl;
- ret->interval=1000;
- ret->config_speed=40;
- ret->timer_callback=callback_new_1(callback_cast(vehicle_demo_timer), ret);
- ret->valid = attr_position_valid_invalid;
- *meth = vehicle_demo_methods;
- while (attrs && *attrs)
- vehicle_demo_set_attr_do(ret, *attrs++);
- if (!ret->timer)
- ret->timer=event_add_timeout(ret->interval, 1, ret->timer_callback);
- return ret;
+ dbg(lvl_debug, "enter");
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->cbl = cbl;
+ ret->interval=1000;
+ ret->config_speed=40;
+ ret->timer_callback=callback_new_1(callback_cast(vehicle_demo_timer), ret);
+ ret->valid = attr_position_valid_invalid;
+ *meth = vehicle_demo_methods;
+ while (attrs && *attrs)
+ vehicle_demo_set_attr_do(ret, *attrs++);
+ if (!ret->timer)
+ ret->timer=event_add_timeout(ret->interval, 1, ret->timer_callback);
+ return ret;
}
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("demo", vehicle_demo_new);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("demo", vehicle_demo_new);
}
+
+
+/** @} */
diff --git a/navit/vehicle/file/vehicle_file.c b/navit/vehicle/file/vehicle_file.c
index 10bce942b..807d4998d 100644
--- a/navit/vehicle/file/vehicle_file.c
+++ b/navit/vehicle/file/vehicle_file.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -28,7 +28,7 @@
#include <glib.h>
#include <sys/stat.h>
#ifdef _WIN32
- #include <serial_io.h>
+#include <serial_io.h>
#else
#include <termios.h>
#endif
@@ -51,14 +51,21 @@
#include <winsock2.h>
int inet_aton(const char *cp, struct in_addr *inp);
-int inet_aton(const char *cp, struct in_addr *inp)
-{
- unsigned long addr = inet_addr(cp);
- inp->S_un.S_addr = addr;
- return addr!=-1;
+int inet_aton(const char *cp, struct in_addr *inp) {
+ unsigned long addr = inet_addr(cp);
+ inp->S_un.S_addr = addr;
+ return addr!=-1;
}
#endif
+/**
+ * @defgroup vehicle-file Vehicle File
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from a file, pipe, serial interface or a socket
+ *
+ * @{
+ */
+
static void vehicle_file_disable_watch(struct vehicle_priv *priv);
static void vehicle_file_enable_watch(struct vehicle_priv *priv);
static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer);
@@ -67,91 +74,87 @@ static void vehicle_file_close(struct vehicle_priv *priv);
enum file_type {
- file_type_pipe = 1, file_type_device, file_type_file, file_type_socket, file_type_serial
+ file_type_pipe = 1, file_type_device, file_type_file, file_type_socket, file_type_serial
};
static int buffer_size = 1024;
struct gps_sat {
- int prn;
- int elevation;
- int azimuth;
- int snr;
+ int prn;
+ int elevation;
+ int azimuth;
+ int snr;
};
struct vehicle_priv {
- char *source;
- struct callback_list *cbl;
- int fd;
- struct callback *cb,*cbt;
- char *buffer;
- int buffer_pos;
- char *nmea_data;
- char *nmea_data_buf;
-
- struct coord_geo geo;
- double speed;
- double direction;
- double height;
- double hdop;
- double vdop;
- char fixtime[20];
- int fixyear;
- int fixmonth;
- int fixday;
- int status;
- int sats_used;
- int sats_visible;
- int sats_signal;
- int time;
- int on_eof;
+ char *source;
+ struct callback_list *cbl;
+ int fd;
+ struct callback *cb,*cbt,*cb_fix_timeout;
+ char *buffer;
+ int buffer_pos;
+ char *nmea_data;
+ char *nmea_data_buf;
+
+ struct coord_geo geo;
+ double speed;
+ double direction;
+ double height;
+ double hdop;
+ double vdop;
+ char fixtime[20];
+ int fixyear;
+ int fixmonth;
+ int fixday;
+ int status;
+ int sats_used;
+ int sats_visible;
+ int sats_signal;
+ int time;
+ int on_eof;
#ifdef _WIN32
- int no_data_count;
- struct event_timeout * timeout;
- struct callback *timeout_callback;
+ int no_data_count;
+ struct event_timeout * timeout;
+ struct callback *timeout_callback;
#endif
- enum file_type file_type;
- FILE *file;
- struct event_watch *watch;
- speed_t baudrate;
- struct attr ** attrs;
- char fixiso8601[128];
- int checksum_ignore;
- int magnetic_direction;
- int current_count;
- struct gps_sat current[24];
- int next_count;
- struct gps_sat next[24];
- struct item sat_item;
- int valid;
- char *statefile;
- int process_statefile;
+ enum file_type file_type;
+ FILE *file;
+ struct event_watch *watch;
+ struct event_timeout *ev_fix_timeout;
+ speed_t baudrate;
+ struct attr ** attrs;
+ char fixiso8601[128];
+ int checksum_ignore;
+ int magnetic_direction;
+ int current_count;
+ struct gps_sat current[24];
+ int next_count;
+ struct gps_sat next[24];
+ struct item sat_item;
+ int valid;
+ char *statefile;
+ int process_statefile;
};
-//***************************************************************************
-/** @fn static int vehicle_win32_serial_track(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: Callback of the plugin
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-* @return always 1
-*****************************************************************************
-**/
+/**
+* @brief Callback of the plugin
+*
+* @param priv Pointer on the private data of the plugin
+*
+* @return Always 1
+*/
#ifdef _WIN32
-static int vehicle_win32_serial_track(struct vehicle_priv *priv)
-{
+static int vehicle_win32_serial_track(struct vehicle_priv *priv) {
static char buffer[2048] = {0,};
static int current_index = 0;
const int chunk_size = 1024;
int rc = 0;
int dwBytes;
- dbg(lvl_debug, "enter, *priv='%x', priv->source='%s'\n", priv, priv->source);
+ dbg(lvl_debug, "enter, *priv='%x', priv->source='%s'", priv, priv->source);
- if ( priv->no_data_count > 5 )
- {
+ if ( priv->no_data_count > 5 ) {
vehicle_file_close( priv );
priv->no_data_count = 0;
vehicle_file_open( priv );
@@ -163,21 +166,18 @@ static int vehicle_win32_serial_track(struct vehicle_priv *priv)
// vehicle_file_open( priv );
//}
- if ( current_index >= ( sizeof( buffer ) - chunk_size ) )
- {
+ if ( current_index >= ( sizeof( buffer ) - chunk_size ) ) {
// discard
current_index = 0;
- memset( buffer, 0 , sizeof( buffer ) );
+ memset( buffer, 0, sizeof( buffer ) );
}
dwBytes = serial_io_read( priv->fd, &buffer[ current_index ], chunk_size );
- if ( dwBytes > 0 )
- {
+ if ( dwBytes > 0 ) {
char* return_pos = NULL;
current_index += dwBytes;
- while ( ( return_pos = strchr( buffer, '\n' ) ) != NULL )
- {
+ while ( ( return_pos = strchr( buffer, '\n' ) ) != NULL ) {
char return_buffer[1024];
int bytes_to_copy = return_pos - buffer + 1;
memcpy( return_buffer, buffer, bytes_to_copy );
@@ -188,867 +188,862 @@ static int vehicle_win32_serial_track(struct vehicle_priv *priv)
rc += vehicle_file_parse( priv, return_buffer );
current_index -= bytes_to_copy;
- memmove( buffer, &buffer[ bytes_to_copy ] , sizeof( buffer ) - bytes_to_copy );
+ memmove( buffer, &buffer[ bytes_to_copy ], sizeof( buffer ) - bytes_to_copy );
}
if (rc) {
priv->no_data_count = 0;
callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
if (rc > 1)
- dbg(lvl_error, "Can not keep with gps data delay is %d seconds\n", rc - 1);
+ dbg(lvl_error, "Can not keep with gps data delay is %d seconds", rc - 1);
}
- }
- else
- {
+ } else {
priv->no_data_count++;
}
- dbg(lvl_info, "leave, return '1', priv->no_data_count='%d'\n", priv->no_data_count);
+ dbg(lvl_info, "leave, return '1', priv->no_data_count='%d'", priv->no_data_count);
return 1;
}
#endif
-//***************************************************************************
-/** @fn static int vehicle_file_open(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: open dialogue with the GPS
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-* @return 1 if ok
-* 0 if error
-*****************************************************************************
-**/
-static int
-vehicle_file_open(struct vehicle_priv *priv)
-{
- char *name;
+/**
+* @brief Open dialogue with the GPS
+*
+* @param priv Pointer on the private data of the plugin
+*
+* @return 1 if ok, 0 if error
+*/
+static int vehicle_file_open(struct vehicle_priv *priv) {
+ char *name;
#ifndef _WIN32
- struct termios tio;
+ struct termios tio;
#else
- #define O_NDELAY 0
+#define O_NDELAY 0
#endif
- name = priv->source + 5;
- if (!strncmp(priv->source, "file:", 5)) {
- priv->fd = open(name, O_RDONLY | O_NDELAY);
- if (priv->fd < 0)
- return 0;
- if (file_is_reg(name)) {
- priv->file_type = file_type_file;
- }
+ name = priv->source + 5;
+ if (!strncmp(priv->source, "file:", 5)) {
+ priv->fd = open(name, O_RDONLY | O_NDELAY);
+ if (priv->fd < 0)
+ return 0;
+ if (file_is_reg(name)) {
+ priv->file_type = file_type_file;
+ }
#ifndef _WIN32
- else {
- tcgetattr(priv->fd, &tio);
- cfmakeraw(&tio);
- cfsetispeed(&tio, priv->baudrate);
- cfsetospeed(&tio, priv->baudrate);
- tio.c_cc[VMIN] = 0;
- tio.c_cc[VTIME] = 200;
- tcsetattr(priv->fd, TCSANOW, &tio);
- priv->file_type = file_type_device;
- }
- } else if (!strncmp(priv->source,"pipe:", 5)) {
- priv->file = popen(name, "r");
- if (!priv->file)
- return 0;
- priv->fd = fileno(priv->file);
- priv->file_type = file_type_pipe;
+ else {
+ tcgetattr(priv->fd, &tio);
+ cfmakeraw(&tio);
+ cfsetispeed(&tio, priv->baudrate);
+ cfsetospeed(&tio, priv->baudrate);
+ tio.c_cc[VMIN] = 0;
+ tio.c_cc[VTIME] = 200;
+ tcsetattr(priv->fd, TCSANOW, &tio);
+ priv->file_type = file_type_device;
+ }
+ } else if (!strncmp(priv->source,"pipe:", 5)) {
+ priv->file = popen(name, "r");
+ if (!priv->file)
+ return 0;
+ priv->fd = fileno(priv->file);
+ priv->file_type = file_type_pipe;
#endif //!_WIN32
-#if defined(HAVE_SOCKET) || defined(HAVE_WINSOCK)
- } else if (!strncmp(priv->source,"socket:", 7)) {
- #ifdef _WIN32
- WSADATA wsi;
- WSAStartup(0x00020002,&wsi);
- #endif
- char *p,*s=g_strdup(priv->source+7);
- struct sockaddr_in sin;
- p=strchr(s,':');
- if (!p) {
- dbg(lvl_error,"port number missing in %s\n",s);
- g_free(s);
- return 0;
- }
- *p++='\0';
- sin.sin_family=AF_INET;
- sin.sin_port=ntohs(atoi(p));
- if (!inet_aton(s, &sin.sin_addr)) {
- dbg(lvl_error,"failed to parse %s\n",s);
- g_free(s);
- return 0;
- }
- priv->fd = socket(PF_INET, SOCK_STREAM, 0);
- if (priv->fd != -1) {
- if (connect(priv->fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
- dbg(lvl_error,"failed to connect to %s:%s\n",s,p);
- g_free(s);
- return 0;
- }
- }
- p=strchr(p,':');
- if (p) {
- p++;
- write(priv->fd, p, strlen(p));
- }
- priv->file_type = file_type_socket;
+#if defined(HAVE_SOCKET) || defined(HAVE_WINSOCK)
+ } else if (!strncmp(priv->source,"socket:", 7)) {
+#ifdef _WIN32
+ WSADATA wsi;
+ WSAStartup(0x00020002,&wsi);
+#endif
+ char *p,*s=g_strdup(priv->source+7);
+ struct sockaddr_in sin;
+ p=strchr(s,':');
+ if (!p) {
+ dbg(lvl_error,"port number missing in %s",s);
+ g_free(s);
+ return 0;
+ }
+ *p++='\0';
+ sin.sin_family=AF_INET;
+ sin.sin_port=ntohs(atoi(p));
+ if (!inet_aton(s, &sin.sin_addr)) {
+ dbg(lvl_error,"failed to parse %s",s);
+ g_free(s);
+ return 0;
+ }
+ priv->fd = socket(PF_INET, SOCK_STREAM, 0);
+ if (priv->fd != -1) {
+ if (connect(priv->fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+ dbg(lvl_error,"failed to connect to %s:%s",s,p);
+ g_free(s);
+ return 0;
+ }
+ }
+ p=strchr(p,':');
+ if (p) {
+ p++;
+ int write_result;
+ write_result = write(priv->fd, p, strlen(p));
+ if (write_result == -1) {
+ dbg(lvl_warning, "write failed.");
+ }
+ }
+ priv->file_type = file_type_socket;
#endif //HAVE_SOCKET
- } else if (!strncmp(priv->source,"serial:",7)) {
+ } else if (!strncmp(priv->source,"serial:",7)) {
#ifdef _WIN32
- char* raw_setting_str = g_strdup( priv->source );
-
- char* strport = strchr(raw_setting_str, ':' );
- char* strsettings = strchr(raw_setting_str, ' ' );
-
- if ( strport && strsettings )
- {
- strport++;
- *strsettings = '\0';
- strsettings++;
-
- priv->fd=serial_io_init( strport, strsettings );
- }
- g_free( raw_setting_str );
- priv->file_type = file_type_serial;
- // Add the callback
- dbg(lvl_info, "Add the callback ...\n", priv->source);
- priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv);
+ char* raw_setting_str = g_strdup( priv->source );
+
+ char* strport = strchr(raw_setting_str, ':' );
+ char* strsettings = strchr(raw_setting_str, ' ' );
+
+ if ( strport && strsettings ) {
+ strport++;
+ *strsettings = '\0';
+ strsettings++;
+
+ priv->fd=serial_io_init( strport, strsettings );
+ }
+ g_free( raw_setting_str );
+ priv->file_type = file_type_serial;
+ // Add the callback
+ dbg(lvl_info, "Add the callback ...", priv->source);
+ priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv);
#else
- //TODO - add linux serial
+ //TODO - add linux serial
#endif //!_WIN32
}
return(priv->fd != -1);
}
-//***************************************************************************
-/** @fn static void vehicle_file_close(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: close dialogue with the GPS
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-**/
-static void
-vehicle_file_close(struct vehicle_priv *priv)
-{
- dbg(lvl_debug, "enter, priv->fd='%d'\n", priv->fd);
- vehicle_file_disable_watch(priv);
+/**
+* @brief Close dialogue with the GPS
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_file_close(struct vehicle_priv *priv) {
+ dbg(lvl_debug, "enter, priv->fd='%d'", priv->fd);
+ vehicle_file_disable_watch(priv);
#ifdef _WIN32
- if(priv->file_type == file_type_serial)
- {
+ if(priv->file_type == file_type_serial) {
if (priv->timeout_callback) {
- callback_destroy(priv->timeout_callback);
- priv->timeout_callback=NULL; // dangling pointer! prevent double freeing.
+ callback_destroy(priv->timeout_callback);
+ priv->timeout_callback=NULL; // dangling pointer! prevent double freeing.
}
- serial_io_shutdown( priv->fd );
- }
- else
+ serial_io_shutdown( priv->fd );
+ } else
#endif
{
- if (priv->file) {
+ if (priv->file) {
#ifndef _MSC_VER
- pclose(priv->file);
+ pclose(priv->file);
#endif /* _MSC_VER */
+ } else if (priv->fd >= 0) {
+ close(priv->fd);
+ }
+ priv->file = NULL;
+ priv->fd = -1;
}
- else if (priv->fd >= 0) {
- close(priv->fd);
- }
- priv->file = NULL;
- priv->fd = -1;
- }
}
-//***************************************************************************
-/** @fn static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: Enable watch timer to get GPS data
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-* @return always 0
-*****************************************************************************
-**/
-static int
-vehicle_file_enable_watch_timer(struct vehicle_priv *priv)
-{
- dbg(lvl_debug, "enter\n");
- vehicle_file_enable_watch(priv);
-
- return FALSE;
+/**
+* @brief Enable watch timer to get GPS data
+*
+* @param priv Pointer on the private data of the plugin
+*
+* @return Always 0
+*/
+static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv) {
+ dbg(lvl_debug, "enter");
+ vehicle_file_enable_watch(priv);
+
+ return FALSE;
+}
+
+
+/**
+* @brief This is a callback function, called when the fix timeout
+* is done. Set the position to invalid.
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_file_fix_timeout_cb(struct vehicle_priv *priv) {
+ priv->valid = attr_position_valid_invalid;
+ priv->ev_fix_timeout = NULL;
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
-//***************************************************************************
-/** @fn static int vehicle_file_parse( struct vehicle_priv *priv,
-* char *buffer)
-*****************************************************************************
-* @b Description: Parse the buffer
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-* @param buffer : data buffer (null terminated)
-*****************************************************************************
-* @return 1 if The GPRMC Sentence is found
-* 0 if not found
-*****************************************************************************
-**/
-static int
-vehicle_file_parse(struct vehicle_priv *priv, char *buffer)
-{
- char *nmea_data_buf, *p, *item[32];
- double lat, lng;
- int i, j, bcsum;
- int len = strlen(buffer);
- unsigned char csum = 0;
- int valid=0;
- int ret = 0;
-
- dbg(lvl_info, "enter: buffer='%s'\n", buffer);
- for (;;) {
- if (len < 4) {
- dbg(lvl_error, "'%s' too short\n", buffer);
- return ret;
- }
- if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') {
- buffer[--len] = '\0';
+/**
+* @brief Cancel previous fix timeout event and add a new one
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_file_restart_fix_timeout(struct vehicle_priv *priv) {
+ if (priv->ev_fix_timeout != NULL)
+ event_remove_timeout(priv->ev_fix_timeout);
+ priv->ev_fix_timeout = event_add_timeout(10000, 0, priv->cb_fix_timeout);
+}
+
+
+/**
+* @brief Parse the buffer
+*
+* @param priv Pointer on the private data of the plugin
+* @param buffer Data buffer (null terminated)
+*
+* @return 1 if new coords were received (fixtime changed) or changed to invalid,
+* 0 if not found
+*/
+static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer) {
+ char *nmea_data_buf, *p, *item[32];
+ double lat, lng;
+ int i, j, bcsum;
+ int len = strlen(buffer);
+ unsigned char csum = 0;
+ int valid=0;
+ int ret = 0;
+
+ dbg(lvl_info, "enter: buffer='%s'", buffer);
+ for (;;) {
+ if (len < 4) {
+ dbg(lvl_error, "'%s' too short", buffer);
+ return ret;
+ }
+ if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') {
+ buffer[--len] = '\0';
if (buffer[len - 1] == '\r')
buffer[--len] = '\0';
} else
- break;
- }
- if (buffer[0] != '$') {
- dbg(lvl_error, "no leading $ in '%s'\n", buffer);
- return ret;
- }
- if (buffer[len - 3] != '*') {
- dbg(lvl_error, "no *XX in '%s'\n", buffer);
- return ret;
- }
- for (i = 1; i < len - 3; i++) {
- csum ^= (unsigned char) (buffer[i]);
- }
- if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) {
- dbg(lvl_error, "no checksum in '%s'\n", buffer);
- return ret;
- }
- if (bcsum != csum && priv->checksum_ignore == 0) {
- dbg(lvl_error, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum);
- return ret;
- }
-
- if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
- nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL);
- g_free(priv->nmea_data_buf);
- priv->nmea_data_buf=nmea_data_buf;
- } else {
- dbg(lvl_error, "nmea buffer overflow (len %zu), discarding '%s'\n", priv->nmea_data_buf?strlen(priv->nmea_data_buf):-1,buffer);
- }
- i = 0;
- p = buffer;
- while (i < 31) {
- item[i++] = p;
- while (*p && *p != ',')
- p++;
- if (!*p)
- break;
- *p++ = '\0';
- }
-
- if (!strncmp(&buffer[3], "GGA", 3)) {
- /* 1 1111
- 0 1 2 3 4 5 6 7 8 9 0 1234
- $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C
- UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
- HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
- */
- if (*item[2] && *item[3] && *item[4] && *item[5]) {
- lat = g_ascii_strtod(item[2], NULL);
- priv->geo.lat = floor(lat / 100);
- lat -= priv->geo.lat * 100;
- priv->geo.lat += lat / 60;
-
- if (!g_ascii_strcasecmp(item[3],"S"))
- priv->geo.lat=-priv->geo.lat;
-
- lng = g_ascii_strtod(item[4], NULL);
- priv->geo.lng = floor(lng / 100);
- lng -= priv->geo.lng * 100;
- priv->geo.lng += lng / 60;
-
- if (!g_ascii_strcasecmp(item[5],"W"))
- priv->geo.lng=-priv->geo.lng;
- priv->valid=attr_position_valid_valid;
-
- dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
-
- } else
- priv->valid=attr_position_valid_invalid;
- if (*item[6])
- sscanf(item[6], "%d", &priv->status);
- if (*item[7])
- sscanf(item[7], "%d", &priv->sats_used);
- if (*item[8])
- sscanf(item[8], "%lf", &priv->hdop);
- if (*item[1])
- strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
- if (*item[9])
- sscanf(item[9], "%lf", &priv->height);
-
- g_free(priv->nmea_data);
- priv->nmea_data=priv->nmea_data_buf;
- priv->nmea_data_buf=NULL;
- if (priv->file_type == file_type_file) {
- if (priv->watch) {
- vehicle_file_disable_watch(priv);
- event_add_timeout(priv->time, 0, priv->cbt);
- }
- }
- }
- if (!strncmp(&buffer[3], "VTG", 3)) {
- /* 0 1 2 34 5 6 7 8
- $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A
- Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4],
- Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8]
- */
- if (item[1] && item[7])
- valid = 1;
- if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D'))
- valid = 1;
- if (valid) {
- priv->direction = g_ascii_strtod( item[1], NULL );
- priv->speed = g_ascii_strtod( item[7], NULL );
- dbg(lvl_info,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed);
- }
- }
- if (!strncmp(&buffer[3], "RMC", 3)) {
- /* 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1
- $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
- Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9],
- magnetic variation[10],magnetic variation direction[11]
- */
- if (*item[2] == 'A')
- valid = 1;
- if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D'))
- valid = 1;
- if (valid) {
- priv->direction = g_ascii_strtod( item[8], NULL );
- priv->speed = g_ascii_strtod( item[7], NULL );
- priv->speed *= 1.852;
- sscanf(item[9], "%02d%02d%02d",
- &priv->fixday,
- &priv->fixmonth,
- &priv->fixyear);
- priv->fixyear += 2000;
- }
- ret = 1;
- }
- if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
- /*
- 0 GSV Satellites in view
- 1 2 Number of sentences for full data
- 2 1 sentence 1 of 2
- 3 08 Number of satellites in view
-
- 4 01 Satellite PRN number
- 5 40 Elevation, degrees
- 6 083 Azimuth, degrees
- 7 46 SNR - higher is better
- for up to 4 satellites per sentence
- *75 the checksum data, always begins with *
- */
- if (item[3]) {
- sscanf(item[3], "%d", &priv->sats_visible);
- }
- j=4;
- while (j+4 <= i && priv->current_count < 24) {
- struct gps_sat *sat=&priv->next[priv->next_count++];
- sat->prn=atoi(item[j]);
- sat->elevation=atoi(item[j+1]);
- sat->azimuth=atoi(item[j+2]);
- sat->snr=atoi(item[j+3]);
- j+=4;
- }
- if (!strcmp(item[1], item[2])) {
- priv->sats_signal=0;
- for (i = 0 ; i < priv->next_count ; i++) {
- priv->current[i]=priv->next[i];
- if (priv->current[i].snr)
- priv->sats_signal++;
- }
- priv->current_count=priv->next_count;
- priv->next_count=0;
- }
- }
- if (!strncmp(&buffer[3], "ZDA", 3)) {
- /*
- 0 1 2 3 4 5 6
- $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC
- hhmmss HrMinSec(UTC)
- dd,mm,yyy Day,Month,Year
- xx local zone hours -13..13
- yy local zone minutes 0..59
- */
- if (item[1] && item[2] && item[3] && item[4]) {
- strncpy(priv->fixtime, item[1], strlen(priv->fixtime));
- priv->fixday = atoi(item[2]);
- priv->fixmonth = atoi(item[3]);
- priv->fixyear = atoi(item[4]);
- }
- }
- if (!strncmp(buffer, "$IISMD", 6)) {
- /*
- 0 1 2 3 4
- $IISMD,dir,press,height,temp*CC"
- dir Direction (0-359)
- press Pressure (hpa, i.e. 1032)
- height Barometric height above ground (meter)
- temp Temperature (Degree Celsius)
- */
- if (item[1]) {
- priv->magnetic_direction = g_ascii_strtod( item[1], NULL );
- dbg(lvl_debug,"magnetic %d\n", priv->magnetic_direction);
- }
- }
- return ret;
+ break;
+ }
+ if (buffer[0] != '$') {
+ dbg(lvl_error, "no leading $ in '%s'", buffer);
+ return ret;
+ }
+ if (buffer[len - 3] != '*') {
+ dbg(lvl_error, "no *XX in '%s'", buffer);
+ return ret;
+ }
+ for (i = 1; i < len - 3; i++) {
+ csum ^= (unsigned char) (buffer[i]);
+ }
+ if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) {
+ dbg(lvl_error, "no checksum in '%s'", buffer);
+ return ret;
+ }
+ if (bcsum != csum && priv->checksum_ignore == 0) {
+ dbg(lvl_error, "wrong checksum in '%s was %x should be %x'", buffer,bcsum,csum);
+ return ret;
+ }
+
+ if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
+ nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL);
+ g_free(priv->nmea_data_buf);
+ priv->nmea_data_buf=nmea_data_buf;
+ } else {
+ dbg(lvl_error, "nmea buffer overflow (len %zu), discarding '%s'", priv->nmea_data_buf?strlen(priv->nmea_data_buf):-1,
+ buffer);
+ }
+ i = 0;
+ p = buffer;
+ while (i < 31) {
+ item[i++] = p;
+ while (*p && *p != ',')
+ p++;
+ if (!*p)
+ break;
+ *p++ = '\0';
+ }
+
+ if (!strncmp(&buffer[3], "GGA", 3)) {
+ /* 1 1111
+ 0 1 2 3 4 5 6 7 8 9 0 1234
+ $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C
+ UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
+ HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
+ */
+ if (*item[2] && *item[3] && *item[4] && *item[5] && *item[6] > 0) {
+ lat = g_ascii_strtod(item[2], NULL);
+ priv->geo.lat = floor(lat / 100);
+ lat -= priv->geo.lat * 100;
+ priv->geo.lat += lat / 60;
+
+ if (!g_ascii_strcasecmp(item[3],"S"))
+ priv->geo.lat=-priv->geo.lat;
+
+ lng = g_ascii_strtod(item[4], NULL);
+ priv->geo.lng = floor(lng / 100);
+ lng -= priv->geo.lng * 100;
+ priv->geo.lng += lng / 60;
+
+ if (!g_ascii_strcasecmp(item[5],"W"))
+ priv->geo.lng=-priv->geo.lng;
+
+ if (priv->valid == attr_position_valid_invalid)
+ ret = 1;
+ priv->valid = attr_position_valid_valid;
+ vehicle_file_restart_fix_timeout(priv);
+
+ if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
+ ret = 1;
+ strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
+ }
+
+ dbg(lvl_info, "latitude '%2.4f' longitude %2.4f", priv->geo.lat, priv->geo.lng);
+
+ } else {
+ if (priv->valid == attr_position_valid_valid)
+ ret = 1;
+ priv->valid=attr_position_valid_invalid;
+ }
+
+ if (*item[6])
+ sscanf(item[6], "%d", &priv->status);
+ if (*item[7])
+ sscanf(item[7], "%d", &priv->sats_used);
+ if (*item[8])
+ sscanf(item[8], "%lf", &priv->hdop);
+ if (*item[9])
+ sscanf(item[9], "%lf", &priv->height);
+
+ g_free(priv->nmea_data);
+ priv->nmea_data=priv->nmea_data_buf;
+ priv->nmea_data_buf=NULL;
+ if (priv->file_type == file_type_file) {
+ if (priv->watch) {
+ vehicle_file_disable_watch(priv);
+ event_add_timeout(priv->time, 0, priv->cbt);
+ }
+ }
+ }
+ if (!strncmp(&buffer[3], "VTG", 3)) {
+ /* 0 1 2 34 5 6 7 8
+ $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A
+ Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4],
+ Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8]
+ */
+ if (item[1] && item[7])
+ valid = 1;
+ if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D'))
+ valid = 1;
+ if (valid) {
+ priv->direction = g_ascii_strtod( item[1], NULL );
+ priv->speed = g_ascii_strtod( item[7], NULL );
+ dbg(lvl_info,"direction %lf, speed %2.1lf", priv->direction, priv->speed);
+ }
+ }
+ if (!strncmp(&buffer[3], "RMC", 3)) {
+ /* 1 1
+ 0 1 2 3 4 5 6 7 8 9 0 1
+ $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
+ Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9],
+ magnetic variation[10],magnetic variation direction[11]
+ */
+ if (*item[2] == 'A')
+ valid = 1;
+ if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D'))
+ valid = 1;
+ if (valid) {
+ priv->direction = g_ascii_strtod( item[8], NULL );
+ priv->speed = g_ascii_strtod( item[7], NULL );
+ priv->speed *= 1.852;
+ sscanf(item[9], "%02d%02d%02d",
+ &priv->fixday,
+ &priv->fixmonth,
+ &priv->fixyear);
+ priv->fixyear += 2000;
+
+ lat = g_ascii_strtod(item[3], NULL);
+ priv->geo.lat = floor(lat / 100);
+ lat -= priv->geo.lat * 100;
+ priv->geo.lat += lat / 60;
+
+ if (!g_ascii_strcasecmp(item[4],"S"))
+ priv->geo.lat=-priv->geo.lat;
+
+ lng = g_ascii_strtod(item[5], NULL);
+ priv->geo.lng = floor(lng / 100);
+ lng -= priv->geo.lng * 100;
+ priv->geo.lng += lng / 60;
+
+ if (!g_ascii_strcasecmp(item[6],"W"))
+ priv->geo.lng=-priv->geo.lng;
+
+ if (priv->valid == attr_position_valid_invalid)
+ ret = 1;
+ priv->valid=attr_position_valid_valid;
+ vehicle_file_restart_fix_timeout(priv);
+
+ if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
+ ret = 1;
+ strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
+ }
+
+ dbg(lvl_info, "latitude '%2.4f' longitude %2.4f", priv->geo.lat, priv->geo.lng);
+
+ } else {
+ if (priv->valid == attr_position_valid_valid)
+ ret = 1;
+ priv->valid=attr_position_valid_invalid;
+ }
+ }
+ if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
+ /*
+ 0 GSV Satellites in view
+ 1 2 Number of sentences for full data
+ 2 1 sentence 1 of 2
+ 3 08 Number of satellites in view
+
+ 4 01 Satellite PRN number
+ 5 40 Elevation, degrees
+ 6 083 Azimuth, degrees
+ 7 46 SNR - higher is better
+ for up to 4 satellites per sentence
+ *75 the checksum data, always begins with *
+ */
+ if (item[3]) {
+ sscanf(item[3], "%d", &priv->sats_visible);
+ }
+ j=4;
+ while (j+4 <= i && priv->current_count < 24) {
+ struct gps_sat *sat=&priv->next[priv->next_count++];
+ sat->prn=atoi(item[j]);
+ sat->elevation=atoi(item[j+1]);
+ sat->azimuth=atoi(item[j+2]);
+ sat->snr=atoi(item[j+3]);
+ j+=4;
+ }
+ if (!strcmp(item[1], item[2])) {
+ priv->sats_signal=0;
+ for (i = 0 ; i < priv->next_count ; i++) {
+ priv->current[i]=priv->next[i];
+ if (priv->current[i].snr)
+ priv->sats_signal++;
+ }
+ priv->current_count=priv->next_count;
+ priv->next_count=0;
+ }
+ }
+ if (!strncmp(&buffer[3], "ZDA", 3)) {
+ /*
+ 0 1 2 3 4 5 6
+ $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC
+ hhmmss HrMinSec(UTC)
+ dd,mm,yyy Day,Month,Year
+ xx local zone hours -13..13
+ yy local zone minutes 0..59
+ */
+ if (item[1] && item[2] && item[3] && item[4]) {
+ strncpy(priv->fixtime, item[1], strlen(priv->fixtime));
+ priv->fixday = atoi(item[2]);
+ priv->fixmonth = atoi(item[3]);
+ priv->fixyear = atoi(item[4]);
+ }
+ }
+ if (!strncmp(buffer, "$IISMD", 6)) {
+ /*
+ 0 1 2 3 4
+ $IISMD,dir,press,height,temp*CC"
+ dir Direction (0-359)
+ press Pressure (hpa, i.e. 1032)
+ height Barometric height above ground (meter)
+ temp Temperature (Degree Celsius)
+ */
+ if (item[1]) {
+ priv->magnetic_direction = g_ascii_strtod( item[1], NULL );
+ dbg(lvl_debug,"magnetic %d", priv->magnetic_direction);
+ }
+ }
+ return ret;
}
-//***************************************************************************
-/** @fn static void vehicle_file_io(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: function to get data from GPS
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-* @remarks
-*****************************************************************************
-**/
-static void
-vehicle_file_io(struct vehicle_priv *priv)
-{
- int size, rc = 0;
- char *str, *tok;
- dbg(lvl_debug, "vehicle_file_io : enter\n");
-
- if (priv->process_statefile) {
- unsigned char *data;
- priv->process_statefile=0;
- if (file_get_contents(priv->statefile, &data, &size)) {
- if (size > buffer_size)
- size=buffer_size;
- memcpy(priv->buffer, data, size);
- priv->buffer_pos=0;
- g_free(data);
- } else
- return;
- } else {
- size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1);
- }
- if (size <= 0) {
- switch (priv->on_eof) {
- case 0:
- vehicle_file_close(priv);
- vehicle_file_open(priv);
- break;
- case 1:
- vehicle_file_disable_watch(priv);
- break;
- case 2:
- exit(0);
- break;
- }
- return;
- }
- priv->buffer_pos += size;
- priv->buffer[priv->buffer_pos] = '\0';
- dbg(lvl_debug, "size=%d pos=%d buffer='%s'\n", size,
- priv->buffer_pos, priv->buffer);
- str = priv->buffer;
- while ((tok = strchr(str, '\n'))) {
- *tok++ = '\0';
- dbg(lvl_debug, "line='%s'\n", str);
- rc +=vehicle_file_parse(priv, str);
- str = tok;
- if (priv->file_type == file_type_file && rc)
- break;
- }
-
- if (str != priv->buffer) {
- size = priv->buffer + priv->buffer_pos - str;
- memmove(priv->buffer, str, size + 1);
- priv->buffer_pos = size;
- dbg(lvl_debug, "now pos=%d buffer='%s'\n",
- priv->buffer_pos, priv->buffer);
- } else if (priv->buffer_pos == buffer_size - 1) {
- dbg(lvl_debug,
- "Overflow. Most likely wrong baud rate or no nmea protocol\n");
- priv->buffer_pos = 0;
- }
- if (rc)
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+/**
+* @brief Function to get data from GPS
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_file_io(struct vehicle_priv *priv) {
+ int size, rc = 0;
+ char *str, *tok;
+ dbg(lvl_debug, "vehicle_file_io : enter");
+
+ if (priv->process_statefile) {
+ unsigned char *data;
+ priv->process_statefile=0;
+ if (file_get_contents(priv->statefile, &data, &size)) {
+ if (size > buffer_size)
+ size=buffer_size;
+ memcpy(priv->buffer, data, size);
+ priv->buffer_pos=0;
+ g_free(data);
+ } else
+ return;
+ } else {
+ size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1);
+ }
+ if (size <= 0) {
+ switch (priv->on_eof) {
+ case 0:
+ vehicle_file_close(priv);
+ vehicle_file_open(priv);
+ break;
+ case 1:
+ vehicle_file_disable_watch(priv);
+ break;
+ case 2:
+ exit(0);
+ break;
+ }
+ return;
+ }
+ priv->buffer_pos += size;
+ priv->buffer[priv->buffer_pos] = '\0';
+ dbg(lvl_debug, "size=%d pos=%d buffer='%s'", size,
+ priv->buffer_pos, priv->buffer);
+ str = priv->buffer;
+ while ((tok = strchr(str, '\n'))) {
+ *tok++ = '\0';
+ dbg(lvl_debug, "line='%s'", str);
+ rc +=vehicle_file_parse(priv, str);
+ str = tok;
+ if (priv->file_type == file_type_file && rc)
+ break;
+ }
+
+ if (str != priv->buffer) {
+ size = priv->buffer + priv->buffer_pos - str;
+ memmove(priv->buffer, str, size + 1);
+ priv->buffer_pos = size;
+ dbg(lvl_debug, "now pos=%d buffer='%s'",
+ priv->buffer_pos, priv->buffer);
+ } else if (priv->buffer_pos == buffer_size - 1) {
+ dbg(lvl_debug,
+ "Overflow. Most likely wrong baud rate or no nmea protocol");
+ priv->buffer_pos = 0;
+ }
+ if (rc)
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
-//***************************************************************************
-/** @fn static void vehicle_file_enable_watch(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: Enable watch
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-**/
-static void
-vehicle_file_enable_watch(struct vehicle_priv *priv)
-{
- dbg(lvl_debug, "enter\n");
+/**
+* @brief Enable watch
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_file_enable_watch(struct vehicle_priv *priv) {
+ dbg(lvl_debug, "enter");
#ifdef _WIN32
- // add an event : don't use glib timers and g_timeout_add
- if (priv->file_type == file_type_serial)
- {
- if (priv->timeout_callback != NULL)
+ // add an event : don't use glib timers and g_timeout_add
+ if (priv->file_type == file_type_serial) {
+ if (priv->timeout_callback != NULL)
priv->timeout = event_add_timeout(500, 1, priv->timeout_callback);
else
- dbg(lvl_warning, "error : watch not enabled : priv->timeout_callback is null\n"); }
- else
+ dbg(lvl_warning, "error : watch not enabled : priv->timeout_callback is null");
+ } else
#endif
{
- if (! priv->watch)
- priv->watch = event_add_watch(priv->fd, event_watch_cond_read, priv->cb);
+ if (! priv->watch)
+ priv->watch = event_add_watch(priv->fd, event_watch_cond_read, priv->cb);
}
}
-//***************************************************************************
-/** @fn static void vehicle_file_disable_watch(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: Disable watch
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
-**/
-static void
-vehicle_file_disable_watch(struct vehicle_priv *priv)
-{
- dbg(lvl_debug, "vehicle_file_disable_watch : enter\n");
+/**
+* @brief Disable watch
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_file_disable_watch(struct vehicle_priv *priv) {
+ dbg(lvl_debug, "vehicle_file_disable_watch : enter");
#ifdef _WIN32
- if(priv->file_type == file_type_serial)
- {
- if (priv->timeout) {
- event_remove_timeout(priv->timeout);
- priv->timeout=NULL; // dangling pointer! prevent double freeing.
+ if(priv->file_type == file_type_serial) {
+ if (priv->timeout) {
+ event_remove_timeout(priv->timeout);
+ priv->timeout=NULL; // dangling pointer! prevent double freeing.
}
- }
- else
+ } else
#endif //!_WIN32
{
- if (priv->watch)
- event_remove_watch(priv->watch);
- priv->watch = NULL;
+ if (priv->watch)
+ event_remove_watch(priv->watch);
+ priv->watch = NULL;
}
}
-//***************************************************************************
-/** @fn static void vehicle_priv vehicle_file_destroy(struct vehicle_priv *priv)
-*****************************************************************************
-* @b Description: Function called to uninitialize the plugin
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-*****************************************************************************
+/**
+* @brief Function called to uninitialize the plugin
+*
+* @param priv Pointer on the private data of the plugin
+*
* @remarks private data is freed by this function (g_free)
-*****************************************************************************
-**/
-static void
-vehicle_file_destroy(struct vehicle_priv *priv)
-{
- if (priv->statefile && priv->nmea_data) {
- struct attr readwrite={attr_readwrite};
- struct attr create={attr_create};
- struct attr *attrs[]={&readwrite,&create,NULL};
- struct file *f;
- readwrite.u.num=1;
- create.u.num=1;
- f=file_create(priv->statefile, attrs);
- if (f) {
- file_data_write(f, 0, strlen(priv->nmea_data), priv->nmea_data);
- file_fsync(f);
- file_destroy(f);
- }
- }
- vehicle_file_close(priv);
- callback_destroy(priv->cb);
- callback_destroy(priv->cbt);
- if (priv->statefile)
- g_free(priv->statefile);
- if (priv->source)
- g_free(priv->source);
- if (priv->buffer)
- g_free(priv->buffer);
- g_free(priv);
+*/
+static void vehicle_file_destroy(struct vehicle_priv *priv) {
+ if (priv->statefile && priv->nmea_data) {
+ struct attr readwrite= {attr_readwrite};
+ struct attr create= {attr_create};
+ struct attr *attrs[]= {&readwrite,&create,NULL};
+ struct file *f;
+ readwrite.u.num=1;
+ create.u.num=1;
+ f=file_create(priv->statefile, attrs);
+ if (f) {
+ file_data_write(f, 0, strlen(priv->nmea_data), priv->nmea_data);
+ file_fsync(f);
+ file_destroy(f);
+ }
+ }
+ vehicle_file_close(priv);
+ callback_destroy(priv->cb);
+ callback_destroy(priv->cbt);
+ if (priv->statefile)
+ g_free(priv->statefile);
+ if (priv->source)
+ g_free(priv->source);
+ if (priv->buffer)
+ g_free(priv->buffer);
+ g_free(priv);
}
-//***************************************************************************
-/** @fn static int vehicle_file_position_attr_get(struct vehicle_priv *priv,
-* enum attr_type type,
-* struct attr *attr)
-*****************************************************************************
-* @b Description: Function called to get attribute
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-* @param type : attribute type called
-* @param attr : structure to return the attribute value
-*****************************************************************************
-* @return 1 if ok
-* 0 for unkown or invalid attribute
-*****************************************************************************
-**/
-static int
-vehicle_file_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- switch (type) {
- case attr_position_fix_type:
- attr->u.num = priv->status;
- break;
- case attr_position_height:
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_magnetic_direction:
- attr->u.num = priv->magnetic_direction;
- break;
- case attr_position_hdop:
- attr->u.numd = &priv->hdop;
- break;
- case attr_position_qual:
- attr->u.num = priv->sats_visible;
- break;
- case attr_position_sats_signal:
- attr->u.num = priv->sats_signal;
- break;
- case attr_position_sats_used:
- attr->u.num = priv->sats_used;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_nmea:
- attr->u.str=priv->nmea_data;
- if (! attr->u.str)
- return 0;
- break;
- case attr_position_time_iso8601:
- if (!priv->fixyear || !priv->fixtime[0])
- return 0;
- sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ",
- priv->fixyear, priv->fixmonth, priv->fixday,
- priv->fixtime, (priv->fixtime+2), (priv->fixtime+4));
- attr->u.str=priv->fixiso8601;
- break;
- case attr_position_sat_item:
- dbg(lvl_debug,"at here\n");
- priv->sat_item.id_lo++;
- if (priv->sat_item.id_lo > priv->current_count) {
- priv->sat_item.id_lo=0;
- return 0;
- }
- attr->u.item=&priv->sat_item;
- break;
- case attr_position_valid:
- attr->u.num=priv->valid;
- break;
- default:
- return 0;
- }
- if (type != attr_position_sat_item)
- priv->sat_item.id_lo=0;
- attr->type = type;
- return 1;
+/**
+* @brief Function called to get attribute
+*
+* @param priv Pointer on the private data of the plugin
+* @param type Attribute type called
+* @param attr Structure to return the attribute value
+*
+* @return 1 if ok, 0 for unknown or invalid attribute
+*/
+static int vehicle_file_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ switch (type) {
+ case attr_position_fix_type:
+ attr->u.num = priv->status;
+ break;
+ case attr_position_height:
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_magnetic_direction:
+ attr->u.num = priv->magnetic_direction;
+ break;
+ case attr_position_hdop:
+ attr->u.numd = &priv->hdop;
+ break;
+ case attr_position_qual:
+ attr->u.num = priv->sats_visible;
+ break;
+ case attr_position_sats_signal:
+ attr->u.num = priv->sats_signal;
+ break;
+ case attr_position_sats_used:
+ attr->u.num = priv->sats_used;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_nmea:
+ attr->u.str=priv->nmea_data;
+ if (! attr->u.str)
+ return 0;
+ break;
+ case attr_position_time_iso8601:
+ if (!priv->fixyear || !priv->fixtime[0])
+ return 0;
+ sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ",
+ priv->fixyear, priv->fixmonth, priv->fixday,
+ priv->fixtime, (priv->fixtime+2), (priv->fixtime+4));
+ attr->u.str=priv->fixiso8601;
+ break;
+ case attr_position_sat_item:
+ dbg(lvl_debug,"at here");
+ priv->sat_item.id_lo++;
+ if (priv->sat_item.id_lo > priv->current_count) {
+ priv->sat_item.id_lo=0;
+ return 0;
+ }
+ attr->u.item=&priv->sat_item;
+ break;
+ case attr_position_valid:
+ attr->u.num=priv->valid;
+ break;
+ default:
+ return 0;
+ }
+ if (type != attr_position_sat_item)
+ priv->sat_item.id_lo=0;
+ attr->type = type;
+ return 1;
}
-//***************************************************************************
-/** @fn static int vehicle_file_sat_attr_get(struct vehicle_priv *priv,
-* enum attr_type type,
-* struct attr *attr)
-*****************************************************************************
-* @b Description: Function called to get satellite attribute
-*****************************************************************************
-* @param priv : pointer on the private data of the plugin
-* @param type : attribute type called
-* @param attr : structure to return the attribute value
-*****************************************************************************
-* @return 1 if ok
-* 0 for unkown attribute
-*****************************************************************************
-**/
-static int
-vehicle_file_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr)
-{
+/**
+* @brief Function called to get satellite attribute
+*
+* @param priv Pointer on the private data of the plugin
+* @param type Attribute type called
+* @param attr Structure to return the attribute value
+*
+* @return 1 if ok, 0 for unknown attribute
+*/
+static int vehicle_file_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) {
struct gps_sat *sat;
- struct vehicle_priv *priv=priv_data;
- if (priv->sat_item.id_lo < 1)
- return 0;
- if (priv->sat_item.id_lo > priv->current_count)
- return 0;
- sat=&priv->current[priv->sat_item.id_lo-1];
- switch (type) {
- case attr_sat_prn:
- attr->u.num=sat->prn;
- break;
- case attr_sat_elevation:
- attr->u.num=sat->elevation;
- break;
- case attr_sat_azimuth:
- attr->u.num=sat->azimuth;
- break;
- case attr_sat_snr:
- attr->u.num=sat->snr;
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+ struct vehicle_priv *priv=priv_data;
+ if (priv->sat_item.id_lo < 1)
+ return 0;
+ if (priv->sat_item.id_lo > priv->current_count)
+ return 0;
+ sat=&priv->current[priv->sat_item.id_lo-1];
+ switch (type) {
+ case attr_sat_prn:
+ attr->u.num=sat->prn;
+ break;
+ case attr_sat_elevation:
+ attr->u.num=sat->elevation;
+ break;
+ case attr_sat_azimuth:
+ attr->u.num=sat->azimuth;
+ break;
+ case attr_sat_snr:
+ attr->u.num=sat->snr;
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
static struct item_methods vehicle_file_sat_methods = {
- NULL,
- NULL,
- NULL,
- vehicle_file_sat_attr_get,
+ NULL,
+ NULL,
+ NULL,
+ vehicle_file_sat_attr_get,
};
static struct vehicle_methods vehicle_file_methods = {
- vehicle_file_destroy,
- vehicle_file_position_attr_get,
+ vehicle_file_destroy,
+ vehicle_file_position_attr_get,
};
-//***************************************************************************
-/** @fn static struct vehicle_priv * vehicle_file_new_file(
-* struct vehicle_methods *meth,
-* struct callback_list *cbl,
-* struct attr **attrs)
-*****************************************************************************
-* @b Description: Function called to initialize the plugin
-*****************************************************************************
-* @param meth : ?
-* @param cbl : ?
-* @param attrs : ?
-*****************************************************************************
-* @return pointer on the private data of the plugin
-*****************************************************************************
-* @remarks private data is allocated by this function (g_new0)
-*****************************************************************************
-**/
-static struct vehicle_priv *
-vehicle_file_new_file(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
- struct attr *source;
- struct attr *time;
- struct attr *on_eof;
- struct attr *baudrate;
- struct attr *checksum_ignore;
- struct attr *state_file;
-
- dbg(lvl_debug, "enter\n");
-
- source = attr_search(attrs, NULL, attr_source);
- if(source == NULL){
- dbg(lvl_error,"Missing source attribute");
- return NULL;
+/**
+* @brief Function called to initialize the plugin
+*
+* @param meth ?
+* @param cbl ?
+* @param attrs ?
+*
+* @return Pointer on the private data of the plugin
+*
+* @remarks Private data is allocated by this function (g_new0)
+*/
+static struct vehicle_priv *vehicle_file_new_file(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
+ struct attr *source;
+ struct attr *time;
+ struct attr *on_eof;
+ struct attr *baudrate;
+ struct attr *checksum_ignore;
+ struct attr *state_file;
+
+ dbg(lvl_debug, "enter");
+
+ source = attr_search(attrs, NULL, attr_source);
+ if(source == NULL) {
+ dbg(lvl_error,"Missing source attribute");
+ return NULL;
}
- ret = g_new0(struct vehicle_priv, 1); // allocate and initialize to 0
- ret->fd = -1;
- ret->cbl = cbl;
- ret->source = g_strdup(source->u.str);
- ret->buffer = g_malloc(buffer_size);
- ret->time=1000;
- ret->baudrate=B4800;
- state_file=attr_search(attrs, NULL, attr_state_file);
- if (state_file)
- ret->statefile=g_strdup(state_file->u.str);
- time = attr_search(attrs, NULL, attr_time);
- if (time)
- ret->time=time->u.num;
- baudrate = attr_search(attrs, NULL, attr_baudrate);
- if (baudrate) {
- switch (baudrate->u.num) {
- case 4800:
- ret->baudrate=B4800;
- break;
- case 9600:
- ret->baudrate=B9600;
- break;
- case 19200:
- ret->baudrate=B19200;
- break;
+ ret = g_new0(struct vehicle_priv, 1); // allocate and initialize to 0
+ ret->fd = -1;
+ ret->cbl = cbl;
+ ret->source = g_strdup(source->u.str);
+ ret->buffer = g_malloc(buffer_size);
+ ret->time=1000;
+ ret->baudrate=B4800;
+ ret->fixtime[0] = '\0';
+ ret->ev_fix_timeout = NULL;
+ state_file=attr_search(attrs, NULL, attr_state_file);
+ if (state_file)
+ ret->statefile=g_strdup(state_file->u.str);
+ time = attr_search(attrs, NULL, attr_time);
+ if (time)
+ ret->time=time->u.num;
+ baudrate = attr_search(attrs, NULL, attr_baudrate);
+ if (baudrate) {
+ switch (baudrate->u.num) {
+ case 4800:
+ ret->baudrate=B4800;
+ break;
+ case 9600:
+ ret->baudrate=B9600;
+ break;
+ case 19200:
+ ret->baudrate=B19200;
+ break;
#ifdef B38400
- case 38400:
- ret->baudrate=B38400;
- break;
+ case 38400:
+ ret->baudrate=B38400;
+ break;
#endif
#ifdef B57600
- case 57600:
- ret->baudrate=B57600;
- break;
+ case 57600:
+ ret->baudrate=B57600;
+ break;
#endif
#ifdef B115200
- case 115200:
- ret->baudrate=B115200;
- break;
+ case 115200:
+ ret->baudrate=B115200;
+ break;
#endif
- }
- }
- checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore);
- if (checksum_ignore)
- ret->checksum_ignore=checksum_ignore->u.num;
- ret->attrs = attrs;
- on_eof = attr_search(attrs, NULL, attr_on_eof);
- if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "stop"))
- ret->on_eof=1;
- if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "exit"))
- ret->on_eof=2;
- dbg(lvl_debug,"on_eof=%d\n", ret->on_eof);
- *meth = vehicle_file_methods;
- ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret);
- ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret);
- if (ret->statefile && file_exists(ret->statefile)) {
- ret->process_statefile=1;
- event_add_timeout(1000, 0, ret->cb);
- }
- ret->sat_item.type=type_position_sat;
- ret->sat_item.id_hi=ret->sat_item.id_lo=0;
- ret->sat_item.priv_data=ret;
- ret->sat_item.meth=&vehicle_file_sat_methods;
+ }
+ }
+ checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore);
+ if (checksum_ignore)
+ ret->checksum_ignore=checksum_ignore->u.num;
+ ret->attrs = attrs;
+ on_eof = attr_search(attrs, NULL, attr_on_eof);
+ if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "stop"))
+ ret->on_eof=1;
+ if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "exit"))
+ ret->on_eof=2;
+ dbg(lvl_debug,"on_eof=%d", ret->on_eof);
+ *meth = vehicle_file_methods;
+ ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret);
+ ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret);
+ ret->cb_fix_timeout=callback_new_1(callback_cast(vehicle_file_fix_timeout_cb), ret);
+ if (ret->statefile && file_exists(ret->statefile)) {
+ ret->process_statefile=1;
+ event_add_timeout(1000, 0, ret->cb);
+ }
+ ret->sat_item.type=type_position_sat;
+ ret->sat_item.id_hi=ret->sat_item.id_lo=0;
+ ret->sat_item.priv_data=ret;
+ ret->sat_item.meth=&vehicle_file_sat_methods;
#ifdef _WIN32
- ret->no_data_count = 0;
+ ret->no_data_count = 0;
#endif
- dbg(lvl_debug, "vehicle_file_new_file:open\n");
- if (!vehicle_file_open(ret)) {
- dbg(lvl_error, "Failed to open '%s'\n", ret->source);
- }
+ dbg(lvl_debug, "vehicle_file_new_file:open");
+ if (!vehicle_file_open(ret)) {
+ dbg(lvl_error, "Failed to open '%s'", ret->source);
+ }
- vehicle_file_enable_watch(ret);
- // vehicle_file_destroy(ret);
- // return NULL;
- dbg(lvl_debug, "leave\n");
- return ret;
+ vehicle_file_enable_watch(ret);
+ // vehicle_file_destroy(ret);
+ // return NULL;
+ dbg(lvl_debug, "leave");
+ return ret;
}
-//***************************************************************************
-/** @fn void plugin_init(void)
-*****************************************************************************
-* @b Description: Initialisation of vehicle_file plugin
-*****************************************************************************
-**/
-void plugin_init(void)
-{
- dbg(lvl_debug, "vehicle_file:plugin_init:enter\n");
- plugin_register_category_vehicle("file", vehicle_file_new_file);
- plugin_register_category_vehicle("pipe", vehicle_file_new_file);
- plugin_register_category_vehicle("socket", vehicle_file_new_file);
- plugin_register_category_vehicle("serial", vehicle_file_new_file);
+/**
+* @brief Initialisation of vehicle_file plugin
+*/
+void plugin_init(void) {
+ dbg(lvl_debug, "vehicle_file:plugin_init:enter");
+ plugin_register_category_vehicle("file", vehicle_file_new_file);
+ plugin_register_category_vehicle("pipe", vehicle_file_new_file);
+ plugin_register_category_vehicle("socket", vehicle_file_new_file);
+ plugin_register_category_vehicle("serial", vehicle_file_new_file);
}
diff --git a/navit/vehicle/file/vehicle_pipe.c b/navit/vehicle/file/vehicle_pipe.c
index 420390d4e..2f9f6c227 100644
--- a/navit/vehicle/file/vehicle_pipe.c
+++ b/navit/vehicle/file/vehicle_pipe.c
@@ -20,8 +20,6 @@
#include "config.h"
#include "plugin.h"
-void
-plugin_init(void)
-{
- plugin_get_category_vehicle("file");
+void plugin_init(void) {
+ plugin_get_category_vehicle("file");
}
diff --git a/navit/vehicle/file/vehicle_serial.c b/navit/vehicle/file/vehicle_serial.c
index 420390d4e..2f9f6c227 100644
--- a/navit/vehicle/file/vehicle_serial.c
+++ b/navit/vehicle/file/vehicle_serial.c
@@ -20,8 +20,6 @@
#include "config.h"
#include "plugin.h"
-void
-plugin_init(void)
-{
- plugin_get_category_vehicle("file");
+void plugin_init(void) {
+ plugin_get_category_vehicle("file");
}
diff --git a/navit/vehicle/file/vehicle_socket.c b/navit/vehicle/file/vehicle_socket.c
index 420390d4e..2f9f6c227 100644
--- a/navit/vehicle/file/vehicle_socket.c
+++ b/navit/vehicle/file/vehicle_socket.c
@@ -20,8 +20,6 @@
#include "config.h"
#include "plugin.h"
-void
-plugin_init(void)
-{
- plugin_get_category_vehicle("file");
+void plugin_init(void) {
+ plugin_get_category_vehicle("file");
}
diff --git a/navit/vehicle/gpsd/CMakeLists.txt b/navit/vehicle/gpsd/CMakeLists.txt
index 091df2f71..75c3866c4 100644
--- a/navit/vehicle/gpsd/CMakeLists.txt
+++ b/navit/vehicle/gpsd/CMakeLists.txt
@@ -1,8 +1,8 @@
module_add_library(vehicle_gpsd vehicle_gpsd.c)
if (LIBGPS19_FOUND)
- set_property(
- TARGET vehicle_gpsd
- APPEND PROPERTY COMPILE_DEFINITIONS HAVE_LIBGPS19=1
- )
+ set_property(
+ TARGET vehicle_gpsd
+ APPEND PROPERTY COMPILE_DEFINITIONS HAVE_LIBGPS19=1
+ )
endif (LIBGPS19_FOUND)
diff --git a/navit/vehicle/gpsd/vehicle_gpsd.c b/navit/vehicle/gpsd/vehicle_gpsd.c
index a8c29cd97..99a4b4ffc 100644
--- a/navit/vehicle/gpsd/vehicle_gpsd.c
+++ b/navit/vehicle/gpsd/vehicle_gpsd.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -35,32 +35,40 @@
#include "event.h"
#include "types.h"
+/**
+ * @defgroup vehicle-gpsd Vehicle Gpsd
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from the gpsd service
+ *
+ * @{
+ */
+
static struct vehicle_priv {
- char *source;
- char *gpsd_query;
- struct callback_list *cbl;
- struct callback *cb, *cbt;
- struct event_watch *evwatch;
- guint retry_interval;
- struct gps_data_t *gps;
- struct coord_geo geo;
- double speed;
- double direction;
- double height;
- double hdop;
- int status;
- int fix_type;
- time_t fix_time;
- int sats;
- int sats_signal;
- int sats_used;
- char *nmea_data;
- char *nmea_data_buf;
- struct event_timeout *retry_timer2;
- struct attr ** attrs;
- char fixiso8601[128];
+ char *source;
+ char *gpsd_query;
+ struct callback_list *cbl;
+ struct callback *cb, *cbt;
+ struct event_watch *evwatch;
+ guint retry_interval;
+ struct gps_data_t *gps;
+ struct coord_geo geo;
+ double speed;
+ double direction;
+ double height;
+ double hdop;
+ int status;
+ int fix_type;
+ time_t fix_time;
+ int sats;
+ int sats_signal;
+ int sats_used;
+ char *nmea_data;
+ char *nmea_data_buf;
+ struct event_timeout *retry_timer2;
+ struct attr ** attrs;
+ char fixiso8601[128];
#ifdef HAVE_GPSBT
- gpsbt_t context;
+ gpsbt_t context;
#endif
} *vehicle_last;
@@ -74,124 +82,127 @@ static void
vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len)
#else
vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len,
- int level)
+ int level)
#endif
{
- char *pos,*nmea_data_buf;
- int i=0,sats_signal=0;
-
- struct vehicle_priv *priv = vehicle_last;
- if( len > 0 && buf[0] == '$' ) {
- char buffer[len+2];
- buffer[len+1]='\0';
- memcpy(buffer, buf, len);
- pos=strchr(buffer,'\n');
- if(!pos) {
- pos=strchr(buffer,'\r');
- }
- if (pos) {
- *pos ='\n';
- *++pos='\0';
- if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
- nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, NULL);
- g_free(priv->nmea_data_buf);
- priv->nmea_data_buf=nmea_data_buf;
- } else {
- dbg(lvl_error, "nmea buffer overflow, discarding '%s'\n", buffer);
- }
- }
- }
- dbg(lvl_debug,"data->set="LONGLONG_HEX_FMT"\n", (unsigned long long)data->set);
- if (data->set & SPEED_SET) {
- priv->speed = data->fix.speed * 3.6;
- if(!isnan(data->fix.speed))
- callback_list_call_attr_0(priv->cbl, attr_position_speed);
- data->set &= ~SPEED_SET;
- }
- if (data->set & TRACK_SET) {
- priv->direction = data->fix.track;
- data->set &= ~TRACK_SET;
- }
- if (data->set & ALTITUDE_SET) {
- priv->height = data->fix.altitude;
- data->set &= ~ALTITUDE_SET;
- }
- if (data->set & SATELLITE_SET) {
+ char *pos,*nmea_data_buf;
+ int i=0,sats_signal=0;
+
+ struct vehicle_priv *priv = vehicle_last;
+ if( len > 0 && buf[0] == '$' ) {
+ char buffer[len+2];
+ buffer[len+1]='\0';
+ memcpy(buffer, buf, len);
+ pos=strchr(buffer,'\n');
+ if(!pos) {
+ pos=strchr(buffer,'\r');
+ }
+ if (pos) {
+ *pos ='\n';
+ *++pos='\0';
+ if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
+ nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, NULL);
+ g_free(priv->nmea_data_buf);
+ priv->nmea_data_buf=nmea_data_buf;
+ } else {
+ dbg(lvl_error, "nmea buffer overflow, discarding '%s'", buffer);
+ }
+ }
+ }
+
+ dbg(lvl_debug,"data->set="LONGLONG_HEX_FMT"", (unsigned long long)data->set);
+ if (data->set & SPEED_SET) {
+ priv->speed = data->fix.speed * MPS_TO_KPH;
+ if(!isnan(data->fix.speed))
+ callback_list_call_attr_0(priv->cbl, attr_position_speed);
+ data->set &= ~SPEED_SET;
+ }
+
+ if (data->set & TRACK_SET) {
+ priv->direction = data->fix.track;
+ data->set &= ~TRACK_SET;
+ }
+ if (data->set & ALTITUDE_SET) {
+ priv->height = data->fix.altitude;
+ data->set &= ~ALTITUDE_SET;
+ }
+ if (data->set & SATELLITE_SET) {
// We cannot rely on GPSD_API_MAJOR_VERSION here because it was not
// incremented for this change :-(.
#ifdef HAVE_LIBGPS19
- if(data->satellites_visible > 0) {
+ if(data->satellites_visible > 0) {
#else
- if(data->satellites > 0) {
+ if(data->satellites > 0) {
#endif
- sats_signal=0;
+ sats_signal=0;
#ifdef HAVE_LIBGPS19
- for( i=0;i<data->satellites_visible;i++) {
+ for( i=0; i<data->satellites_visible; i++) {
#else
- for( i=0;i<data->satellites;i++) {
+ for( i=0; i<data->satellites; i++) {
#endif
#if GPSD_API_MAJOR_VERSION >= 6
- if (data->skyview[i].ss > 0)
+ if (data->skyview[i].ss > 0)
#else
- if (data->ss[i] > 0)
+ if (data->ss[i] > 0)
#endif
- sats_signal++;
- }
- }
+ sats_signal++;
+ }
+ }
#ifdef HAVE_LIBGPS19
- if (priv->sats_used != data->satellites_used || priv->sats != data->satellites_visible || priv->sats_signal != sats_signal ) {
+ if (priv->sats_used != data->satellites_used || priv->sats != data->satellites_visible
+ || priv->sats_signal != sats_signal ) {
#else
- if (priv->sats_used != data->satellites_used || priv->sats != data->satellites || priv->sats_signal != sats_signal ) {
+ if (priv->sats_used != data->satellites_used || priv->sats != data->satellites || priv->sats_signal != sats_signal ) {
#endif
- priv->sats_used = data->satellites_used;
+ priv->sats_used = data->satellites_used;
#ifdef HAVE_LIBGPS19
- priv->sats = data->satellites_visible;
+ priv->sats = data->satellites_visible;
#else
- priv->sats = data->satellites;
+ priv->sats = data->satellites;
#endif
- priv->sats_signal = sats_signal;
- callback_list_call_attr_0(priv->cbl, attr_position_sats);
- }
- data->set &= ~SATELLITE_SET;
- }
- if (data->set & STATUS_SET) {
- priv->status = data->status;
- data->set &= ~STATUS_SET;
- }
- if (data->set & MODE_SET) {
- priv->fix_type = data->fix.mode - 1;
- data->set &= ~MODE_SET;
- }
- if (data->set & TIME_SET) {
- priv->fix_time = data->fix.time;
- data->set &= ~TIME_SET;
- }
+ priv->sats_signal = sats_signal;
+ callback_list_call_attr_0(priv->cbl, attr_position_sats);
+ }
+ data->set &= ~SATELLITE_SET;
+ }
+ if (data->set & STATUS_SET) {
+ priv->status = data->status;
+ data->set &= ~STATUS_SET;
+ }
+ if (data->set & MODE_SET) {
+ priv->fix_type = data->fix.mode - 1;
+ data->set &= ~MODE_SET;
+ }
+ if (data->set & TIME_SET) {
+ priv->fix_time = data->fix.time;
+ data->set &= ~TIME_SET;
+ }
#ifdef HAVE_LIBGPS19
- if (data->set & DOP_SET) {
- dbg(lvl_debug, "pdop : %g\n", data->dop.pdop);
- priv->hdop = data->dop.pdop;
- data->set &= ~DOP_SET;
+ if (data->set & DOP_SET) {
+ dbg(lvl_debug, "pdop : %g", data->dop.pdop);
+ priv->hdop = data->dop.pdop;
+ data->set &= ~DOP_SET;
#else
- if (data->set & PDOP_SET) {
- dbg(lvl_debug, "pdop : %g\n", data->pdop);
- priv->hdop = data->hdop;
- data->set &= ~PDOP_SET;
+ if (data->set & PDOP_SET) {
+ dbg(lvl_debug, "pdop : %g", data->pdop);
+ priv->hdop = data->hdop;
+ data->set &= ~PDOP_SET;
#endif
- }
- if (data->set & LATLON_SET) {
- priv->geo.lat = data->fix.latitude;
- priv->geo.lng = data->fix.longitude;
- dbg(lvl_debug,"lat=%f lng=%f\n", priv->geo.lat, priv->geo.lng);
- g_free(priv->nmea_data);
- priv->nmea_data=priv->nmea_data_buf;
- priv->nmea_data_buf=NULL;
- data->set &= ~LATLON_SET;
- }
- // If data->fix.speed is NAN, then the drawing gets jumpy.
- if (! isnan(data->fix.speed) && priv->fix_type > 0) {
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- }
- dbg(lvl_info,"speed ok\n");
+ }
+ if (data->set & LATLON_SET) {
+ priv->geo.lat = data->fix.latitude;
+ priv->geo.lng = data->fix.longitude;
+ dbg(lvl_debug,"lat=%f lng=%f", priv->geo.lat, priv->geo.lng);
+ g_free(priv->nmea_data);
+ priv->nmea_data=priv->nmea_data_buf;
+ priv->nmea_data_buf=NULL;
+ data->set &= ~LATLON_SET;
+ }
+ // If data->fix.speed is NAN, then the drawing gets jumpy.
+ if (! isnan(data->fix.speed) && priv->fix_type > 0) {
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ }
+ dbg(lvl_info,"speed ok");
}
/**
@@ -199,277 +210,264 @@ vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len,
* Return FALSE if retry not required
* Return TRUE to try again
*/
-static int
-vehicle_gpsd_try_open(struct vehicle_priv *priv)
-{
- char *source = g_strdup(priv->source);
- char *colon = index(source + 7, ':');
- char *port=NULL;
- if (colon) {
- *colon = '\0';
- port=colon+1;
- }
- dbg(lvl_debug,"Trying to connect to %s:%s\n",source+7,port?port:"default");
+static int vehicle_gpsd_try_open(struct vehicle_priv *priv) {
+ char *source = g_strdup(priv->source);
+ char *colon = index(source + 7, ':');
+ char *port=NULL;
+ if (colon) {
+ *colon = '\0';
+ port=colon+1;
+ }
+ dbg(lvl_debug,"Trying to connect to %s:%s",source+7,port?port:"default");
#if GPSD_API_MAJOR_VERSION >= 5
- /* gps_open returns 0 on success */
- if (gps_open(source + 7, port, priv->gps)) {
+ /* gps_open returns 0 on success */
+ if (gps_open(source + 7, port, priv->gps)) {
#else
- priv->gps = gps_open(source + 7, port);
- if(!priv->gps) {
+ priv->gps = gps_open(source + 7, port);
+ if(!priv->gps) {
#endif
- dbg(lvl_error,"gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?\n", priv->source, priv->retry_interval);
- g_free(source);
- return TRUE;
- }
- g_free(source);
+ dbg(lvl_error,"gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?", priv->source,
+ priv->retry_interval);
+ g_free(source);
+ return TRUE;
+ }
+ g_free(source);
#ifdef HAVE_LIBGPS19
- if (strchr(priv->gpsd_query,'r'))
- gps_stream(priv->gps, WATCH_ENABLE|WATCH_NMEA|WATCH_JSON, NULL);
- else
- gps_stream(priv->gps, WATCH_ENABLE|WATCH_JSON, NULL);
+ if (strchr(priv->gpsd_query,'r'))
+ gps_stream(priv->gps, WATCH_ENABLE|WATCH_NMEA|WATCH_JSON, NULL);
+ else
+ gps_stream(priv->gps, WATCH_ENABLE|WATCH_JSON, NULL);
#else
- gps_query(priv->gps, priv->gpsd_query);
+ gps_query(priv->gps, priv->gpsd_query);
#endif
#if GPSD_API_MAJOR_VERSION < 5
- gps_set_raw_hook(priv->gps, vehicle_gpsd_callback);
+ gps_set_raw_hook(priv->gps, vehicle_gpsd_callback);
#endif
- priv->cb = callback_new_1(callback_cast(vehicle_gpsd_io), priv);
- priv->cbt = callback_new_1(callback_cast(vehicle_gpsd_try_open), priv);
- priv->evwatch = event_add_watch(priv->gps->gps_fd, event_watch_cond_read, priv->cb);
- if (!priv->gps->gps_fd) {
- dbg(lvl_error,"Warning: gps_fd is 0, most likely you have used a gps.h incompatible to libgps");
- }
- dbg(lvl_debug,"Connected to gpsd fd=%d evwatch=%p\n", priv->gps->gps_fd, priv->evwatch);
- event_remove_timeout(priv->retry_timer2);
- priv->retry_timer2=NULL;
- return FALSE;
+ priv->cb = callback_new_1(callback_cast(vehicle_gpsd_io), priv);
+ priv->cbt = callback_new_1(callback_cast(vehicle_gpsd_try_open), priv);
+ priv->evwatch = event_add_watch(priv->gps->gps_fd, event_watch_cond_read, priv->cb);
+ if (!priv->gps->gps_fd) {
+ dbg(lvl_error,"Warning: gps_fd is 0, most likely you have used a gps.h incompatible to libgps");
+ }
+ dbg(lvl_debug,"Connected to gpsd fd=%d evwatch=%p", priv->gps->gps_fd, priv->evwatch);
+ event_remove_timeout(priv->retry_timer2);
+ priv->retry_timer2=NULL;
+ return FALSE;
}
/**
* Open a connection to gpsd. Will re-try the connection if it fails
*/
-static void
-vehicle_gpsd_open(struct vehicle_priv *priv)
-{
+static void vehicle_gpsd_open(struct vehicle_priv *priv) {
#ifdef HAVE_GPSBT
- char errstr[256] = "";
- /* We need to start gpsd (via gpsbt) first. */
- errno = 0;
- memset(&priv->context, 0, sizeof(gpsbt_t));
- if(gpsbt_start(NULL, 0, 0, 0, errstr, sizeof(errstr),
- 0, &priv->context) < 0) {
- dbg(lvl_error,"Error connecting to GPS with gpsbt: (%d) %s (%s)\n",
- errno, strerror(errno), errstr);
- }
- sleep(1); /* give gpsd time to start */
- dbg(lvl_debug,"gpsbt_start: completed\n");
+ char errstr[256] = "";
+ /* We need to start gpsd (via gpsbt) first. */
+ errno = 0;
+ memset(&priv->context, 0, sizeof(gpsbt_t));
+ if(gpsbt_start(NULL, 0, 0, 0, errstr, sizeof(errstr),
+ 0, &priv->context) < 0) {
+ dbg(lvl_error,"Error connecting to GPS with gpsbt: (%d) %s (%s)",
+ errno, strerror(errno), errstr);
+ }
+ sleep(1); /* give gpsd time to start */
+ dbg(lvl_debug,"gpsbt_start: completed");
#endif
- priv->retry_timer2=NULL;
- if (vehicle_gpsd_try_open(priv))
- priv->retry_timer2=event_add_timeout(priv->retry_interval*1000, 1, priv->cbt);
+ priv->retry_timer2=NULL;
+ if (vehicle_gpsd_try_open(priv))
+ priv->retry_timer2=event_add_timeout(priv->retry_interval*1000, 1, priv->cbt);
}
-static void
-vehicle_gpsd_close(struct vehicle_priv *priv)
-{
+static void vehicle_gpsd_close(struct vehicle_priv *priv) {
#ifdef HAVE_GPSBT
- int err;
+ int err;
#endif
- if (priv->retry_timer2) {
- event_remove_timeout(priv->retry_timer2);
- priv->retry_timer2=NULL;
- }
- if (priv->evwatch) {
- event_remove_watch(priv->evwatch);
- priv->evwatch = NULL;
- }
- if (priv->cb) {
- callback_destroy(priv->cb);
- priv->cb = NULL;
- }
- if (priv->cbt) {
- callback_destroy(priv->cbt);
- priv->cbt = NULL;
- }
- if (priv->gps) {
- gps_close(priv->gps);
+ if (priv->retry_timer2) {
+ event_remove_timeout(priv->retry_timer2);
+ priv->retry_timer2=NULL;
+ }
+ if (priv->evwatch) {
+ event_remove_watch(priv->evwatch);
+ priv->evwatch = NULL;
+ }
+ if (priv->cb) {
+ callback_destroy(priv->cb);
+ priv->cb = NULL;
+ }
+ if (priv->cbt) {
+ callback_destroy(priv->cbt);
+ priv->cbt = NULL;
+ }
+ if (priv->gps) {
+ gps_close(priv->gps);
#if GPSD_API_MAJOR_VERSION >= 5
- g_free(priv->gps);
+ g_free(priv->gps);
#endif
- priv->gps = NULL;
- }
+ priv->gps = NULL;
+ }
#ifdef HAVE_GPSBT
- err = gpsbt_stop(&priv->context);
- if (err < 0) {
- dbg(lvl_error,"Error %d while gpsbt_stop", err);
- }
- dbg(lvl_debug,"gpsbt_stop: completed, (%d)",err);
+ err = gpsbt_stop(&priv->context);
+ if (err < 0) {
+ dbg(lvl_error,"Error %d while gpsbt_stop", err);
+ }
+ dbg(lvl_debug,"gpsbt_stop: completed, (%d)",err);
#endif
}
-static void
-vehicle_gpsd_io(struct vehicle_priv *priv)
-{
- dbg(lvl_debug, "enter\n");
- if (priv->gps) {
- vehicle_last = priv;
+static void vehicle_gpsd_io(struct vehicle_priv *priv) {
+ dbg(lvl_debug, "enter");
+ if (priv->gps) {
+ vehicle_last = priv;
#if GPSD_API_MAJOR_VERSION >= 5
- int read_result;
- /* Read until EOF, in case we are lagging behind.
- * No point in processing old GPS reports. */
- while((read_result=gps_read(priv->gps))>0);
- if(read_result==-1) {
- dbg(lvl_error,"gps_poll failed\n");
- vehicle_gpsd_close(priv);
- vehicle_gpsd_open(priv);
- }
- else {
- const char *buf;
- buf = gps_data(priv->gps);
- vehicle_gpsd_callback(priv->gps,buf,strlen(buf));
- }
+ int read_result;
+ /* Read until EOF, in case we are lagging behind.
+ * No point in processing old GPS reports. */
+#if GPSD_API_MAJOR_VERSION >= 7
+ while((read_result=gps_read(priv->gps, NULL, 0))>0);
+#else
+ while((read_result=gps_read(priv->gps))>0);
+#endif
+ if(read_result==-1) {
+ dbg(lvl_error,"gps_poll failed");
+ vehicle_gpsd_close(priv);
+ vehicle_gpsd_open(priv);
+ } else {
+ const char *buf;
+ buf = gps_data(priv->gps);
+ vehicle_gpsd_callback(priv->gps,buf,strlen(buf));
+ }
#else
- if (gps_poll(priv->gps)) {
- dbg(lvl_error,"gps_poll failed\n");
- vehicle_gpsd_close(priv);
- vehicle_gpsd_open(priv);
- }
+ if (gps_poll(priv->gps)) {
+ dbg(lvl_error,"gps_poll failed");
+ vehicle_gpsd_close(priv);
+ vehicle_gpsd_open(priv);
+ }
#endif
- }
+ }
}
-static void
-vehicle_gpsd_destroy(struct vehicle_priv *priv)
-{
- vehicle_gpsd_close(priv);
- if (priv->source)
- g_free(priv->source);
- if (priv->gpsd_query)
- g_free(priv->gpsd_query);
+static void vehicle_gpsd_destroy(struct vehicle_priv *priv) {
+ vehicle_gpsd_close(priv);
+ if (priv->source)
+ g_free(priv->source);
+ if (priv->gpsd_query)
+ g_free(priv->gpsd_query);
#if GPSD_API_MAJOR_VERSION >= 5
- g_free(priv->gps);
+ g_free(priv->gps);
#endif
- g_free(priv);
+ g_free(priv);
}
-static int
-vehicle_gpsd_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- struct attr * active=NULL;
- switch (type) {
- case attr_position_fix_type:
- attr->u.num = priv->fix_type;
- break;
- case attr_position_height:
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_hdop:
- attr->u.numd = &priv->hdop;
- break;
- case attr_position_qual:
- attr->u.num = priv->sats;
- break;
- case attr_position_sats_signal:
- attr->u.num = priv->sats_signal;
- break;
- case attr_position_sats_used:
- attr->u.num = priv->sats_used;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_nmea:
- attr->u.str=priv->nmea_data;
- if (! attr->u.str)
- return 0;
- break;
- case attr_position_time_iso8601:
- {
- struct tm tm;
- if (!priv->fix_time)
- return 0;
- if (gmtime_r(&priv->fix_time, &tm)) {
- strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
- "%Y-%m-%dT%TZ", &tm);
- attr->u.str=priv->fixiso8601;
- } else
- return 0;
- }
- break;
- case attr_active:
- active = attr_search(priv->attrs,NULL,attr_active);
- if(active != NULL) {
- attr->u.num=active->u.num;
- return 1;
- } else
- return 0;
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_gpsd_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ struct attr * active=NULL;
+ switch (type) {
+ case attr_position_fix_type:
+ attr->u.num = priv->fix_type;
+ break;
+ case attr_position_height:
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_hdop:
+ attr->u.numd = &priv->hdop;
+ break;
+ case attr_position_qual:
+ attr->u.num = priv->sats;
+ break;
+ case attr_position_sats_signal:
+ attr->u.num = priv->sats_signal;
+ break;
+ case attr_position_sats_used:
+ attr->u.num = priv->sats_used;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_nmea:
+ attr->u.str=priv->nmea_data;
+ if (! attr->u.str)
+ return 0;
+ break;
+ case attr_position_time_iso8601: {
+ struct tm tm;
+ if (!priv->fix_time)
+ return 0;
+ if (gmtime_r(&priv->fix_time, &tm)) {
+ strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
+ "%Y-%m-%dT%TZ", &tm);
+ attr->u.str=priv->fixiso8601;
+ } else
+ return 0;
+ }
+ break;
+ case attr_active:
+ active = attr_search(priv->attrs,NULL,attr_active);
+ if(active != NULL) {
+ attr->u.num=active->u.num;
+ return 1;
+ } else
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
static struct vehicle_methods vehicle_gpsd_methods = {
- vehicle_gpsd_destroy,
- vehicle_gpsd_position_attr_get,
+ vehicle_gpsd_destroy,
+ vehicle_gpsd_position_attr_get,
};
-static struct vehicle_priv *
-vehicle_gpsd_new_gpsd(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
- struct attr *source, *query, *retry_int;
+static struct vehicle_priv *vehicle_gpsd_new_gpsd(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
+ struct attr *source, *query, *retry_int;
- dbg(lvl_debug, "enter\n");
- source = attr_search(attrs, NULL, attr_source);
- ret = g_new0(struct vehicle_priv, 1);
+ dbg(lvl_debug, "enter");
+ source = attr_search(attrs, NULL, attr_source);
+ ret = g_new0(struct vehicle_priv, 1);
#if GPSD_API_MAJOR_VERSION >= 5
- ret->gps = g_new0(struct gps_data_t, 1);
+ ret->gps = g_new0(struct gps_data_t, 1);
#endif
- ret->source = g_strdup(source->u.str);
- query = attr_search(attrs, NULL, attr_gpsd_query);
- if (query) {
- ret->gpsd_query = g_strconcat(query->u.str, "\n", NULL);
- } else {
- ret->gpsd_query = g_strdup("w+x\n");
- }
- dbg(lvl_debug,"Format string for gpsd_query: %s\n",ret->gpsd_query);
- retry_int = attr_search(attrs, NULL, attr_retry_interval);
- if (retry_int) {
- ret->retry_interval = retry_int->u.num;
- if (ret->retry_interval < MIN_RETRY_INTERVAL) {
- dbg(lvl_error, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL);
- ret->retry_interval = MIN_RETRY_INTERVAL;
- }
- } else {
- dbg(lvl_debug, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL);
- ret->retry_interval = DEFAULT_RETRY_INTERVAL;
- }
- ret->cbl = cbl;
- *meth = vehicle_gpsd_methods;
- ret->attrs = attrs;
- vehicle_gpsd_open(ret);
- return ret;
+ ret->source = g_strdup(source->u.str);
+ query = attr_search(attrs, NULL, attr_gpsd_query);
+ if (query) {
+ ret->gpsd_query = g_strconcat(query->u.str, "\n", NULL);
+ } else {
+ ret->gpsd_query = g_strdup("w+x\n");
+ }
+ dbg(lvl_debug,"Format string for gpsd_query: %s",ret->gpsd_query);
+ retry_int = attr_search(attrs, NULL, attr_retry_interval);
+ if (retry_int) {
+ ret->retry_interval = retry_int->u.num;
+ if (ret->retry_interval < MIN_RETRY_INTERVAL) {
+ dbg(lvl_error, "Retry interval %d too small, setting to %d", ret->retry_interval, MIN_RETRY_INTERVAL);
+ ret->retry_interval = MIN_RETRY_INTERVAL;
+ }
+ } else {
+ dbg(lvl_debug, "Retry interval not defined, setting to %d", DEFAULT_RETRY_INTERVAL);
+ ret->retry_interval = DEFAULT_RETRY_INTERVAL;
+ }
+ ret->cbl = cbl;
+ *meth = vehicle_gpsd_methods;
+ ret->attrs = attrs;
+ vehicle_gpsd_open(ret);
+ return ret;
}
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("gpsd", vehicle_gpsd_new_gpsd);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("gpsd", vehicle_gpsd_new_gpsd);
}
diff --git a/navit/vehicle/gpsd_dbus/CMakeLists.txt b/navit/vehicle/gpsd_dbus/CMakeLists.txt
index 435a987a0..a38e65539 100644
--- a/navit/vehicle/gpsd_dbus/CMakeLists.txt
+++ b/navit/vehicle/gpsd_dbus/CMakeLists.txt
@@ -1,2 +1,2 @@
-module_add_library(vehicle_gpsd_dbus vehicle_gpsd_dbus.c)
+module_add_library(vehicle_gpsd_dbus vehicle_gpsd_dbus.c)
diff --git a/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c b/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c
index fa5eb8780..0ce18a1d3 100644
--- a/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c
+++ b/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -34,215 +34,204 @@
#include "vehicle.h"
#include "event.h"
+/**
+ * @defgroup vehicle-gpsd-dbus Vehicle Gpsd DBus
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from Gpsd over DBus
+ *
+ * @{
+ */
+
static char *vehicle_gpsd_dbus_prefix="gpsd_dbus:";
struct vehicle_priv {
- char *source;
- char *address;
- int flags;
- struct callback_list *cbl;
- DBusConnection *connection;
- double time, track, speed, altitude;
- time_t fix_time;
- struct coord_geo geo;
- struct attr ** attrs;
- char fixiso8601[128];
+ char *source;
+ char *address;
+ int flags;
+ struct callback_list *cbl;
+ DBusConnection *connection;
+ double time, track, speed, altitude;
+ time_t fix_time;
+ struct coord_geo geo;
+ struct attr ** attrs;
+ char fixiso8601[128];
};
-static void
-vehicle_gpsd_dbus_close(struct vehicle_priv *priv)
-{
- if (priv->connection)
- dbus_connection_unref(priv->connection);
- priv->connection=NULL;
+static void vehicle_gpsd_dbus_close(struct vehicle_priv *priv) {
+ if (priv->connection)
+ dbus_connection_unref(priv->connection);
+ priv->connection=NULL;
}
-static DBusHandlerResult
-vehicle_gpsd_dbus_filter(DBusConnection *connection, DBusMessage *message, void *user_data)
-{
- struct vehicle_priv *priv=user_data;
- double time,ept,latitude,longitude,eph,altitude,epv,track,epd,speed,eps,climb,epc;
- int mode;
- char *devname;
-
- if (dbus_message_is_signal(message, "org.gpsd","fix")) {
- dbus_message_get_args (message, NULL,
- DBUS_TYPE_DOUBLE, &time,
- DBUS_TYPE_INT32, &mode,
- DBUS_TYPE_DOUBLE, &ept,
- DBUS_TYPE_DOUBLE, &latitude,
- DBUS_TYPE_DOUBLE, &longitude,
- DBUS_TYPE_DOUBLE, &eph,
- DBUS_TYPE_DOUBLE, &altitude,
- DBUS_TYPE_DOUBLE, &epv,
- DBUS_TYPE_DOUBLE, &track,
- DBUS_TYPE_DOUBLE, &epd,
- DBUS_TYPE_DOUBLE, &speed,
- DBUS_TYPE_DOUBLE, &eps,
- DBUS_TYPE_DOUBLE, &climb,
- DBUS_TYPE_DOUBLE, &epc,
- DBUS_TYPE_STRING, &devname,
- DBUS_TYPE_INVALID);
- if (!isnan(latitude) && !isnan(longitude)) {
- priv->geo.lat=latitude;
- priv->geo.lng=longitude;
- }
- if (!isnan(track))
- priv->track=track;
- if (!isnan(speed))
- priv->speed=speed;
- if (!isnan(altitude))
- priv->altitude=altitude;
- if (time != priv->time || (priv->flags & 1)) {
- priv->time=time;
- priv->fix_time=time;
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- }
- }
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+static DBusHandlerResult vehicle_gpsd_dbus_filter(DBusConnection *connection, DBusMessage *message, void *user_data) {
+ struct vehicle_priv *priv=user_data;
+ double time,ept,latitude,longitude,eph,altitude,epv,track,epd,speed,eps,climb,epc;
+ int mode;
+ char *devname;
+
+ if (dbus_message_is_signal(message, "org.gpsd","fix")) {
+ dbus_message_get_args (message, NULL,
+ DBUS_TYPE_DOUBLE, &time,
+ DBUS_TYPE_INT32, &mode,
+ DBUS_TYPE_DOUBLE, &ept,
+ DBUS_TYPE_DOUBLE, &latitude,
+ DBUS_TYPE_DOUBLE, &longitude,
+ DBUS_TYPE_DOUBLE, &eph,
+ DBUS_TYPE_DOUBLE, &altitude,
+ DBUS_TYPE_DOUBLE, &epv,
+ DBUS_TYPE_DOUBLE, &track,
+ DBUS_TYPE_DOUBLE, &epd,
+ DBUS_TYPE_DOUBLE, &speed,
+ DBUS_TYPE_DOUBLE, &eps,
+ DBUS_TYPE_DOUBLE, &climb,
+ DBUS_TYPE_DOUBLE, &epc,
+ DBUS_TYPE_STRING, &devname,
+ DBUS_TYPE_INVALID);
+ if (!isnan(latitude) && !isnan(longitude)) {
+ priv->geo.lat=latitude;
+ priv->geo.lng=longitude;
+ }
+ if (!isnan(track))
+ priv->track=track;
+ if (!isnan(speed))
+ priv->speed=speed;
+ if (!isnan(altitude))
+ priv->altitude=altitude;
+ if (time != priv->time || (priv->flags & 1)) {
+ priv->time=time;
+ priv->fix_time=time;
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ }
+ }
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
-static int
-vehicle_gpsd_dbus_open(struct vehicle_priv *priv)
-{
- DBusError error;
-
- dbus_error_init(&error);
- if (priv->address) {
- priv->connection = dbus_connection_open(priv->address, &error);
- } else {
- priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
- }
- if (!priv->connection) {
- dbg(lvl_error,"Failed to open connection to %s message bus: %s\n", priv->address?priv->address:"session",error.message);
- dbus_error_free(&error);
- return 0;
- }
- dbus_connection_setup_with_g_main(priv->connection, NULL);
- dbus_bus_add_match(priv->connection,"type='signal',interface='org.gpsd'",&error);
- dbus_connection_flush(priv->connection);
- if (dbus_error_is_set(&error)) {
- dbg(lvl_error,"Failed to add match to connection: %s\n", error.message);
- vehicle_gpsd_dbus_close(priv);
- return 0;
- }
- if (!dbus_connection_add_filter(priv->connection, vehicle_gpsd_dbus_filter, priv, NULL)) {
- dbg(lvl_error,"Failed to add filter to connection\n");
- vehicle_gpsd_dbus_close(priv);
- return 0;
- }
- return 1;
+static int vehicle_gpsd_dbus_open(struct vehicle_priv *priv) {
+ DBusError error;
+
+ dbus_error_init(&error);
+ if (priv->address) {
+ priv->connection = dbus_connection_open(priv->address, &error);
+ } else {
+ priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+ }
+ if (!priv->connection) {
+ dbg(lvl_error,"Failed to open connection to %s message bus: %s", priv->address?priv->address:"session",error.message);
+ dbus_error_free(&error);
+ return 0;
+ }
+ dbus_connection_setup_with_g_main(priv->connection, NULL);
+ dbus_bus_add_match(priv->connection,"type='signal',interface='org.gpsd'",&error);
+ dbus_connection_flush(priv->connection);
+ if (dbus_error_is_set(&error)) {
+ dbg(lvl_error,"Failed to add match to connection: %s", error.message);
+ vehicle_gpsd_dbus_close(priv);
+ return 0;
+ }
+ if (!dbus_connection_add_filter(priv->connection, vehicle_gpsd_dbus_filter, priv, NULL)) {
+ dbg(lvl_error,"Failed to add filter to connection");
+ vehicle_gpsd_dbus_close(priv);
+ return 0;
+ }
+ return 1;
}
-static void
-vehicle_gpsd_dbus_destroy(struct vehicle_priv *priv)
-{
- vehicle_gpsd_dbus_close(priv);
- if (priv->source)
- g_free(priv->source);
- g_free(priv);
+static void vehicle_gpsd_dbus_destroy(struct vehicle_priv *priv) {
+ vehicle_gpsd_dbus_close(priv);
+ if (priv->source)
+ g_free(priv->source);
+ g_free(priv);
}
-static int
-vehicle_gpsd_dbus_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- switch (type) {
- case attr_position_height:
- attr->u.numd = &priv->altitude;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->track;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_time_iso8601:
- {
- struct tm tm;
- if (!priv->fix_time)
- return 0;
- if (gmtime_r(&priv->fix_time, &tm)) {
- strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
- "%Y-%m-%dT%TZ", &tm);
- attr->u.str=priv->fixiso8601;
- } else
- return 0;
- }
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_gpsd_dbus_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ switch (type) {
+ case attr_position_height:
+ attr->u.numd = &priv->altitude;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->track;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_time_iso8601: {
+ struct tm tm;
+ if (!priv->fix_time)
+ return 0;
+ if (gmtime_r(&priv->fix_time, &tm)) {
+ strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
+ "%Y-%m-%dT%TZ", &tm);
+ attr->u.str=priv->fixiso8601;
+ } else
+ return 0;
+ }
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
-static int
-vehicle_gpsd_dbus_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init)
-{
- switch (attr->type) {
- case attr_source:
- if (strncmp(vehicle_gpsd_dbus_prefix,attr->u.str,strlen(vehicle_gpsd_dbus_prefix))) {
- dbg(lvl_error,"source must start with '%s'\n", vehicle_gpsd_dbus_prefix);
- return 0;
- }
- g_free(priv->source);
- priv->source=g_strdup(attr->u.str);
- priv->address=priv->source+strlen(vehicle_gpsd_dbus_prefix);
- if (!priv->address[0])
- priv->address=NULL;
- if (!init) {
- vehicle_gpsd_dbus_close(priv);
- vehicle_gpsd_dbus_open(priv);
- }
- return 1;
- case attr_flags:
- priv->flags=attr->u.num;
- return 1;
- default:
- return 0;
- }
+static int vehicle_gpsd_dbus_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) {
+ switch (attr->type) {
+ case attr_source:
+ if (strncmp(vehicle_gpsd_dbus_prefix,attr->u.str,strlen(vehicle_gpsd_dbus_prefix))) {
+ dbg(lvl_error,"source must start with '%s'", vehicle_gpsd_dbus_prefix);
+ return 0;
+ }
+ g_free(priv->source);
+ priv->source=g_strdup(attr->u.str);
+ priv->address=priv->source+strlen(vehicle_gpsd_dbus_prefix);
+ if (!priv->address[0])
+ priv->address=NULL;
+ if (!init) {
+ vehicle_gpsd_dbus_close(priv);
+ vehicle_gpsd_dbus_open(priv);
+ }
+ return 1;
+ case attr_flags:
+ priv->flags=attr->u.num;
+ return 1;
+ default:
+ return 0;
+ }
}
-static int
-vehicle_gpsd_dbus_set_attr(struct vehicle_priv *priv, struct attr *attr)
-{
- return vehicle_gpsd_dbus_set_attr_do(priv, attr, 0);
+static int vehicle_gpsd_dbus_set_attr(struct vehicle_priv *priv, struct attr *attr) {
+ return vehicle_gpsd_dbus_set_attr_do(priv, attr, 0);
}
static struct vehicle_methods vehicle_gpsd_methods = {
- vehicle_gpsd_dbus_destroy,
- vehicle_gpsd_dbus_position_attr_get,
- vehicle_gpsd_dbus_set_attr,
+ vehicle_gpsd_dbus_destroy,
+ vehicle_gpsd_dbus_position_attr_get,
+ vehicle_gpsd_dbus_set_attr,
};
-static struct vehicle_priv *
-vehicle_gpsd_dbus_new(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
-
-
- ret = g_new0(struct vehicle_priv, 1);
- ret->attrs = attrs;
- ret->cbl = cbl;
- *meth = vehicle_gpsd_methods;
- while (*attrs) {
- vehicle_gpsd_dbus_set_attr_do(ret, *attrs, 1);
- attrs++;
- }
- vehicle_gpsd_dbus_open(ret);
- return ret;
+static struct vehicle_priv *vehicle_gpsd_dbus_new(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
+
+
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->attrs = attrs;
+ ret->cbl = cbl;
+ *meth = vehicle_gpsd_methods;
+ while (*attrs) {
+ vehicle_gpsd_dbus_set_attr_do(ret, *attrs, 1);
+ attrs++;
+ }
+ vehicle_gpsd_dbus_open(ret);
+ return ret;
}
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("gpsd_dbus", vehicle_gpsd_dbus_new);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("gpsd_dbus", vehicle_gpsd_dbus_new);
}
diff --git a/navit/vehicle/gypsy/vehicle_gypsy.c b/navit/vehicle/gypsy/vehicle_gypsy.c
index 589e53a3f..077f219a1 100644
--- a/navit/vehicle/gypsy/vehicle_gypsy.c
+++ b/navit/vehicle/gypsy/vehicle_gypsy.c
@@ -1,6 +1,4 @@
-/** @file vehicle_gypsy.c
- * @brief gypsy uses dbus signals
- *
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -18,8 +16,6 @@
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
- * @Author Tim Niemeyer <reddog@mastersword.de>
- * @date 2008-2009
*/
#include <config.h>
@@ -47,28 +43,38 @@
#include "item.h"
#include "vehicle.h"
+/**
+ * @defgroup vehicle-gypsy Vehicle gypsy
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from gypsy. gypsy uses dbus signals
+ * @Author Tim Niemeyer <reddog@mastersword.de>
+ * @date 2008-2009
+ *
+ * @{
+ */
+
static struct vehicle_priv {
- char *source;
- GypsyControl *control;
- GypsyPosition *position;
- GypsyDevice *device;
- GypsyCourse *course;
- GypsySatellite *satellite;
- char *path;
- struct callback_list *cbl;
- guint retry_interval;
- struct coord_geo geo;
- double speed;
- double direction;
- double height;
- int fix_type;
- time_t fix_time;
- char fixiso8601[128];
- int sats;
- int sats_used;
- guint retry_timer;
- struct attr ** attrs;
- int have_cords;
+ char *source;
+ GypsyControl *control;
+ GypsyPosition *position;
+ GypsyDevice *device;
+ GypsyCourse *course;
+ GypsySatellite *satellite;
+ char *path;
+ struct callback_list *cbl;
+ guint retry_interval;
+ struct coord_geo geo;
+ double speed;
+ double direction;
+ double height;
+ int fix_type;
+ time_t fix_time;
+ char fixiso8601[128];
+ int sats;
+ int sats_used;
+ guint retry_timer;
+ struct attr ** attrs;
+ int have_cords;
} *vehicle_last;
#define DEFAULT_RETRY_INTERVAL 10 // seconds
@@ -85,27 +91,25 @@ static struct vehicle_priv {
*
* Anytime this functions get called, we have to call the global
* callback.
- *
+ *
* @param device The GypsyDevice
* @param fixstatus The fisstatus 0, 1, 2 or 3
* @param userdata
* @returns nothing
*/
-static void
-vehicle_gypsy_fixstatus_changed(GypsyDevice *device,
- gint fixstatus,
- gpointer userdata)
-{
- struct vehicle_priv *priv = vehicle_last;
-
- if (fixstatus==GYPSY_DEVICE_FIX_STATUS_3D)
- priv->fix_type = 3;
- else if (fixstatus==GYPSY_DEVICE_FIX_STATUS_2D)
- priv->fix_type = 1;
- else
- priv->fix_type = 0;
-
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+static void vehicle_gypsy_fixstatus_changed(GypsyDevice *device,
+ gint fixstatus,
+ gpointer userdata) {
+ struct vehicle_priv *priv = vehicle_last;
+
+ if (fixstatus==GYPSY_DEVICE_FIX_STATUS_3D)
+ priv->fix_type = 3;
+ else if (fixstatus==GYPSY_DEVICE_FIX_STATUS_2D)
+ priv->fix_type = 1;
+ else
+ priv->fix_type = 0;
+
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
/**
@@ -119,49 +123,43 @@ vehicle_gypsy_fixstatus_changed(GypsyDevice *device,
*
* If we get any new information, we have to call the global
* callback.
- *
+ *
* @param position The GypsyPosition
- * @param fields_set Bitmask indicating what field was set
+ * @param fields_set Bitmask indicating what field was set
* @param timestamp the time since Unix Epoch
- * @param latitude
- * @param longitude
+ * @param latitude
+ * @param longitude
* @param altitude
* @param userdata
* @returns nothing
*/
-static void
-vehicle_gypsy_position_changed(GypsyPosition *position,
- GypsyPositionFields fields_set, int timestamp,
- double latitude, double longitude, double altitude,
- gpointer userdata)
-{
- struct vehicle_priv *priv = vehicle_last;
- int cb = FALSE;
-
- if (timestamp > 0)
- priv->fix_time = timestamp;
-
- if (fields_set & GYPSY_POSITION_FIELDS_LATITUDE)
- {
- cb = TRUE;
- priv->geo.lat = latitude;
- }
- if (fields_set & GYPSY_POSITION_FIELDS_LONGITUDE)
- {
- cb = TRUE;
- priv->geo.lng = longitude;
- }
- if (fields_set & GYPSY_POSITION_FIELDS_ALTITUDE)
- {
- cb = TRUE;
- priv->height = altitude;
- }
-
- if (cb)
- {
- priv->have_cords = 1;
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- }
+static void vehicle_gypsy_position_changed(GypsyPosition *position,
+ GypsyPositionFields fields_set, int timestamp,
+ double latitude, double longitude, double altitude,
+ gpointer userdata) {
+ struct vehicle_priv *priv = vehicle_last;
+ int cb = FALSE;
+
+ if (timestamp > 0)
+ priv->fix_time = timestamp;
+
+ if (fields_set & GYPSY_POSITION_FIELDS_LATITUDE) {
+ cb = TRUE;
+ priv->geo.lat = latitude;
+ }
+ if (fields_set & GYPSY_POSITION_FIELDS_LONGITUDE) {
+ cb = TRUE;
+ priv->geo.lng = longitude;
+ }
+ if (fields_set & GYPSY_POSITION_FIELDS_ALTITUDE) {
+ cb = TRUE;
+ priv->height = altitude;
+ }
+
+ if (cb) {
+ priv->have_cords = 1;
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ }
}
/**
@@ -172,31 +170,29 @@ vehicle_gypsy_position_changed(GypsyPosition *position,
* Anytime this functions get called, we have to call the global
* callback.
*
- * @param satellite The GypsySatellite
+ * @param satellite The GypsySatellite
* @param satellites An GPtrArray wich hold information of all sats
* @param userdata
* @returns nothing
*/
-static void
-vehicle_gypsy_satellite_changed(GypsySatellite *satellite,
- GPtrArray *satellites,
- gpointer userdata)
-{
- struct vehicle_priv *priv = vehicle_last;
-
- int i, sats, used=0;
-
- sats = satellites->len;
- for (i = 0; i < sats; i++) {
- GypsySatelliteDetails *details = satellites->pdata[i];
- if (details->in_use)
- used++;
- }
-
- priv->sats_used = used;
- priv->sats = sats;
-
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+static void vehicle_gypsy_satellite_changed(GypsySatellite *satellite,
+ GPtrArray *satellites,
+ gpointer userdata) {
+ struct vehicle_priv *priv = vehicle_last;
+
+ int i, sats, used=0;
+
+ sats = satellites->len;
+ for (i = 0; i < sats; i++) {
+ GypsySatelliteDetails *details = satellites->pdata[i];
+ if (details->in_use)
+ used++;
+ }
+
+ priv->sats_used = used;
+ priv->sats = sats;
+
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
/**
@@ -206,9 +202,9 @@ vehicle_gypsy_satellite_changed(GypsySatellite *satellite,
*
* If we get any new information, we have to call the global
* callback.
- *
+ *
* @param course The GypsyCourse
- * @param fields Bitmask indicating what field was set
+ * @param fields Bitmask indicating what field was set
* @param timestamp the time since Unix Epoch
* @param speed
* @param direction
@@ -216,282 +212,263 @@ vehicle_gypsy_satellite_changed(GypsySatellite *satellite,
* @param userdata
* @returns nothing
*/
-static void
-vehicle_gypsy_course_changed (GypsyCourse *course,
- GypsyCourseFields fields,
- int timestamp,
- double speed,
- double direction,
- double climb,
- gpointer userdata)
-{
- struct vehicle_priv *priv = vehicle_last;
- int cb = FALSE;
-
- if (fields & GYPSY_COURSE_FIELDS_SPEED)
- {
- priv->speed = speed*3.6;
- cb = TRUE;
- }
- if (fields & GYPSY_COURSE_FIELDS_DIRECTION)
- {
- priv->direction = direction;
- cb = TRUE;
- }
-
- if (cb)
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+static void vehicle_gypsy_course_changed (GypsyCourse *course,
+ GypsyCourseFields fields,
+ int timestamp,
+ double speed,
+ double direction,
+ double climb,
+ gpointer userdata) {
+ struct vehicle_priv *priv = vehicle_last;
+ int cb = FALSE;
+
+ if (fields & GYPSY_COURSE_FIELDS_SPEED) {
+ priv->speed = speed*3.6;
+ cb = TRUE;
+ }
+ if (fields & GYPSY_COURSE_FIELDS_DIRECTION) {
+ priv->direction = direction;
+ cb = TRUE;
+ }
+
+ if (cb)
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
/**
* @brief Attempt to open the gypsy device.
- *
+ *
* Tells gypsy wich functions to call when anything occours.
*
* @param data
* @returns TRUE to try again; FALSE if retry not required
*/
-static gboolean
-vehicle_gypsy_try_open(gpointer *data)
-{
- struct vehicle_priv *priv = (struct vehicle_priv *)data;
- char *source = g_strdup(priv->source);
-
- GError *error = NULL;
-
- g_type_init();
- priv->control = gypsy_control_get_default();
- priv->path = gypsy_control_create(priv->control, source+8, &error);
- if (priv->path == NULL) {
- g_warning ("Error creating gypsy conrtol path for %s: %s", source+8, error->message);
- return TRUE;
- }
-
- priv->position = gypsy_position_new(priv->path);
- g_signal_connect(priv->position, "position-changed", G_CALLBACK (vehicle_gypsy_position_changed), NULL);
-
- priv->satellite = gypsy_satellite_new(priv->path);
- g_signal_connect(priv->satellite, "satellites-changed", G_CALLBACK (vehicle_gypsy_satellite_changed), NULL);
-
- priv->course = gypsy_course_new(priv->path);
- g_signal_connect(priv->course, "course-changed", G_CALLBACK (vehicle_gypsy_course_changed), NULL);
-
- priv->device = gypsy_device_new(priv->path);
- g_signal_connect(priv->device, "fix-status-changed", G_CALLBACK (vehicle_gypsy_fixstatus_changed), NULL);
-
- gypsy_device_start(priv->device, &error);
- if (error != NULL) {
- g_warning ("Error starting gypsy for %s: %s", source+8, error->message);
- return TRUE;
- }
-
- vehicle_last = priv;
- dbg(lvl_debug,"gypsy connected to %d\n", source+8);
- g_free(source);
- return FALSE;
+static gboolean vehicle_gypsy_try_open(gpointer *data) {
+ struct vehicle_priv *priv = (struct vehicle_priv *)data;
+ char *source = g_strdup(priv->source);
+
+ GError *error = NULL;
+
+ g_type_init();
+ priv->control = gypsy_control_get_default();
+ priv->path = gypsy_control_create(priv->control, source+8, &error);
+ if (priv->path == NULL) {
+ g_warning ("Error creating gypsy conrtol path for %s: %s", source+8, error->message);
+ return TRUE;
+ }
+
+ priv->position = gypsy_position_new(priv->path);
+ g_signal_connect(priv->position, "position-changed", G_CALLBACK (vehicle_gypsy_position_changed), NULL);
+
+ priv->satellite = gypsy_satellite_new(priv->path);
+ g_signal_connect(priv->satellite, "satellites-changed", G_CALLBACK (vehicle_gypsy_satellite_changed), NULL);
+
+ priv->course = gypsy_course_new(priv->path);
+ g_signal_connect(priv->course, "course-changed", G_CALLBACK (vehicle_gypsy_course_changed), NULL);
+
+ priv->device = gypsy_device_new(priv->path);
+ g_signal_connect(priv->device, "fix-status-changed", G_CALLBACK (vehicle_gypsy_fixstatus_changed), NULL);
+
+ gypsy_device_start(priv->device, &error);
+ if (error != NULL) {
+ g_warning ("Error starting gypsy for %s: %s", source+8, error->message);
+ return TRUE;
+ }
+
+ vehicle_last = priv;
+ dbg(lvl_debug,"gypsy connected to %d", source+8);
+ g_free(source);
+ return FALSE;
}
/**
* @brief Open a connection to gypsy. Will re-try the connection if it fails
- *
+ *
* @param priv
* @returns nothing
*/
-static void
-vehicle_gypsy_open(struct vehicle_priv *priv)
-{
- priv->retry_timer=0;
- if (vehicle_gypsy_try_open((gpointer *)priv)) {
- priv->retry_timer = g_timeout_add(priv->retry_interval*1000, (GSourceFunc)vehicle_gypsy_try_open, (gpointer *)priv);
- }
+static void vehicle_gypsy_open(struct vehicle_priv *priv) {
+ priv->retry_timer=0;
+ if (vehicle_gypsy_try_open((gpointer *)priv)) {
+ priv->retry_timer = g_timeout_add(priv->retry_interval*1000, (GSourceFunc)vehicle_gypsy_try_open, (gpointer *)priv);
+ }
}
/**
* @brief Stop retry timer; Free alloced memory
- *
+ *
* @param priv
* @returns nothing
*/
-static void
-vehicle_gypsy_close(struct vehicle_priv *priv)
-{
- if (priv->retry_timer) {
- g_source_remove(priv->retry_timer);
- priv->retry_timer=0;
- }
- if (priv->path)
- g_free(priv->path);
-
- if (priv->position)
- g_free(priv->position);
-
- if (priv->satellite)
- g_free(priv->satellite);
-
- if (priv->course)
- g_free(priv->course);
-
- if (priv->device)
- g_free(priv->device);
-
- if (priv->control)
- g_object_unref(G_OBJECT (priv->control));
+static void vehicle_gypsy_close(struct vehicle_priv *priv) {
+ if (priv->retry_timer) {
+ g_source_remove(priv->retry_timer);
+ priv->retry_timer=0;
+ }
+ if (priv->path)
+ g_free(priv->path);
+
+ if (priv->position)
+ g_free(priv->position);
+
+ if (priv->satellite)
+ g_free(priv->satellite);
+
+ if (priv->course)
+ g_free(priv->course);
+
+ if (priv->device)
+ g_free(priv->device);
+
+ if (priv->control)
+ g_object_unref(G_OBJECT (priv->control));
}
/**
* @brief Free the gypsy_vehicle
- *
+ *
* @param priv
* @returns nothing
*/
-static void
-vehicle_gypsy_destroy(struct vehicle_priv *priv)
-{
- vehicle_gypsy_close(priv);
- if (priv->source)
- g_free(priv->source);
- g_free(priv);
+static void vehicle_gypsy_destroy(struct vehicle_priv *priv) {
+ vehicle_gypsy_close(priv);
+ if (priv->source)
+ g_free(priv->source);
+ g_free(priv);
}
/**
* @brief Provide the outside with information
- *
+ *
* @param priv
* @param type TODO: What can this be?
* @param attr
* @returns true/false
*/
-static int
-vehicle_gypsy_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- struct attr * active=NULL;
- switch (type) {
- case attr_position_fix_type:
- attr->u.num = priv->fix_type;
- break;
- case attr_position_height:
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_qual:
- attr->u.num = priv->sats;
- break;
- case attr_position_sats_used:
- attr->u.num = priv->sats_used;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- if (!priv->have_cords)
- return 0;
- break;
- case attr_position_time_iso8601:
- {
- struct tm tm;
- if (!priv->fix_time)
- return 0;
- if (gmtime_r(&priv->fix_time, &tm)) {
- strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
- "%Y-%m-%dT%TZ", &tm);
- attr->u.str=priv->fixiso8601;
- } else
- return 0;
- }
- case attr_active:
- active = attr_search(priv->attrs,NULL,attr_active);
- if(active != NULL && active->u.num == 1)
- return 1;
- else
- return 0;
- break;
-
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_gypsy_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ struct attr * active=NULL;
+ switch (type) {
+ case attr_position_fix_type:
+ attr->u.num = priv->fix_type;
+ break;
+ case attr_position_height:
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_qual:
+ attr->u.num = priv->sats;
+ break;
+ case attr_position_sats_used:
+ attr->u.num = priv->sats_used;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ if (!priv->have_cords)
+ return 0;
+ break;
+ case attr_position_time_iso8601: {
+ struct tm tm;
+ if (!priv->fix_time)
+ return 0;
+ if (gmtime_r(&priv->fix_time, &tm)) {
+ strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
+ "%Y-%m-%dT%TZ", &tm);
+ attr->u.str=priv->fixiso8601;
+ } else
+ return 0;
+ }
+ case attr_active:
+ active = attr_search(priv->attrs,NULL,attr_active);
+ if(active != NULL && active->u.num == 1)
+ return 1;
+ else
+ return 0;
+ break;
+
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
struct vehicle_methods vehicle_gypsy_methods = {
- vehicle_gypsy_destroy,
- vehicle_gypsy_position_attr_get,
+ vehicle_gypsy_destroy,
+ vehicle_gypsy_position_attr_get,
};
/**
* @brief Create gypsy_vehicle
- *
+ *
* @param meth
* @param cbl
* @param attrs
* @returns vehicle_priv
*/
-static struct vehicle_priv *
-vehicle_gypsy_new_gypsy(struct vehicle_methods *meth,
- struct callback_list *cbl,
- struct attr **attrs)
-{
- struct vehicle_priv *ret;
- struct attr *source, *retry_int;
+static struct vehicle_priv *vehicle_gypsy_new_gypsy(struct vehicle_methods *meth,
+ struct callback_list *cbl,
+ struct attr **attrs) {
+ struct vehicle_priv *ret;
+ struct attr *source, *retry_int;
#if defined(USE_BINDING_DBUS) && defined(HAVE_UNISTD_H)
- DBusConnection *conn;
- DBusMessage *message;
- dbus_uint32_t serial,pid=getpid();
- struct attr *destination,*path,*interface,*method;
-
- destination=attr_search(attrs, NULL, attr_dbus_destination);
- path=attr_search(attrs, NULL, attr_dbus_path);
- interface=attr_search(attrs, NULL, attr_dbus_interface);
- method=attr_search(attrs, NULL, attr_dbus_method);
- if (destination && path && interface && method) {
- conn=dbus_bus_get(DBUS_BUS_SESSION, NULL);
- if (conn) {
- message=dbus_message_new_method_call(destination->u.str,path->u.str,interface->u.str,method->u.str);
- dbus_message_append_args(message, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID);
- dbus_connection_send(conn, message, &serial);
- dbus_message_unref(message);
- dbus_connection_unref(conn);
- } else {
- dbg(lvl_error,"failed to connect to session bus\n");
- }
- }
+ DBusConnection *conn;
+ DBusMessage *message;
+ dbus_uint32_t serial,pid=getpid();
+ struct attr *destination,*path,*interface,*method;
+
+ destination=attr_search(attrs, NULL, attr_dbus_destination);
+ path=attr_search(attrs, NULL, attr_dbus_path);
+ interface=attr_search(attrs, NULL, attr_dbus_interface);
+ method=attr_search(attrs, NULL, attr_dbus_method);
+ if (destination && path && interface && method) {
+ conn=dbus_bus_get(DBUS_BUS_SESSION, NULL);
+ if (conn) {
+ message=dbus_message_new_method_call(destination->u.str,path->u.str,interface->u.str,method->u.str);
+ dbus_message_append_args(message, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID);
+ dbus_connection_send(conn, message, &serial);
+ dbus_message_unref(message);
+ dbus_connection_unref(conn);
+ } else {
+ dbg(lvl_error,"failed to connect to session bus");
+ }
+ }
#endif
- dbg(lvl_debug, "enter\n");
- source = attr_search(attrs, NULL, attr_source);
- ret = g_new0(struct vehicle_priv, 1);
- ret->have_cords = 0;
- ret->source = g_strdup(source->u.str);
- ret->attrs = attrs;
- retry_int = attr_search(attrs, NULL, attr_retry_interval);
- if (retry_int) {
- ret->retry_interval = retry_int->u.num;
- if (ret->retry_interval < MIN_RETRY_INTERVAL) {
- dbg(lvl_error, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL);
- ret->retry_interval = MIN_RETRY_INTERVAL;
- }
- } else {
- dbg(lvl_error, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL);
- ret->retry_interval = DEFAULT_RETRY_INTERVAL;
- }
- ret->cbl = cbl;
- *meth = vehicle_gypsy_methods;
- vehicle_gypsy_open(ret);
- return ret;
+ dbg(lvl_debug, "enter");
+ source = attr_search(attrs, NULL, attr_source);
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->have_cords = 0;
+ ret->source = g_strdup(source->u.str);
+ ret->attrs = attrs;
+ retry_int = attr_search(attrs, NULL, attr_retry_interval);
+ if (retry_int) {
+ ret->retry_interval = retry_int->u.num;
+ if (ret->retry_interval < MIN_RETRY_INTERVAL) {
+ dbg(lvl_error, "Retry interval %d too small, setting to %d", ret->retry_interval, MIN_RETRY_INTERVAL);
+ ret->retry_interval = MIN_RETRY_INTERVAL;
+ }
+ } else {
+ dbg(lvl_error, "Retry interval not defined, setting to %d", DEFAULT_RETRY_INTERVAL);
+ ret->retry_interval = DEFAULT_RETRY_INTERVAL;
+ }
+ ret->cbl = cbl;
+ *meth = vehicle_gypsy_methods;
+ vehicle_gypsy_open(ret);
+ return ret;
}
/**
* @brief register vehicle_gypsy
- *
+ *
* @returns nothing
*/
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("gypsy", vehicle_gypsy_new_gypsy);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("gypsy", vehicle_gypsy_new_gypsy);
}
diff --git a/navit/vehicle/iphone/corelocation.h b/navit/vehicle/iphone/corelocation.h
index 8a3ee8c51..0ff715964 100644
--- a/navit/vehicle/iphone/corelocation.h
+++ b/navit/vehicle/iphone/corelocation.h
@@ -20,7 +20,7 @@
#define VEHICLE_IPHONE_CORELOCATION_H
typedef void(*FT_LOCATION_CB)(void *, double , double , double , double, char *, double);
-void corelocation_update(double lat,
+void corelocation_update(double lat,
double lng,
double dir,
double spd,
diff --git a/navit/vehicle/iphone/corelocation.m b/navit/vehicle/iphone/corelocation.m
index 5b13c283f..5f02500f3 100644
--- a/navit/vehicle/iphone/corelocation.m
+++ b/navit/vehicle/iphone/corelocation.m
@@ -39,7 +39,7 @@ void corelocation_init(void * pv_arg, FT_LOCATION_CB pf_cb) {
/** Save callbacks */
locationcontroller->pv_arg = pv_arg;
- locationcontroller->pf_cb = pf_cb;
+ locationcontroller->pf_cb = pf_cb;
/** Start location process */
[locationcontroller.locationManager startUpdatingLocation];
@@ -64,7 +64,7 @@ void corelocation_exit(void) {
self = [super init];
if (self != nil) {
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
- self.locationManager.distanceFilter = kCLDistanceFilterNone;
+ self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.delegate = self; // send loc updates to myself
self.pf_cb = NULL;
self.pv_arg = NULL;
@@ -82,7 +82,7 @@ fromLocation:(CLLocation *)oldLocation
{
NSLog(@"New Location: %@", [newLocation description]);
NSString *newDateString = [self.dateFormatter stringFromDate:newLocation.timestamp];
- const char* cString = [newDateString cStringUsingEncoding:NSASCIIStringEncoding];
+ const char* cString = [newDateString cStringUsingEncoding:NSASCIIStringEncoding];
if(self.pf_cb) {
self.pf_cb(
diff --git a/navit/vehicle/iphone/vehicle_iphone.c b/navit/vehicle/iphone/vehicle_iphone.c
index 94fec114a..790166238 100644
--- a/navit/vehicle/iphone/vehicle_iphone.c
+++ b/navit/vehicle/iphone/vehicle_iphone.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -33,133 +33,130 @@
#include "event.h"
#include "corelocation.h"
+/**
+ * @defgroup vehicle-iphone Vehicle iPhone
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from iPhone.
+ *
+ * @{
+ */
+
struct vehicle_priv {
- int interval;
- int position_set;
- struct callback_list *cbl;
- struct navit *navit;
- struct coord_geo geo;
- struct coord last;
- double config_speed;
- double speed;
- double direction;
- double radius;
- struct callback *timer_callback;
- struct event_timeout *timer;
- char str_time[200];
+ int interval;
+ int position_set;
+ struct callback_list *cbl;
+ struct navit *navit;
+ struct coord_geo geo;
+ struct coord last;
+ double config_speed;
+ double speed;
+ double direction;
+ double radius;
+ struct callback *timer_callback;
+ struct event_timeout *timer;
+ char str_time[200];
};
-static void
-vehicle_iphone_destroy(struct vehicle_priv *priv)
-{
- corelocation_exit();
- g_free(priv);
+static void vehicle_iphone_destroy(struct vehicle_priv *priv) {
+ corelocation_exit();
+ g_free(priv);
}
-static int
-vehicle_iphone_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- switch (type) {
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_time_iso8601:
- attr->u.str = priv->str_time;
- break;
- case attr_position_radius:
- attr->u.numd = &priv->radius;
- break;
- case attr_position_nmea:
- return 0;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_iphone_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ switch (type) {
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_time_iso8601:
+ attr->u.str = priv->str_time;
+ break;
+ case attr_position_radius:
+ attr->u.numd = &priv->radius;
+ break;
+ case attr_position_nmea:
+ return 0;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
-static int
-vehicle_iphone_set_attr(struct vehicle_priv *priv, struct attr *attr)
-{
- if (attr->type == attr_navit) {
- priv->navit = attr->u.navit;
- return 1;
- }
- return 0;
+static int vehicle_iphone_set_attr(struct vehicle_priv *priv, struct attr *attr) {
+ if (attr->type == attr_navit) {
+ priv->navit = attr->u.navit;
+ return 1;
+ }
+ return 0;
}
struct vehicle_methods vehicle_iphone_methods = {
- vehicle_iphone_destroy,
- vehicle_iphone_position_attr_get,
- vehicle_iphone_set_attr,
+ vehicle_iphone_destroy,
+ vehicle_iphone_position_attr_get,
+ vehicle_iphone_set_attr,
};
-void
-vehicle_iphone_update(void *arg,
- double lat,
- double lng,
- double dir,
- double spd,
- char * str_time,
- double radius
- )
-{
- struct vehicle_priv * priv = arg;
- priv->geo.lat = lat;
- priv->geo.lng = lng;
- if(dir > 0) priv->direction = dir;
- if(spd > 0) priv->speed = spd*3.6;
- strcpy(priv->str_time, str_time);
- priv->radius = radius;
-
- dbg(lvl_debug,"position_get lat:%f lng:%f (spd:%f dir:%f time:%s)\n", priv->geo.lat, priv->geo.lng, priv->speed, priv->direction, priv->str_time);
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+void vehicle_iphone_update(void *arg,
+ double lat,
+ double lng,
+ double dir,
+ double spd,
+ char * str_time,
+ double radius
+ ) {
+ struct vehicle_priv * priv = arg;
+ priv->geo.lat = lat;
+ priv->geo.lng = lng;
+ if(dir > 0) priv->direction = dir;
+ if(spd > 0) priv->speed = spd*3.6;
+ strcpy(priv->str_time, str_time);
+ priv->radius = radius;
+
+ dbg(lvl_debug,"position_get lat:%f lng:%f (spd:%f dir:%f time:%s)", priv->geo.lat, priv->geo.lng, priv->speed,
+ priv->direction, priv->str_time);
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
-static struct vehicle_priv *
-vehicle_iphone_new(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
- struct attr *interval,*speed,*position_coord_geo;
-
- dbg(lvl_debug, "enter\n");
- ret = g_new0(struct vehicle_priv, 1);
- ret->cbl = cbl;
- ret->interval=1000;
- ret->config_speed=40;
- if ((speed=attr_search(attrs, NULL, attr_speed))) {
- ret->config_speed=speed->u.num;
- }
- if ((interval=attr_search(attrs, NULL, attr_interval)))
- ret->interval=interval->u.num;
- if ((position_coord_geo=attr_search(attrs, NULL, attr_position_coord_geo))) {
- ret->geo=*(position_coord_geo->u.coord_geo);
- ret->position_set=1;
- dbg(lvl_debug,"position_set %f %f\n", ret->geo.lat, ret->geo.lng);
- }
- *meth = vehicle_iphone_methods;
- ret->str_time[0] = '\0';
-
- /** Initialize corelocation */
- corelocation_init(ret, vehicle_iphone_update);
-
- return ret;
+static struct vehicle_priv *vehicle_iphone_new(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
+ struct attr *interval,*speed,*position_coord_geo;
+
+ dbg(lvl_debug, "enter");
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->cbl = cbl;
+ ret->interval=1000;
+ ret->config_speed=40;
+ if ((speed=attr_search(attrs, NULL, attr_speed))) {
+ ret->config_speed=speed->u.num;
+ }
+ if ((interval=attr_search(attrs, NULL, attr_interval)))
+ ret->interval=interval->u.num;
+ if ((position_coord_geo=attr_search(attrs, NULL, attr_position_coord_geo))) {
+ ret->geo=*(position_coord_geo->u.coord_geo);
+ ret->position_set=1;
+ dbg(lvl_debug,"position_set %f %f", ret->geo.lat, ret->geo.lng);
+ }
+ *meth = vehicle_iphone_methods;
+ ret->str_time[0] = '\0';
+
+ /** Initialize corelocation */
+ corelocation_init(ret, vehicle_iphone_update);
+
+ return ret;
}
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("iphone", vehicle_iphone_new);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("iphone", vehicle_iphone_new);
}
diff --git a/navit/vehicle/maemo/CMakeLists.txt b/navit/vehicle/maemo/CMakeLists.txt
index 2e74763dd..011e5dce9 100644
--- a/navit/vehicle/maemo/CMakeLists.txt
+++ b/navit/vehicle/maemo/CMakeLists.txt
@@ -1,2 +1,2 @@
-module_add_library(vehicle_maemo vehicle_maemo.c)
+module_add_library(vehicle_maemo vehicle_maemo.c)
diff --git a/navit/vehicle/maemo/vehicle_maemo.c b/navit/vehicle/maemo/vehicle_maemo.c
index d686a6a03..4717deb04 100644
--- a/navit/vehicle/maemo/vehicle_maemo.c
+++ b/navit/vehicle/maemo/vehicle_maemo.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -18,14 +18,6 @@
*/
-/*
- Plugin for new Maemo's liblocation API.
-
- <vehicle source="maemo://any" retry_interval="1"/>
- source cound be on of "any","cwp","acwp","gnss","agnss"
- retry_interval could be one of "1","2","5","10","20","30","60","120" measured in seconds
-*/
-
#include <config.h>
#include <string.h>
#include <glib.h>
@@ -40,290 +32,292 @@
#include "vehicle.h"
#include "event.h"
+/**
+ * @defgroup vehicle-iphone Vehicle Maemo
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from Maemo.
+ *
+ * Plugin for new Maemo's liblocation API.
+ * <vehicle source="maemo://any" retry_interval="1"/>
+ * source cound be on of "any","cwp","acwp","gnss","agnss"
+ * retry_interval could be one of "1","2","5","10","20","30","60","120" measured in seconds
+ *
+ * @{
+ */
+
static struct vehicle_priv {
- LocationGPSDControl *control;
- LocationGPSDevice *device;
- char *source;
- guint retry_interval;
- struct callback_list *cbl;
- struct attr ** attrs;
- int sats; // satellites_in_view
- int sats_used; //satellites_in_user
- int fix_type; //mode
- struct coord_geo geo; //lattigute&longittude
- double speed; //speed:)
- double direction; //track
- double height; //altitude
- double hdop; //eph
- time_t fix_time; //time
- char fixiso8601[128];
+ LocationGPSDControl *control;
+ LocationGPSDevice *device;
+ char *source;
+ guint retry_interval;
+ struct callback_list *cbl;
+ struct attr ** attrs;
+ int sats; // satellites_in_view
+ int sats_used; //satellites_in_user
+ int fix_type; //mode
+ struct coord_geo geo; //lattigute&longittude
+ double speed; //speed:)
+ double direction; //track
+ double height; //altitude
+ double hdop; //eph
+ time_t fix_time; //time
+ char fixiso8601[128];
};
-
+
static void vehicle_maemo_callback(LocationGPSDevice *device, gpointer user_data) {
- struct vehicle_priv *priv=(struct vehicle_priv*)user_data;
-
- priv->sats=device->satellites_in_view;
- priv->sats_used=device->satellites_in_use;
- callback_list_call_attr_0(priv->cbl, attr_position_sats);
-
- dbg(lvl_debug,"Got update with %u/%u satellites\n",priv->sats_used,priv->sats);
-
- if (device->fix) {
- switch(device->fix->mode) {
- case LOCATION_GPS_DEVICE_MODE_NOT_SEEN:
- case LOCATION_GPS_DEVICE_MODE_NO_FIX:
- priv->fix_type=0;
- break;
- case LOCATION_GPS_DEVICE_MODE_2D:
- case LOCATION_GPS_DEVICE_MODE_3D:
- priv->fix_type=1;
- break;
- }
-
- if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) {
- priv->geo.lat=device->fix->latitude;
- priv->geo.lng=device->fix->longitude;
- priv->hdop=device->fix->eph/100;
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- dbg(lvl_debug,"Position: %f %f with error %f meters\n",priv->geo.lat,priv->geo.lng,priv->hdop);
- }
-
- if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) {
- priv->speed=device->fix->speed;
- callback_list_call_attr_0(priv->cbl, attr_position_speed);
- dbg(lvl_debug,"Speed: %f\n ",priv->speed);
- }
-
- if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) {
- priv->direction=device->fix->track;
- dbg(lvl_debug,"Direction: %f\n",priv->direction);
- }
-
- if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) {
- priv->fix_time=device->fix->time;
- dbg(lvl_debug,"Time: %f\n",priv->fix_time);
- }
-
- if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) {
- priv->height=device->fix->altitude;
- dbg(lvl_debug,"Elevation: %f\n",priv->height);
- }
-
- }
-
- return;
+ struct vehicle_priv *priv=(struct vehicle_priv*)user_data;
+
+ priv->sats=device->satellites_in_view;
+ priv->sats_used=device->satellites_in_use;
+ callback_list_call_attr_0(priv->cbl, attr_position_sats);
+
+ dbg(lvl_debug,"Got update with %u/%u satellites",priv->sats_used,priv->sats);
+
+ if (device->fix) {
+ switch(device->fix->mode) {
+ case LOCATION_GPS_DEVICE_MODE_NOT_SEEN:
+ case LOCATION_GPS_DEVICE_MODE_NO_FIX:
+ priv->fix_type=0;
+ break;
+ case LOCATION_GPS_DEVICE_MODE_2D:
+ case LOCATION_GPS_DEVICE_MODE_3D:
+ priv->fix_type=1;
+ break;
+ }
+
+ if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) {
+ priv->geo.lat=device->fix->latitude;
+ priv->geo.lng=device->fix->longitude;
+ priv->hdop=device->fix->eph/100;
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ dbg(lvl_debug,"Position: %f %f with error %f meters",priv->geo.lat,priv->geo.lng,priv->hdop);
+ }
+
+ if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) {
+ priv->speed=device->fix->speed;
+ callback_list_call_attr_0(priv->cbl, attr_position_speed);
+ dbg(lvl_debug,"Speed: %f ",priv->speed);
+ }
+
+ if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) {
+ priv->direction=device->fix->track;
+ dbg(lvl_debug,"Direction: %f",priv->direction);
+ }
+
+ if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) {
+ priv->fix_time=device->fix->time;
+ dbg(lvl_debug,"Time: %f",priv->fix_time);
+ }
+
+ if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) {
+ priv->height=device->fix->altitude;
+ dbg(lvl_debug,"Elevation: %f",priv->height);
+ }
+
+ }
+
+ return;
}
-
-static void vehicle_maemo_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer user_data)
-{
- switch (error) {
- case LOCATION_ERROR_USER_REJECTED_DIALOG:
- dbg(lvl_error,"User didn't enable requested methods\n");
- break;
- case LOCATION_ERROR_USER_REJECTED_SETTINGS:
- dbg(lvl_error,"User changed settings, which disabled location\n");
- break;
- case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE:
- dbg(lvl_error,"Problems with BT GPS\n");
- break;
- case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE:
- dbg(lvl_error,"Requested method is not allowed in offline mode\n");
- break;
- case LOCATION_ERROR_SYSTEM:
- dbg(lvl_error,"System error\n");
- break;
- }
+
+static void vehicle_maemo_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer user_data) {
+ switch (error) {
+ case LOCATION_ERROR_USER_REJECTED_DIALOG:
+ dbg(lvl_error,"User didn't enable requested methods");
+ break;
+ case LOCATION_ERROR_USER_REJECTED_SETTINGS:
+ dbg(lvl_error,"User changed settings, which disabled location");
+ break;
+ case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE:
+ dbg(lvl_error,"Problems with BT GPS");
+ break;
+ case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE:
+ dbg(lvl_error,"Requested method is not allowed in offline mode");
+ break;
+ case LOCATION_ERROR_SYSTEM:
+ dbg(lvl_error,"System error");
+ break;
+ }
}
/**
* Instantiate liblocation objects
*/
-static void
-vehicle_maemo_open(struct vehicle_priv *priv)
-{
-
- priv->control = location_gpsd_control_get_default();
- priv->device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL);
-
- if (!strcasecmp(priv->source+8,"cwp")) {
- g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_CWP, NULL);
- dbg(lvl_debug,"Method set: CWP\n");
- } else if (!strcasecmp(priv->source+8,"acwp")) {
- g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_ACWP, NULL);
- dbg(lvl_debug,"Method set: ACWP\n");
- } else if (!strcasecmp(priv->source+8,"gnss")) {
- g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_GNSS, NULL);
- dbg(lvl_debug,"Method set: GNSS\n");
- } else if (!strcasecmp(priv->source+8,"agnss")) {
- g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_AGNSS, NULL);
- dbg(lvl_debug,"Method set: AGNSS\n");
- } else {
- g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_USER_SELECTED, NULL);
- dbg(lvl_debug,"Method set: ANY\n");
- }
-
- switch (priv->retry_interval) {
- case 2:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_2S, NULL);
- dbg(lvl_debug,"Interval set: 2s\n");
- break;
- case 5:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_5S, NULL);
- dbg(lvl_debug,"Interval set: 5s\n");
- break;
- case 10:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_10S, NULL);
- dbg(lvl_debug,"Interval set: 10s\n");
- break;
- case 20:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_20S, NULL);
- dbg(lvl_debug,"Interval set: 20s\n");
- break;
- case 30:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_30S, NULL);
- dbg(lvl_debug,"Interval set: 30s\n");
- break;
- case 60:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_60S, NULL);
- dbg(lvl_debug,"Interval set: 60s\n");
- break;
- case 120:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_120S, NULL);
- dbg(lvl_debug,"Interval set: 120s\n");
- break;
- case 1:
- default:
- g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_1S, NULL);
- dbg(lvl_debug,"Interval set: 1s\n");
- break;
- }
-
- g_signal_connect(priv->device, "changed", G_CALLBACK(vehicle_maemo_callback), priv);
- g_signal_connect(priv->control, "error-verbose", G_CALLBACK(vehicle_maemo_error), priv);
-
- location_gpsd_control_start(priv->control);
-
- return;
+static void vehicle_maemo_open(struct vehicle_priv *priv) {
+
+ priv->control = location_gpsd_control_get_default();
+ priv->device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL);
+
+ if (!strcasecmp(priv->source+8,"cwp")) {
+ g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_CWP, NULL);
+ dbg(lvl_debug,"Method set: CWP");
+ } else if (!strcasecmp(priv->source+8,"acwp")) {
+ g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_ACWP, NULL);
+ dbg(lvl_debug,"Method set: ACWP");
+ } else if (!strcasecmp(priv->source+8,"gnss")) {
+ g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_GNSS, NULL);
+ dbg(lvl_debug,"Method set: GNSS");
+ } else if (!strcasecmp(priv->source+8,"agnss")) {
+ g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_AGNSS, NULL);
+ dbg(lvl_debug,"Method set: AGNSS");
+ } else {
+ g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_USER_SELECTED, NULL);
+ dbg(lvl_debug,"Method set: ANY");
+ }
+
+ switch (priv->retry_interval) {
+ case 2:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_2S, NULL);
+ dbg(lvl_debug,"Interval set: 2s");
+ break;
+ case 5:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_5S, NULL);
+ dbg(lvl_debug,"Interval set: 5s");
+ break;
+ case 10:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_10S, NULL);
+ dbg(lvl_debug,"Interval set: 10s");
+ break;
+ case 20:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_20S, NULL);
+ dbg(lvl_debug,"Interval set: 20s");
+ break;
+ case 30:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_30S, NULL);
+ dbg(lvl_debug,"Interval set: 30s");
+ break;
+ case 60:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_60S, NULL);
+ dbg(lvl_debug,"Interval set: 60s");
+ break;
+ case 120:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_120S, NULL);
+ dbg(lvl_debug,"Interval set: 120s");
+ break;
+ case 1:
+ default:
+ g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_1S, NULL);
+ dbg(lvl_debug,"Interval set: 1s");
+ break;
+ }
+
+ g_signal_connect(priv->device, "changed", G_CALLBACK(vehicle_maemo_callback), priv);
+ g_signal_connect(priv->control, "error-verbose", G_CALLBACK(vehicle_maemo_error), priv);
+
+ location_gpsd_control_start(priv->control);
+
+ return;
}
-static void
-vehicle_maemo_destroy(struct vehicle_priv *priv)
-{
- location_gpsd_control_stop(priv->control);
+static void vehicle_maemo_destroy(struct vehicle_priv *priv) {
+ location_gpsd_control_stop(priv->control);
- g_object_unref(priv->device);
- g_object_unref(priv->control);
+ g_object_unref(priv->device);
+ g_object_unref(priv->control);
- return;
+ return;
}
-static int
-vehicle_maemo_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- struct attr * active=NULL;
- switch (type) {
- case attr_position_fix_type:
- dbg(lvl_debug,"Attr requested: position_fix_type\n");
- attr->u.num = priv->fix_type;
- break;
- case attr_position_height:
- dbg(lvl_debug,"Attr requested: position_height\n");
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- dbg(lvl_debug,"Attr requested: position_speed\n");
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- dbg(lvl_debug,"Attr requested: position_direction\n");
- attr->u.numd = &priv->direction;
- break;
- case attr_position_hdop:
- dbg(lvl_debug,"Attr requested: position_hdop\n");
- attr->u.numd = &priv->hdop;
- break;
- case attr_position_sats:
- dbg(lvl_debug,"Attr requested: position_sats\n");
- attr->u.num = priv->sats;
- break;
- case attr_position_sats_used:
- dbg(lvl_debug,"Attr requested: position_sats_used\n");
- attr->u.num = priv->sats_used;
- break;
- case attr_position_coord_geo:
- dbg(lvl_debug,"Attr requested: position_coord_geo\n");
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_time_iso8601:
- {
- struct tm tm;
- dbg(lvl_debug,"Attr requested: position_time_iso8601\n");
- if (!priv->fix_time)
- return 0;
- if (gmtime_r(&priv->fix_time, &tm)) {
- strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
- "%Y-%m-%dT%TZ", &tm);
- attr->u.str=priv->fixiso8601;
- } else
- return 0;
- }
- break;
- case attr_active:
- dbg(lvl_debug,"Attr requested: position_active\n");
- active = attr_search(priv->attrs,NULL,attr_active);
- if(active != NULL) {
- attr->u.num=active->u.num;
- return 1;
- } else
- return 0;
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_maemo_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ struct attr * active=NULL;
+ switch (type) {
+ case attr_position_fix_type:
+ dbg(lvl_debug,"Attr requested: position_fix_type");
+ attr->u.num = priv->fix_type;
+ break;
+ case attr_position_height:
+ dbg(lvl_debug,"Attr requested: position_height");
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ dbg(lvl_debug,"Attr requested: position_speed");
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ dbg(lvl_debug,"Attr requested: position_direction");
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_hdop:
+ dbg(lvl_debug,"Attr requested: position_hdop");
+ attr->u.numd = &priv->hdop;
+ break;
+ case attr_position_sats:
+ dbg(lvl_debug,"Attr requested: position_sats");
+ attr->u.num = priv->sats;
+ break;
+ case attr_position_sats_used:
+ dbg(lvl_debug,"Attr requested: position_sats_used");
+ attr->u.num = priv->sats_used;
+ break;
+ case attr_position_coord_geo:
+ dbg(lvl_debug,"Attr requested: position_coord_geo");
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_time_iso8601: {
+ struct tm tm;
+ dbg(lvl_debug,"Attr requested: position_time_iso8601");
+ if (!priv->fix_time)
+ return 0;
+ if (gmtime_r(&priv->fix_time, &tm)) {
+ strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
+ "%Y-%m-%dT%TZ", &tm);
+ attr->u.str=priv->fixiso8601;
+ } else
+ return 0;
+ }
+ break;
+ case attr_active:
+ dbg(lvl_debug,"Attr requested: position_active");
+ active = attr_search(priv->attrs,NULL,attr_active);
+ if(active != NULL) {
+ attr->u.num=active->u.num;
+ return 1;
+ } else
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
struct vehicle_methods vehicle_maemo_methods = {
- vehicle_maemo_destroy,
- vehicle_maemo_position_attr_get,
+ vehicle_maemo_destroy,
+ vehicle_maemo_position_attr_get,
};
-static struct vehicle_priv *
-vehicle_maemo_new_maemo(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
- struct attr *source, *retry_int;
-
- dbg(lvl_debug, "enter\n");
- source = attr_search(attrs, NULL, attr_source);
- ret = g_new0(struct vehicle_priv, 1);
- ret->source = g_strdup(source->u.str);
- retry_int = attr_search(attrs, NULL, attr_retry_interval);
- if (retry_int) {
- ret->retry_interval = retry_int->u.num;
- if (ret->retry_interval !=1 && ret->retry_interval !=2 && ret->retry_interval !=5 && ret->retry_interval !=10 && ret->retry_interval !=20 && ret->retry_interval !=30 && ret->retry_interval !=60 && ret->retry_interval !=120 ) {
- dbg(lvl_error, "Retry interval %d invalid, setting to 1\n", ret->retry_interval,1);
- ret->retry_interval = 1;
- }
- } else {
- ret->retry_interval = 1;
- }
- dbg(lvl_debug,"source: %s, interval: %u\n",ret->source,ret->retry_interval);
- ret->cbl = cbl;
- *meth = vehicle_maemo_methods;
- ret->attrs = attrs;
- vehicle_maemo_open(ret);
- return ret;
+static struct vehicle_priv *vehicle_maemo_new_maemo(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
+ struct attr *source, *retry_int;
+
+ dbg(lvl_debug, "enter");
+ source = attr_search(attrs, NULL, attr_source);
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->source = g_strdup(source->u.str);
+ retry_int = attr_search(attrs, NULL, attr_retry_interval);
+ if (retry_int) {
+ ret->retry_interval = retry_int->u.num;
+ if (ret->retry_interval !=1 && ret->retry_interval !=2 && ret->retry_interval !=5 && ret->retry_interval !=10
+ && ret->retry_interval !=20 && ret->retry_interval !=30 && ret->retry_interval !=60 && ret->retry_interval !=120 ) {
+ dbg(lvl_error, "Retry interval %d invalid, setting to 1", ret->retry_interval,1);
+ ret->retry_interval = 1;
+ }
+ } else {
+ ret->retry_interval = 1;
+ }
+ dbg(lvl_debug,"source: %s, interval: %u",ret->source,ret->retry_interval);
+ ret->cbl = cbl;
+ *meth = vehicle_maemo_methods;
+ ret->attrs = attrs;
+ vehicle_maemo_open(ret);
+ return ret;
}
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("maemo", vehicle_maemo_new_maemo);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("maemo", vehicle_maemo_new_maemo);
}
diff --git a/navit/vehicle/null/vehicle_null.c b/navit/vehicle/null/vehicle_null.c
index 643945c71..61dd7123a 100644
--- a/navit/vehicle/null/vehicle_null.c
+++ b/navit/vehicle/null/vehicle_null.c
@@ -1,4 +1,4 @@
-/** @file vehicle_null.c
+/*
* @brief null uses dbus signals
*
* Navit, a modular navigation system.
@@ -34,150 +34,134 @@
#include "item.h"
#include "vehicle.h"
+/**
+ * @defgroup vehicle-null Vehicle Null
+ * @ingroup vehicle-plugins
+ * @brief A dummy Vehicle to have a null movement.
+ *
+ * @{
+ */
+
struct vehicle_priv {
- struct callback_list *cbl;
- struct coord_geo geo;
- double speed;
- double direction;
- double height;
- double radius;
- int fix_type;
- time_t fix_time;
- char fixiso8601[128];
- int sats;
- int sats_used;
- int have_coords;
- struct attr ** attrs;
+ struct callback_list *cbl;
+ struct coord_geo geo;
+ double speed;
+ double direction;
+ double height;
+ double radius;
+ int fix_type;
+ time_t fix_time;
+ char fixiso8601[128];
+ int sats;
+ int sats_used;
+ int have_coords;
+ struct attr ** attrs;
};
/**
* @brief Free the null_vehicle
- *
+ *
* @param priv
* @returns nothing
*/
-static void
-vehicle_null_destroy(struct vehicle_priv *priv)
-{
- dbg(lvl_debug,"enter\n");
- g_free(priv);
+static void vehicle_null_destroy(struct vehicle_priv *priv) {
+ dbg(lvl_debug,"enter");
+ g_free(priv);
}
/**
* @brief Provide the outside with information
- *
+ *
* @param priv
* @param type TODO: What can this be?
* @param attr
* @returns true/false
*/
-static int
-vehicle_null_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- dbg(lvl_debug,"enter %s\n",attr_to_name(type));
- switch (type) {
-#if 0
- case attr_position_fix_type:
- attr->u.num = priv->fix_type;
- break;
-#endif
- case attr_position_height:
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_radius:
- attr->u.numd = &priv->radius;
- break;
-
-#if 0
- case attr_position_qual:
- attr->u.num = priv->sats;
- break;
- case attr_position_sats_used:
- attr->u.num = priv->sats_used;
- break;
-#endif
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- if (!priv->have_coords)
- return 0;
- break;
- case attr_position_time_iso8601:
- attr->u.str=priv->fixiso8601;
- break;
- default:
- return 0;
- }
- dbg(lvl_debug,"ok\n");
- attr->type = type;
- return 1;
+static int vehicle_null_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ dbg(lvl_debug,"enter %s",attr_to_name(type));
+ switch (type) {
+ case attr_position_height:
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_radius:
+ attr->u.numd = &priv->radius;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ if (!priv->have_coords)
+ return 0;
+ break;
+ case attr_position_time_iso8601:
+ attr->u.str=priv->fixiso8601;
+ break;
+ default:
+ return 0;
+ }
+ dbg(lvl_debug,"ok");
+ attr->type = type;
+ return 1;
}
-static int
-vehicle_null_set_attr(struct vehicle_priv *priv, struct attr *attr)
-{
- switch (attr->type) {
- case attr_position_speed:
- priv->speed=*attr->u.numd;
- break;
- case attr_position_direction:
- priv->direction=*attr->u.numd;
- break;
- case attr_position_coord_geo:
- priv->geo=*attr->u.coord_geo;
- priv->have_coords=1;
- break;
- default:
- break;
- }
- callback_list_call_attr_0(priv->cbl, attr->type);
- return 1;
+static int vehicle_null_set_attr(struct vehicle_priv *priv, struct attr *attr) {
+ switch (attr->type) {
+ case attr_position_speed:
+ priv->speed=*attr->u.numd;
+ break;
+ case attr_position_direction:
+ priv->direction=*attr->u.numd;
+ break;
+ case attr_position_coord_geo:
+ priv->geo=*attr->u.coord_geo;
+ priv->have_coords=1;
+ break;
+ default:
+ break;
+ }
+ callback_list_call_attr_0(priv->cbl, attr->type);
+ return 1;
}
struct vehicle_methods vehicle_null_methods = {
- vehicle_null_destroy,
- vehicle_null_position_attr_get,
- vehicle_null_set_attr,
+ vehicle_null_destroy,
+ vehicle_null_position_attr_get,
+ vehicle_null_set_attr,
};
/**
* @brief Create null_vehicle
- *
+ *
* @param meth
* @param cbl
* @param attrs
* @returns vehicle_priv
*/
-static struct vehicle_priv *
-vehicle_null_new_null(struct vehicle_methods *meth,
- struct callback_list *cbl,
- struct attr **attrs)
-{
- struct vehicle_priv *ret;
+static struct vehicle_priv *vehicle_null_new_null(struct vehicle_methods *meth,
+ struct callback_list *cbl,
+ struct attr **attrs) {
+ struct vehicle_priv *ret;
- dbg(lvl_debug, "enter\n");
- ret = g_new0(struct vehicle_priv, 1);
- ret->cbl = cbl;
- *meth = vehicle_null_methods;
- dbg(lvl_debug, "return\n");
- return ret;
+ dbg(lvl_debug, "enter");
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->cbl = cbl;
+ *meth = vehicle_null_methods;
+ dbg(lvl_debug, "return");
+ return ret;
}
/**
* @brief register vehicle_null
- *
+ *
* @returns nothing
*/
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("null", vehicle_null_new_null);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("null", vehicle_null_new_null);
}
diff --git a/navit/vehicle/qt5/vehicle_qt5.cpp b/navit/vehicle/qt5/vehicle_qt5.cpp
index 2a2b6f5cf..b855d12b9 100644
--- a/navit/vehicle/qt5/vehicle_qt5.cpp
+++ b/navit/vehicle/qt5/vehicle_qt5.cpp
@@ -1,5 +1,4 @@
-/** @file vehicle_null.c
- * @brief null uses dbus signals
+/*
*
* Navit, a modular navigation system.
* Copyright (C) 2005-2017 Navit Team
@@ -41,55 +40,62 @@ extern "C" {
#include "vehicle_qt5.h"
#include "vehicle_qt5.moc"
#include <QDateTime>
+
+/**
+ * @defgroup vehicle-qt5 Vehicle QT5
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from qt5
+ *
+ * @{
+ */
+
QNavitGeoReceiver::QNavitGeoReceiver(QObject* parent, struct vehicle_priv* c)
- : QObject(parent)
-{
+ : QObject(parent) {
priv = c;
if (priv->source != NULL) {
connect(priv->source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo)));
}
if (priv->satellites != NULL) {
- connect(priv->satellites, SIGNAL(satellitesInUseUpdated(const QList<QGeoSatelliteInfo>&)), this, SLOT(satellitesInUseUpdated(const QList<QGeoSatelliteInfo>&)));
- connect(priv->satellites, SIGNAL(satellitesInViewUpdated(const QList<QGeoSatelliteInfo>&)), this, SLOT(satellitesInViewUpdated(const QList<QGeoSatelliteInfo>&)));
+ connect(priv->satellites, SIGNAL(satellitesInUseUpdated(const QList<QGeoSatelliteInfo>&)), this,
+ SLOT(satellitesInUseUpdated(const QList<QGeoSatelliteInfo>&)));
+ connect(priv->satellites, SIGNAL(satellitesInViewUpdated(const QList<QGeoSatelliteInfo>&)), this,
+ SLOT(satellitesInViewUpdated(const QList<QGeoSatelliteInfo>&)));
}
}
-void QNavitGeoReceiver::satellitesInUseUpdated(const QList<QGeoSatelliteInfo>& sats)
-{
- dbg(lvl_debug, "Sats in use: %d\n", sats.count());
+void QNavitGeoReceiver::satellitesInUseUpdated(const QList<QGeoSatelliteInfo>& sats) {
+ dbg(lvl_debug, "Sats in use: %d", sats.count());
priv->sats_used = sats.count();
callback_list_call_attr_0(priv->cbl, attr_position_sats_used);
}
-void QNavitGeoReceiver::satellitesInViewUpdated(const QList<QGeoSatelliteInfo>& sats)
-{
- dbg(lvl_debug, "Sats in view: %d\n", sats.count());
+void QNavitGeoReceiver::satellitesInViewUpdated(const QList<QGeoSatelliteInfo>& sats) {
+ dbg(lvl_debug, "Sats in view: %d", sats.count());
priv->sats = sats.count();
callback_list_call_attr_0(priv->cbl, attr_position_qual);
}
-void QNavitGeoReceiver::positionUpdated(const QGeoPositionInfo& info)
-{
+void QNavitGeoReceiver::positionUpdated(const QGeoPositionInfo& info) {
/* ignore stale view */
if (info.coordinate().isValid()) {
if (info.timestamp().toUTC().secsTo(QDateTime::currentDateTimeUtc()) > 20) {
- dbg(lvl_debug, "Ignoring old FIX\n");
+ dbg(lvl_debug, "Ignoring old FIX");
return;
}
}
if (info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) {
- dbg(lvl_debug, "Horizontal acc (%f)\n", info.attribute(QGeoPositionInfo::HorizontalAccuracy));
+ dbg(lvl_debug, "Horizontal acc (%f)", info.attribute(QGeoPositionInfo::HorizontalAccuracy));
priv->radius = info.attribute(QGeoPositionInfo::HorizontalAccuracy);
callback_list_call_attr_0(priv->cbl, attr_position_radius);
}
if (info.hasAttribute(QGeoPositionInfo::GroundSpeed)) {
- dbg(lvl_debug, "Got ground speed (%f)\n", info.attribute(QGeoPositionInfo::GroundSpeed));
+ dbg(lvl_debug, "Got ground speed (%f)", info.attribute(QGeoPositionInfo::GroundSpeed));
priv->speed = info.attribute(QGeoPositionInfo::GroundSpeed) * 3.6;
callback_list_call_attr_0(priv->cbl, attr_position_speed);
}
if (info.hasAttribute(QGeoPositionInfo::Direction)) {
- dbg(lvl_debug, "Direction (%f)\n", info.attribute(QGeoPositionInfo::Direction));
+ dbg(lvl_debug, "Direction (%f)", info.attribute(QGeoPositionInfo::Direction));
priv->direction = info.attribute(QGeoPositionInfo::Direction);
callback_list_call_attr_0(priv->cbl, attr_position_direction);
}
@@ -107,34 +113,38 @@ void QNavitGeoReceiver::positionUpdated(const QGeoPositionInfo& info)
}
if (info.coordinate().isValid()) {
- dbg(lvl_debug, "Got valid coordinate (lat %f, lon %f)\n", info.coordinate().latitude(), info.coordinate().longitude());
+ dbg(lvl_debug, "Got valid coordinate (lat %f, lon %f)", info.coordinate().latitude(), info.coordinate().longitude());
priv->geo.lat = info.coordinate().latitude();
priv->geo.lng = info.coordinate().longitude();
- priv->have_coords = 1;
if (info.coordinate().type() == QGeoCoordinate::Coordinate3D) {
- dbg(lvl_debug, "Got valid altitude (alt %f)\n", info.coordinate().altitude());
+ dbg(lvl_debug, "Got valid altitude (alt %f)", info.coordinate().altitude());
priv->height = info.coordinate().altitude();
}
- //dbg(lvl_debug, "Time %s\n", info.timestamp().toUTC().toString().toLatin1().data());
+ //dbg(lvl_debug, "Time %s", info.timestamp().toUTC().toString().toLatin1().data());
priv->fix_time = info.timestamp().toUTC().toTime_t();
callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ if(priv->have_coords != attr_position_valid_valid) {
+ priv->have_coords = attr_position_valid_valid;
+ callback_list_call_attr_0(priv->cbl, attr_position_valid);
+ }
} else {
- dbg(lvl_debug, "Got invalid coordinate\n");
- priv->have_coords = 0;
+ dbg(lvl_debug, "Got invalid coordinate");
callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ if(priv->have_coords != attr_position_valid_invalid) {
+ priv->have_coords = attr_position_valid_invalid;
+ callback_list_call_attr_0(priv->cbl, attr_position_valid);
+ }
}
}
/**
* @brief Free the null_vehicle
- *
+ *
* @param priv
* @returns nothing
*/
-static void
-vehicle_qt5_destroy(struct vehicle_priv* priv)
-{
- dbg(lvl_debug, "enter\n");
+static void vehicle_qt5_destroy(struct vehicle_priv* priv) {
+ dbg(lvl_debug, "enter");
if (priv->receiver != NULL)
delete priv->receiver;
if (priv->source != NULL)
@@ -144,18 +154,16 @@ vehicle_qt5_destroy(struct vehicle_priv* priv)
/**
* @brief Provide the outside with information
- *
+ *
* @param priv
* @param type TODO: What can this be?
* @param attr
* @returns true/false
*/
-static int
-vehicle_qt5_position_attr_get(struct vehicle_priv* priv,
- enum attr_type type, struct attr* attr)
-{
+static int vehicle_qt5_position_attr_get(struct vehicle_priv* priv,
+ enum attr_type type, struct attr* attr) {
struct attr* active = NULL;
- dbg(lvl_debug, "enter %s\n", attr_to_name(type));
+ dbg(lvl_debug, "enter %s", attr_to_name(type));
switch (type) {
case attr_position_valid:
attr->u.num = priv->have_coords;
@@ -183,7 +191,7 @@ vehicle_qt5_position_attr_get(struct vehicle_priv* priv,
break;
case attr_position_coord_geo:
attr->u.coord_geo = &priv->geo;
- if (!priv->have_coords)
+ if (priv->have_coords != attr_position_valid_valid)
return 0;
break;
case attr_position_time_iso8601:
@@ -191,15 +199,15 @@ vehicle_qt5_position_attr_get(struct vehicle_priv* priv,
struct tm tm;
if (gmtime_r(&priv->fix_time, &tm)) {
strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
- "%Y-%m-%dT%TZ", &tm);
+ "%Y-%m-%dT%TZ", &tm);
attr->u.str = priv->fixiso8601;
} else {
priv->fix_time = 0;
return 0;
}
- //dbg(lvl_debug,"Fix Time: %s\n", priv->fixiso8601);
+ //dbg(lvl_debug,"Fix Time: %s", priv->fixiso8601);
} else {
- //dbg(lvl_debug,"Fix Time: 0\n");
+ //dbg(lvl_debug,"Fix Time: 0");
return 0;
}
break;
@@ -216,14 +224,12 @@ vehicle_qt5_position_attr_get(struct vehicle_priv* priv,
default:
return 0;
}
- dbg(lvl_debug, "ok\n");
+ dbg(lvl_debug, "ok");
attr->type = type;
return 1;
}
-static int
-vehicle_qt5_set_attr(struct vehicle_priv* priv, struct attr* attr)
-{
+static int vehicle_qt5_set_attr(struct vehicle_priv* priv, struct attr* attr) {
switch (attr->type) {
case attr_position_speed:
priv->speed = *attr->u.numd;
@@ -233,7 +239,10 @@ vehicle_qt5_set_attr(struct vehicle_priv* priv, struct attr* attr)
break;
case attr_position_coord_geo:
priv->geo = *attr->u.coord_geo;
- priv->have_coords = 1;
+ if(priv->have_coords != attr_position_valid_valid) {
+ priv->have_coords = attr_position_valid_valid;
+ callback_list_call_attr_0(priv->cbl, attr_position_valid);
+ }
break;
default:
break;
@@ -250,20 +259,18 @@ struct vehicle_methods vehicle_null_methods = {
/**
* @brief Create null_vehicle
- *
+ *
* @param meth
* @param cbl
* @param attrs
* @returns vehicle_priv
*/
-static struct vehicle_priv*
-vehicle_qt5_new_qt5(struct vehicle_methods* meth,
- struct callback_list* cbl,
- struct attr** attrs)
-{
+static struct vehicle_priv* vehicle_qt5_new_qt5(struct vehicle_methods* meth,
+ struct callback_list* cbl,
+ struct attr** attrs) {
struct vehicle_priv* ret;
- dbg(lvl_debug, "enter\n");
+ dbg(lvl_debug, "enter");
ret = g_new0(struct vehicle_priv, 1);
ret->cbl = cbl;
*meth = vehicle_null_methods;
@@ -271,26 +278,27 @@ vehicle_qt5_new_qt5(struct vehicle_methods* meth,
ret->source = QGeoPositionInfoSource::createDefaultSource(NULL);
ret->satellites = QGeoSatelliteInfoSource::createDefaultSource(NULL);
if (ret->source == NULL) {
- dbg(lvl_error, "Got NO QGeoPositionInfoSource\n");
+ dbg(lvl_error, "Got NO QGeoPositionInfoSource");
} else {
- dbg(lvl_debug, "Using %s\n", ret->source->sourceName().toLatin1().data());
+ dbg(lvl_debug, "Using %s", ret->source->sourceName().toLatin1().data());
ret->receiver = new QNavitGeoReceiver(NULL, ret);
- ret->satellites->setUpdateInterval(1000);
- ret->satellites->startUpdates();
+ if(ret->satellites != NULL) {
+ ret->satellites->setUpdateInterval(1000);
+ ret->satellites->startUpdates();
+ }
ret->source->setUpdateInterval(500);
ret->source->startUpdates();
}
- dbg(lvl_debug, "return\n");
+ dbg(lvl_debug, "return");
return ret;
}
/**
* @brief register vehicle_null
- *
+ *
* @returns nothing
*/
-void plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
plugin_register_category_vehicle("qt5", vehicle_qt5_new_qt5);
}
diff --git a/navit/vehicle/webos/bluetooth.c b/navit/vehicle/webos/bluetooth.c
index 343d2ec5c..d51ec450b 100644
--- a/navit/vehicle/webos/bluetooth.c
+++ b/navit/vehicle/webos/bluetooth.c
@@ -1,4 +1,4 @@
-/* vim: sw=3 ts=3
+/* vim: sw=3 ts=3
* */
#include <config.h>
@@ -8,7 +8,7 @@
#include <errno.h>
#include <sys/time.h>
#include <PDL.h>
-#include <SDL.h>
+#include "SDL.h"
#include "debug.h"
#include "callback.h"
#include "event.h"
@@ -21,670 +21,565 @@ static void vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int
/********************************************************************/
-static void
-mlPDL_ServiceCall_callback(struct callback_list *cbl, char *service, char *parameters/*, struct callback *fail_cb*/)
-{
- PDL_Err err;
- dbg(lvl_debug,"PDL_ServiceCall(%s) parameters(%s)\n",service,parameters);
- err = PDL_ServiceCall(service, parameters);
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCall to (%s) with (%s) failed with (%d): (%s)\n", service, parameters, err, PDL_GetError());
- }
-
- callback_list_destroy(cbl);
- g_free(service);
- g_free(parameters);
+static void mlPDL_ServiceCall_callback(struct callback_list *cbl, char *service,
+ char *parameters/*, struct callback *fail_cb*/) {
+ PDL_Err err;
+ dbg(lvl_debug,"PDL_ServiceCall(%s) parameters(%s)",service,parameters);
+ err = PDL_ServiceCall(service, parameters);
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"PDL_ServiceCall to (%s) with (%s) failed with (%d): (%s)", service, parameters, err, PDL_GetError());
+ }
+
+ callback_list_destroy(cbl);
+ g_free(service);
+ g_free(parameters);
}
-static void
-mlPDL_ServiceCall(const char *service, const char *parameters/*, struct callback *fail_cb = NULL*/)
-{
- struct callback *cb = NULL;
- struct callback_list *cbl = NULL;
+static void mlPDL_ServiceCall(const char *service, const char *parameters/*, struct callback *fail_cb = NULL*/) {
+ struct callback *cb = NULL;
+ struct callback_list *cbl = NULL;
- char *service2 = g_strdup(service);
- char *parameters2 = g_strdup(parameters);
+ char *service2 = g_strdup(service);
+ char *parameters2 = g_strdup(parameters);
- cbl = callback_list_new();
- cb = callback_new_3(callback_cast(mlPDL_ServiceCall_callback),cbl,service2,parameters2);
+ cbl = callback_list_new();
+ cb = callback_new_3(callback_cast(mlPDL_ServiceCall_callback),cbl,service2,parameters2);
- callback_list_add(cbl, cb);
+ callback_list_add(cbl, cb);
-dbg(lvl_debug,"event_call_callback(%p)\n",cbl);
- event_call_callback(cbl);
+ dbg(lvl_debug,"event_call_callback(%p)",cbl);
+ event_call_callback(cbl);
}
/********************************************************************/
-static void
-mlPDL_ServiceCallWithCallback_callback(struct callback_list *cbl,
- char *service,
- char *parameters,
- PDL_ServiceCallbackFunc callback,
- void *user,
- PDL_bool removeAfterResponse)
-{
- PDL_Err err;
- dbg(lvl_debug,"PDL_ServiceCallWithCallback(%s) parameters(%s)\n",service,parameters);
- err = PDL_ServiceCallWithCallback(service, parameters, callback, user, removeAfterResponse);
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCallWithCallback to (%s) with (%s) failed with (%d): (%s)\n", service, parameters, err, PDL_GetError());
- }
-
- callback_list_destroy(cbl);
- g_free(service);
- g_free(parameters);
+static void mlPDL_ServiceCallWithCallback_callback(struct callback_list *cbl,
+ char *service,
+ char *parameters,
+ PDL_ServiceCallbackFunc callback,
+ void *user,
+ PDL_bool removeAfterResponse) {
+ PDL_Err err;
+ dbg(lvl_debug,"PDL_ServiceCallWithCallback(%s) parameters(%s)",service,parameters);
+ err = PDL_ServiceCallWithCallback(service, parameters, callback, user, removeAfterResponse);
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"PDL_ServiceCallWithCallback to (%s) with (%s) failed with (%d): (%s)", service, parameters, err,
+ PDL_GetError());
+ }
+
+ callback_list_destroy(cbl);
+ g_free(service);
+ g_free(parameters);
}
-static void
-mlPDL_ServiceCallWithCallback(const char *service,
- const char *parameters,
- PDL_ServiceCallbackFunc callback,
- void *user,
- PDL_bool removeAfterResponse)
-{
- struct callback *cb = NULL;
- struct callback_list *cbl = NULL;
+static void mlPDL_ServiceCallWithCallback(const char *service,
+ const char *parameters,
+ PDL_ServiceCallbackFunc callback,
+ void *user,
+ PDL_bool removeAfterResponse) {
+ struct callback *cb = NULL;
+ struct callback_list *cbl = NULL;
- char *service2 = g_strdup(service);
- char *parameters2 = g_strdup(parameters);
+ char *service2 = g_strdup(service);
+ char *parameters2 = g_strdup(parameters);
- cbl = callback_list_new();
- cb = callback_new_args(callback_cast(mlPDL_ServiceCallWithCallback_callback),6,cbl,service2,parameters2,callback,user,removeAfterResponse);
+ cbl = callback_list_new();
+ cb = callback_new_args(callback_cast(mlPDL_ServiceCallWithCallback_callback),6,cbl,service2,parameters2,callback,user,
+ removeAfterResponse);
- callback_list_add(cbl, cb);
+ callback_list_add(cbl, cb);
- dbg(lvl_debug,"event_call_callback(%p)\n",cbl);
- event_call_callback(cbl);
+ dbg(lvl_debug,"event_call_callback(%p)",cbl);
+ event_call_callback(cbl);
}
/********************************************************************/
-static void
-vehicle_webos_init_pdl_locationtracking_callback(struct vehicle_priv *priv, struct callback_list *cbl, int param)
-{
- PDL_Err err;
+static void vehicle_webos_init_pdl_locationtracking_callback(struct vehicle_priv *priv, struct callback_list *cbl,
+ int param) {
+ PDL_Err err;
- priv->gps_type = param ? GPS_TYPE_INT: GPS_TYPE_NONE;
+ priv->gps_type = param ? GPS_TYPE_INT: GPS_TYPE_NONE;
- dbg(lvl_debug,"Calling PDL_EnableLocationTracking(%i)\n",param);
- err = PDL_EnableLocationTracking(param);
+ dbg(lvl_debug,"Calling PDL_EnableLocationTracking(%i)",param);
+ err = PDL_EnableLocationTracking(param);
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError());
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)", err, PDL_GetError());
// vehicle_webos_close(priv);
// return 0;
- }
+ }
- callback_list_destroy(cbl);
+ callback_list_destroy(cbl);
}
-static void
-vehicle_webos_init_pdl_locationtracking(struct vehicle_priv *priv, int param)
-{
- struct callback *cb = NULL;
- struct callback_list *cbl = NULL;
+static void vehicle_webos_init_pdl_locationtracking(struct vehicle_priv *priv, int param) {
+ struct callback *cb = NULL;
+ struct callback_list *cbl = NULL;
- cbl = callback_list_new();
- cb = callback_new_3(callback_cast(vehicle_webos_init_pdl_locationtracking_callback),priv,cbl,param);
+ cbl = callback_list_new();
+ cb = callback_new_3(callback_cast(vehicle_webos_init_pdl_locationtracking_callback),priv,cbl,param);
- callback_list_add(cbl, cb);
+ callback_list_add(cbl, cb);
- event_call_callback(cbl);
+ event_call_callback(cbl);
}
/********************************************************************/
-static int
-vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
-{
- char *nmea_data_buf, *p, *item[32];
- double lat, lng;
- int i, bcsum;
- int len = strlen(buffer);
- unsigned char csum = 0;
- int valid=0;
- int ret = 0;
-
- dbg(lvl_info, "enter: buffer='%s'\n", buffer);
- for (;;) {
- if (len < 4) {
- dbg(lvl_error, "'%s' too short\n", buffer);
- return ret;
- }
- if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') {
- buffer[--len] = '\0';
+static int vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer) {
+ char *nmea_data_buf, *p, *item[32];
+ double lat, lng;
+ int i, bcsum;
+ int len = strlen(buffer);
+ unsigned char csum = 0;
+ int valid=0;
+ int ret = 0;
+
+ dbg(lvl_info, "enter: buffer='%s'", buffer);
+ for (;;) {
+ if (len < 4) {
+ dbg(lvl_error, "'%s' too short", buffer);
+ return ret;
+ }
+ if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') {
+ buffer[--len] = '\0';
if (buffer[len - 1] == '\r')
buffer[--len] = '\0';
} else
- break;
- }
- if (buffer[0] != '$') {
- dbg(lvl_error, "no leading $ in '%s'\n", buffer);
- return ret;
- }
- if (buffer[len - 3] != '*') {
- dbg(lvl_error, "no *XX in '%s'\n", buffer);
- return ret;
- }
- for (i = 1; i < len - 3; i++) {
- csum ^= (unsigned char) (buffer[i]);
- }
- if (!sscanf(buffer + len - 2, "%x", &bcsum) /*&& priv->checksum_ignore != 2*/) {
- dbg(lvl_error, "no checksum in '%s'\n", buffer);
- return ret;
- }
- if (bcsum != csum /*&& priv->checksum_ignore == 0*/) {
- dbg(lvl_error, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum);
- return ret;
- }
-
- if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
- nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL);
- g_free(priv->nmea_data_buf);
- priv->nmea_data_buf=nmea_data_buf;
- } else {
- dbg(lvl_error, "nmea buffer overflow, discarding '%s'\n", buffer);
- }
- i = 0;
- p = buffer;
- while (i < 31) {
- item[i++] = p;
- while (*p && *p != ',')
- p++;
- if (!*p)
- break;
- *p++ = '\0';
- }
+ break;
+ }
+ if (buffer[0] != '$') {
+ dbg(lvl_error, "no leading $ in '%s'", buffer);
+ return ret;
+ }
+ if (buffer[len - 3] != '*') {
+ dbg(lvl_error, "no *XX in '%s'", buffer);
+ return ret;
+ }
+ for (i = 1; i < len - 3; i++) {
+ csum ^= (unsigned char) (buffer[i]);
+ }
+ if (!sscanf(buffer + len - 2, "%x", &bcsum) /*&& priv->checksum_ignore != 2*/) {
+ dbg(lvl_error, "no checksum in '%s'", buffer);
+ return ret;
+ }
+ if (bcsum != csum /*&& priv->checksum_ignore == 0*/) {
+ dbg(lvl_error, "wrong checksum in '%s was %x should be %x'", buffer,bcsum,csum);
+ return ret;
+ }
+
+ if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
+ nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL);
+ g_free(priv->nmea_data_buf);
+ priv->nmea_data_buf=nmea_data_buf;
+ } else {
+ dbg(lvl_error, "nmea buffer overflow, discarding '%s'", buffer);
+ }
+ i = 0;
+ p = buffer;
+ while (i < 31) {
+ item[i++] = p;
+ while (*p && *p != ',')
+ p++;
+ if (!*p)
+ break;
+ *p++ = '\0';
+ }
// if (buffer[0] == '$') {
// struct timeval tv;
// gettimeofday(&tv,NULL);
- priv->delta = 0; // (unsigned int)difftime(tv.tv_sec, priv->fix_time);
+ priv->delta = 0; // (unsigned int)difftime(tv.tv_sec, priv->fix_time);
// priv->fix_time = tv.tv_sec;
-// dbg(lvl_info,"delta(%i)\n",priv->delta);
+// dbg(lvl_info,"delta(%i)",priv->delta);
// }
- if (!strncmp(&buffer[3], "GGA", 3)) {
- /* 1 1111
- 0 1 2 3 4 5 6 7 8 9 0 1234
- $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C
- UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
- HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
- */
- if (*item[2] && *item[3] && *item[4] && *item[5]) {
- lat = g_ascii_strtod(item[2], NULL);
- priv->geo.lat = floor(lat / 100);
- lat -= priv->geo.lat * 100;
- priv->geo.lat += lat / 60;
-
- if (!g_strcasecmp(item[3],"S"))
- priv->geo.lat=-priv->geo.lat;
-
- lng = g_ascii_strtod(item[4], NULL);
- priv->geo.lng = floor(lng / 100);
- lng -= priv->geo.lng * 100;
- priv->geo.lng += lng / 60;
-
- if (!g_strcasecmp(item[5],"W"))
- priv->geo.lng=-priv->geo.lng;
- priv->valid=attr_position_valid_valid;
- dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
-
- } else
- priv->valid=attr_position_valid_invalid;
- if (*item[6])
- sscanf(item[6], "%d", &priv->status);
- if (*item[7])
- sscanf(item[7], "%d", &priv->sats_used);
- if (*item[8])
- sscanf(item[8], "%lf", &priv->hdop);
- if (*item[1]) {
- struct tm tm;
- strptime(item[1],"%H%M%S",&tm);
- priv->fix_time = mktime(&tm);
- }
-
- if (*item[9])
- sscanf(item[9], "%lf", &priv->altitude);
-
- g_free(priv->nmea_data);
- priv->nmea_data=priv->nmea_data_buf;
- priv->nmea_data_buf=NULL;
-#if 0
- if (priv->file_type == file_type_file) {
- if (priv->watch) {
- vehicle_file_disable_watch(priv);
- event_add_timeout(priv->time, 0, priv->cbt);
- }
- }
-#endif
- ret = 1;
- }
- if (!strncmp(&buffer[3], "VTG", 3)) {
- /* 0 1 2 34 5 6 7 8
- $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A
- Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4],
- Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8]
- */
- if (item[1] && item[7])
- valid = 1;
- if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D'))
- valid = 1;
- if (valid) {
- priv->track = g_ascii_strtod( item[1], NULL );
- priv->speed = g_ascii_strtod( item[7], NULL );
- dbg(lvl_info,"direction %lf, speed %2.1lf\n", priv->track, priv->speed);
- }
- }
- if (!strncmp(&buffer[3], "RMC", 3)) {
- /* 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1
- $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
- Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9],
- magnetic variation[10],magnetic variation direction[11]
- */
- if (*item[2] == 'A')
- valid = 1;
- if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D'))
- valid = 1;
- if (valid) {
- priv->track = g_ascii_strtod( item[8], NULL );
- priv->speed = g_ascii_strtod( item[7], NULL );
- priv->speed *= 1.852;
-
- struct tm tm;
- char time[13];
-
- sprintf(time,"%s%s",item[1],item[9]);
-
- strptime(time,"%H%M%S%d%m%y",&tm);
-
- priv->fix_time = mktime(&tm);
-#if 0
- sscanf(item[9], "%02d%02d%02d",
- &priv->fixday,
- &priv->fixmonth,
- &priv->fixyear);
- priv->fixyear += 2000;
-#endif
- }
- ret = 1;
- }
- if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
- /*
- 0 GSV Satellites in view
- 1 2 Number of sentences for full data
- 2 1 sentence 1 of 2
- 3 08 Number of satellites in view
-
- 4 01 Satellite PRN number
- 5 40 Elevation, degrees
- 6 083 Azimuth, degrees
- 7 46 SNR - higher is better
- for up to 4 satellites per sentence
- *75 the checksum data, always begins with *
- */
- if (item[3]) {
- sscanf(item[3], "%d", &priv->sats_visible);
- }
-#if 0
- j=4;
- while (j+4 <= i && priv->current_count < 24) {
- struct gps_sat *sat=&priv->next[priv->next_count++];
- sat->prn=atoi(item[j]);
- sat->elevation=atoi(item[j+1]);
- sat->azimuth=atoi(item[j+2]);
- sat->snr=atoi(item[j+3]);
- j+=4;
- }
- if (!strcmp(item[1], item[2])) {
- priv->sats_signal=0;
- for (i = 0 ; i < priv->next_count ; i++) {
- priv->current[i]=priv->next[i];
- if (priv->current[i].snr)
- priv->sats_signal++;
- }
- priv->current_count=priv->next_count;
- priv->next_count=0;
- }
-#endif
- }
-#if 0
- if (!strncmp(&buffer[3], "ZDA", 3)) {
- /*
- 0 1 2 3 4 5 6
- $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC
- hhmmss HrMinSec(UTC)
- dd,mm,yyy Day,Month,Year
- xx local zone hours -13..13
- yy local zone minutes 0..59
- */
- if (item[1] && item[2] && item[3] && item[4]) {
- strncpy(priv->fixtime, item[1], strlen(priv->fixtime));
- priv->fixday = atoi(item[2]);
- priv->fixmonth = atoi(item[3]);
- priv->fixyear = atoi(item[4]);
- }
- }
-#endif
- if (!strncmp(buffer, "$IISMD", 6)) {
- /*
- 0 1 2 3 4
- $IISMD,dir,press,height,temp*CC"
- dir Direction (0-359)
- press Pressure (hpa, i.e. 1032)
- height Barometric height above ground (meter)
- temp Temperature (Degree Celsius)
- */
- if (item[1]) {
- priv->magnetic_direction = g_ascii_strtod( item[1], NULL );
- dbg(lvl_debug,"magnetic %d\n", priv->magnetic_direction);
- }
- }
- return ret;
+ if (!strncmp(&buffer[3], "GGA", 3)) {
+ /* 1 1111
+ 0 1 2 3 4 5 6 7 8 9 0 1234
+ $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C
+ UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
+ HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
+ */
+ if (*item[2] && *item[3] && *item[4] && *item[5]) {
+ lat = g_ascii_strtod(item[2], NULL);
+ priv->geo.lat = floor(lat / 100);
+ lat -= priv->geo.lat * 100;
+ priv->geo.lat += lat / 60;
+
+ if (!g_strcasecmp(item[3],"S"))
+ priv->geo.lat=-priv->geo.lat;
+
+ lng = g_ascii_strtod(item[4], NULL);
+ priv->geo.lng = floor(lng / 100);
+ lng -= priv->geo.lng * 100;
+ priv->geo.lng += lng / 60;
+
+ if (!g_strcasecmp(item[5],"W"))
+ priv->geo.lng=-priv->geo.lng;
+ priv->valid=attr_position_valid_valid;
+ dbg(lvl_info, "latitude '%2.4f' longitude %2.4f", priv->geo.lat, priv->geo.lng);
+
+ } else
+ priv->valid=attr_position_valid_invalid;
+ if (*item[6])
+ sscanf(item[6], "%d", &priv->status);
+ if (*item[7])
+ sscanf(item[7], "%d", &priv->sats_used);
+ if (*item[8])
+ sscanf(item[8], "%lf", &priv->hdop);
+ if (*item[1]) {
+ struct tm tm;
+ strptime(item[1],"%H%M%S",&tm);
+ priv->fix_time = mktime(&tm);
+ }
+
+ if (*item[9])
+ sscanf(item[9], "%lf", &priv->altitude);
+
+ g_free(priv->nmea_data);
+ priv->nmea_data=priv->nmea_data_buf;
+ priv->nmea_data_buf=NULL;
+ ret = 1;
+ }
+ if (!strncmp(&buffer[3], "VTG", 3)) {
+ /* 0 1 2 34 5 6 7 8
+ $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A
+ Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4],
+ Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8]
+ */
+ if (item[1] && item[7])
+ valid = 1;
+ if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D'))
+ valid = 1;
+ if (valid) {
+ priv->track = g_ascii_strtod( item[1], NULL );
+ priv->speed = g_ascii_strtod( item[7], NULL );
+ dbg(lvl_info,"direction %lf, speed %2.1lf", priv->track, priv->speed);
+ }
+ }
+ if (!strncmp(&buffer[3], "RMC", 3)) {
+ /* 1 1
+ 0 1 2 3 4 5 6 7 8 9 0 1
+ $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
+ Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9],
+ magnetic variation[10],magnetic variation direction[11]
+ */
+ if (*item[2] == 'A')
+ valid = 1;
+ if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D'))
+ valid = 1;
+ if (valid) {
+ priv->track = g_ascii_strtod( item[8], NULL );
+ priv->speed = g_ascii_strtod( item[7], NULL );
+ priv->speed *= 1.852;
+
+ struct tm tm;
+ char time[13];
+
+ sprintf(time,"%s%s",item[1],item[9]);
+
+ strptime(time,"%H%M%S%d%m%y",&tm);
+
+ priv->fix_time = mktime(&tm);
+ }
+ ret = 1;
+ }
+ if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
+ /*
+ 0 GSV Satellites in view
+ 1 2 Number of sentences for full data
+ 2 1 sentence 1 of 2
+ 3 08 Number of satellites in view
+
+ 4 01 Satellite PRN number
+ 5 40 Elevation, degrees
+ 6 083 Azimuth, degrees
+ 7 46 SNR - higher is better
+ for up to 4 satellites per sentence
+ *75 the checksum data, always begins with *
+ */
+ if (item[3]) {
+ sscanf(item[3], "%d", &priv->sats_visible);
+ }
+ }
+ if (!strncmp(buffer, "$IISMD", 6)) {
+ /*
+ 0 1 2 3 4
+ $IISMD,dir,press,height,temp*CC"
+ dir Direction (0-359)
+ press Pressure (hpa, i.e. 1032)
+ height Barometric height above ground (meter)
+ temp Temperature (Degree Celsius)
+ */
+ if (item[1]) {
+ priv->magnetic_direction = g_ascii_strtod( item[1], NULL );
+ dbg(lvl_debug,"magnetic %d", priv->magnetic_direction);
+ }
+ }
+ return ret;
}
-static void
-vehicle_webos_spp_handle_read(PDL_ServiceParameters *params, void *user)
-{
- struct vehicle_priv *priv = user;
- int size, rc = 0;
- char *str, *tok;
+static void vehicle_webos_spp_handle_read(PDL_ServiceParameters *params, void *user) {
+ struct vehicle_priv *priv = user;
+ int size, rc = 0;
+ char *str, *tok;
- //PDL_Err err;
- size = PDL_GetParamInt(params, "dataLength");
- if (size > buffer_size) {
- dbg(lvl_error, "read returned too much data\n");
- return;
- }
+ //PDL_Err err;
+ size = PDL_GetParamInt(params, "dataLength");
+ if (size > buffer_size) {
+ dbg(lvl_error, "read returned too much data");
+ return;
+ }
- char buffer[buffer_size];
+ char buffer[buffer_size];
- PDL_GetParamString(params,"data",buffer,buffer_size);
- dbg(lvl_debug,"data(%s) dataLength(%i)\n",buffer,size);
+ PDL_GetParamString(params,"data",buffer,buffer_size);
+ dbg(lvl_debug,"data(%s) dataLength(%i)",buffer,size);
- memmove(priv->buffer + priv->buffer_pos, buffer, size);
+ memmove(priv->buffer + priv->buffer_pos, buffer, size);
- priv->buffer_pos += size;
- priv->buffer[priv->buffer_pos] = '\0';
- dbg(lvl_debug, "size=%d pos=%d buffer='%s'\n", size,
- priv->buffer_pos, priv->buffer);
- str = priv->buffer;
- while ((tok = strchr(str, '\n'))) {
- *tok++ = '\0';
- dbg(lvl_debug, "line='%s'\n", str);
- rc += vehicle_webos_parse_nmea(priv, str);
- str = tok;
+ priv->buffer_pos += size;
+ priv->buffer[priv->buffer_pos] = '\0';
+ dbg(lvl_debug, "size=%d pos=%d buffer='%s'", size,
+ priv->buffer_pos, priv->buffer);
+ str = priv->buffer;
+ while ((tok = strchr(str, '\n'))) {
+ *tok++ = '\0';
+ dbg(lvl_debug, "line='%s'", str);
+ rc += vehicle_webos_parse_nmea(priv, str);
+ str = tok;
// if (priv->file_type == file_type_file && rc)
// break;
- }
-
- if (str != priv->buffer) {
- size = priv->buffer + priv->buffer_pos - str;
- memmove(priv->buffer, str, size + 1);
- priv->buffer_pos = size;
- dbg(lvl_debug,"now pos=%d buffer='%s'\n",
- priv->buffer_pos, priv->buffer);
- } else if (priv->buffer_pos == buffer_size - 1) {
- dbg(lvl_error,"Overflow. Most likely wrong baud rate or no nmea protocol\n");
- priv->buffer_pos = 0;
- }
- if (rc) {
- SDL_Event event;
- SDL_UserEvent userevent;
-
- userevent.type = SDL_USEREVENT;
- userevent.code = PDL_GPS_UPDATE;
- userevent.data1 = NULL;
- userevent.data2 = NULL;
-
- event.type = SDL_USEREVENT;
- event.user = userevent;
-
- SDL_PushEvent(&event);
- }
-
- vehicle_webos_spp_init_read(priv, buffer_size - priv->buffer_pos - 1);
+ }
+
+ if (str != priv->buffer) {
+ size = priv->buffer + priv->buffer_pos - str;
+ memmove(priv->buffer, str, size + 1);
+ priv->buffer_pos = size;
+ dbg(lvl_debug,"now pos=%d buffer='%s'",
+ priv->buffer_pos, priv->buffer);
+ } else if (priv->buffer_pos == buffer_size - 1) {
+ dbg(lvl_error,"Overflow. Most likely wrong baud rate or no nmea protocol");
+ priv->buffer_pos = 0;
+ }
+ if (rc) {
+ SDL_Event event;
+ SDL_UserEvent userevent;
+
+ userevent.type = SDL_USEREVENT;
+ userevent.code = PDL_GPS_UPDATE;
+ userevent.data1 = NULL;
+ userevent.data2 = NULL;
+
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
+
+ SDL_PushEvent(&event);
+ }
+
+ vehicle_webos_spp_init_read(priv, buffer_size - priv->buffer_pos - 1);
}
-static void
-vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int length)
-{
- //PDL_Err err;
- char parameters[128];
-
- snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"dataLength\":%i}", priv->spp_instance_id, length);
- mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/read",
- parameters,
- (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_read,
- priv,
- PDL_FALSE
- );
-#if 0
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCall failed with (%d): (%s)\n", err, PDL_GetError());
- vehicle_webos_close(priv);
- return;
- }
-#endif
+static void vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int length) {
+ //PDL_Err err;
+ char parameters[128];
+
+ snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"dataLength\":%i}", priv->spp_instance_id, length);
+ mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/read",
+ parameters,
+ (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_read,
+ priv,
+ PDL_FALSE
+ );
}
-static void
-vehicle_webos_spp_handle_open(PDL_ServiceParameters *params, void *user)
-{
- struct vehicle_priv *priv = (struct vehicle_priv *)user;
+static void vehicle_webos_spp_handle_open(PDL_ServiceParameters *params, void *user) {
+ struct vehicle_priv *priv = (struct vehicle_priv *)user;
- if (!priv->buffer)
- priv->buffer = g_malloc(buffer_size);
-
- dbg(lvl_debug,"instanceId(%i)\n",priv->spp_instance_id);
+ if (!priv->buffer)
+ priv->buffer = g_malloc(buffer_size);
- priv->gps_type = GPS_TYPE_BT;
+ dbg(lvl_debug,"instanceId(%i)",priv->spp_instance_id);
- vehicle_webos_spp_init_read(priv, buffer_size-1);
+ priv->gps_type = GPS_TYPE_BT;
+
+ vehicle_webos_spp_init_read(priv, buffer_size-1);
}
-static void
-vehicle_webos_spp_notify(PDL_ServiceParameters *params, void *user)
-{
- struct vehicle_priv *priv = user;
-
- char notification[128];
- char parameters[128];
-
- const char *params_json = PDL_GetParamJson(params);
- dbg(lvl_info,"params_json(%s)\n", params_json);
-
- if (PDL_ParamExists(params, "errorText")) {
- PDL_GetParamString(params, "errorText", notification, sizeof(notification));
- dbg(lvl_error,"errorText(%s)\n",notification);
- return;
- }
-
- PDL_GetParamString(params, "notification", notification, sizeof(notification));
- notification[sizeof(notification)-1] = '\0';
-
- dbg(lvl_warning,"notification(%s) %i\n",notification,PDL_ParamExists(params, "notification"));
-
- if(strcmp(notification,"notifnservicenames") == 0) {
- int instance_id = PDL_GetParamInt(params, "instanceId");
-
- dbg(lvl_debug,"instanceId(%i)\n", instance_id);
-
- cJSON *root = cJSON_Parse(params_json);
- if (!root) {
- dbg(lvl_error,"parsing json failed\n");
- return;
- }
-
- cJSON *services = cJSON_GetObjectItem(root, "services");
-
- char *service_name = cJSON_GetArrayItem(services, 0)->valuestring;
-
- snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"servicename\":\"%s\"}",instance_id, service_name);
- mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/selectservice", parameters);
-
- cJSON_Delete(root);
- }
- else if(strcmp(notification,"notifnconnected") == 0) {
- if (PDL_GetParamInt(params,"error") == 0) {
- vehicle_webos_init_pdl_locationtracking(priv, 0);
-
- int instance_id = PDL_GetParamInt(params, "instanceId");
- priv->spp_instance_id = instance_id;
- snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", instance_id);
- mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/open",
- parameters,
- (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_open,
- priv,
- PDL_TRUE);
- }
- else {
- dbg(lvl_error,"notifnconnected error(%i)\n",PDL_GetParamInt(params,"error"));
- }
- }
- else if(strcmp(notification,"notifndisconnected") == 0) {
- priv->gps_type = GPS_TYPE_NONE;
- snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}",priv->spp_instance_id);
- mlPDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters);
- priv->spp_instance_id = 0;
- vehicle_webos_init_pdl_locationtracking(priv, 1);
- }
+static void vehicle_webos_spp_notify(PDL_ServiceParameters *params, void *user) {
+ struct vehicle_priv *priv = user;
+ char notification[128];
+ char parameters[128];
+
+ const char *params_json = PDL_GetParamJson(params);
+ dbg(lvl_info,"params_json(%s)", params_json);
+
+ if (PDL_ParamExists(params, "errorText")) {
+ PDL_GetParamString(params, "errorText", notification, sizeof(notification));
+ dbg(lvl_error,"errorText(%s)",notification);
+ return;
+ }
+
+ PDL_GetParamString(params, "notification", notification, sizeof(notification));
+ notification[sizeof(notification)-1] = '\0';
+
+ dbg(lvl_warning,"notification(%s) %i",notification,PDL_ParamExists(params, "notification"));
+
+ if(strcmp(notification,"notifnservicenames") == 0) {
+ int instance_id = PDL_GetParamInt(params, "instanceId");
+
+ dbg(lvl_debug,"instanceId(%i)", instance_id);
+
+ cJSON *root = cJSON_Parse(params_json);
+ if (!root) {
+ dbg(lvl_error,"parsing json failed");
+ return;
+ }
+
+ cJSON *services = cJSON_GetObjectItem(root, "services");
+
+ char *service_name = cJSON_GetArrayItem(services, 0)->valuestring;
+
+ snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"servicename\":\"%s\"}",instance_id, service_name);
+ mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/selectservice", parameters);
+
+ cJSON_Delete(root);
+ } else if(strcmp(notification,"notifnconnected") == 0) {
+ if (PDL_GetParamInt(params,"error") == 0) {
+ vehicle_webos_init_pdl_locationtracking(priv, 0);
+
+ int instance_id = PDL_GetParamInt(params, "instanceId");
+ priv->spp_instance_id = instance_id;
+ snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", instance_id);
+ mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/open",
+ parameters,
+ (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_open,
+ priv,
+ PDL_TRUE);
+ } else {
+ dbg(lvl_error,"notifnconnected error(%i)",PDL_GetParamInt(params,"error"));
+ }
+ } else if(strcmp(notification,"notifndisconnected") == 0) {
+ priv->gps_type = GPS_TYPE_NONE;
+ snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}",priv->spp_instance_id);
+ mlPDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters);
+ priv->spp_instance_id = 0;
+ vehicle_webos_init_pdl_locationtracking(priv, 1);
+ }
-}
-static void
-vehicle_webos_init_bt_gps(struct vehicle_priv *priv, char *addr)
-{
- char parameters[128];
-
- dbg(lvl_debug,"subscribeNotifications\n");
- mlPDL_ServiceCallWithCallback("palm://com.palm.bluetooth/spp/subscribenotifications",
- "{\"subscribe\":true}",
- (PDL_ServiceCallbackFunc)vehicle_webos_spp_notify,
- priv,
- PDL_FALSE);
-#if 0
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError());
- vehicle_webos_close(priv);
- return;
- }
-#endif
-
- snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", addr);
- mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/connect", parameters);
-#if 0
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCall failed with (%d): (%s)\n", err, PDL_GetError());
- vehicle_webos_close(priv);
- return;
- }
-#endif
-
- priv->spp_address = addr;
}
-static void
-vehicle_webos_bt_gap_callback(PDL_ServiceParameters *params, void *param)
-{
- const char *params_json;
- struct vehicle_priv *priv = (struct vehicle_priv *)param;
- char *device_addr = NULL;
- cJSON *root;
-
- dbg(lvl_debug,"enter\n");
-
- PDL_Err err;
- err = PDL_GetParamInt(params, "errorCode");
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"BT GAP Callback errorCode %d\n", err);
- return /*PDL_EOTHER*/;
- }
-
- params_json = PDL_GetParamJson(params);
- dbg(lvl_info,"params_json(%s)\n",params_json);
-
- root = cJSON_Parse(params_json);
- if (!root) {
- dbg(lvl_error,"parsing json failed\n");
- return;
- }
-
- cJSON *trusted_devices = cJSON_GetObjectItem(root, "trusteddevices");
-
- unsigned int i,c = cJSON_GetArraySize(trusted_devices);
- dbg(lvl_debug, "trusted_devices(%i)\n",c);
- for(i=0; i < c && !device_addr; i++) {
- cJSON *device = cJSON_GetArrayItem(trusted_devices,i);
- char *name = cJSON_GetObjectItem(device, "name")->valuestring;
- char *address = cJSON_GetObjectItem(device, "address")->valuestring;
- char *status = cJSON_GetObjectItem(device, "status")->valuestring;
-
- dbg(lvl_debug,"i(%i) name(%s) address(%s) status(%s)\n",i,name,address,status);
-
- if (/*strncmp(status, "connected",9) == 0 && */strstr(name, "GPS") != NULL) {
- dbg(lvl_debug,"choose name(%s) address(%s)\n",name,address);
- device_addr = g_strdup(address);
- break;
- }
- }
-
- cJSON_Delete(root);
-
- if (device_addr) {
- vehicle_webos_init_bt_gps(priv, device_addr);
- }
-
- g_free(device_addr);
+static void vehicle_webos_init_bt_gps(struct vehicle_priv *priv, char *addr) {
+ char parameters[128];
+
+ dbg(lvl_debug,"subscribeNotifications");
+ mlPDL_ServiceCallWithCallback("palm://com.palm.bluetooth/spp/subscribenotifications",
+ "{\"subscribe\":true}",
+ (PDL_ServiceCallbackFunc)vehicle_webos_spp_notify,
+ priv,
+ PDL_FALSE);
+
+ snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", addr);
+ mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/connect", parameters);
+
+ priv->spp_address = addr;
}
-int
-vehicle_webos_bt_open(struct vehicle_priv *priv)
-{
- // Try to connect to BT GPS, or use PDL method
-
- dbg(lvl_debug,"enter\n");
-
- PDL_Err err;
- err = PDL_ServiceCallWithCallback("palm://com.palm.bluetooth/gap/gettrusteddevices",
- "{}",
- (PDL_ServiceCallbackFunc)vehicle_webos_bt_gap_callback,
- priv,
- PDL_TRUE);
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError());
- vehicle_webos_close(priv);
- return 0;
- }
- return 1;
+static void vehicle_webos_bt_gap_callback(PDL_ServiceParameters *params, void *param) {
+ const char *params_json;
+ struct vehicle_priv *priv = (struct vehicle_priv *)param;
+ char *device_addr = NULL;
+ cJSON *root;
+
+ dbg(lvl_debug,"enter");
+
+ PDL_Err err;
+ err = PDL_GetParamInt(params, "errorCode");
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"BT GAP Callback errorCode %d", err);
+ return /*PDL_EOTHER*/;
+ }
+
+ params_json = PDL_GetParamJson(params);
+ dbg(lvl_info,"params_json(%s)",params_json);
+
+ root = cJSON_Parse(params_json);
+ if (!root) {
+ dbg(lvl_error,"parsing json failed");
+ return;
+ }
+
+ cJSON *trusted_devices = cJSON_GetObjectItem(root, "trusteddevices");
+
+ unsigned int i,c = cJSON_GetArraySize(trusted_devices);
+ dbg(lvl_debug, "trusted_devices(%i)",c);
+ for(i=0; i < c && !device_addr; i++) {
+ cJSON *device = cJSON_GetArrayItem(trusted_devices,i);
+ char *name = cJSON_GetObjectItem(device, "name")->valuestring;
+ char *address = cJSON_GetObjectItem(device, "address")->valuestring;
+ char *status = cJSON_GetObjectItem(device, "status")->valuestring;
+
+ dbg(lvl_debug,"i(%i) name(%s) address(%s) status(%s)",i,name,address,status);
+
+ if (/*strncmp(status, "connected",9) == 0 && */strstr(name, "GPS") != NULL) {
+ dbg(lvl_debug,"choose name(%s) address(%s)",name,address);
+ device_addr = g_strdup(address);
+ break;
+ }
+ }
+
+ cJSON_Delete(root);
+
+ if (device_addr) {
+ vehicle_webos_init_bt_gps(priv, device_addr);
+ }
+
+ g_free(device_addr);
}
-void
-vehicle_webos_bt_close(struct vehicle_priv *priv)
-{
- dbg(lvl_debug,"XXX\n");
- char parameters[128];
- if (priv->spp_instance_id) {
- snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", priv->spp_instance_id);
- PDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters);
- }
- if (priv->spp_address) {
- snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", priv->spp_address);
- PDL_ServiceCall("palm://com.palm.bluetooth.spp/disconnect", parameters);
- g_free(priv->spp_address);
- priv->spp_address = NULL;
- }
- //g_free(priv->buffer);
- //priv->buffer = NULL;
- // g_free(priv->nmea_data);
- // priv->nmea_data = NULL;
- // g_free(priv->nmea_data_buf);
- // priv->nmea_data_buf = NULL;
+int vehicle_webos_bt_open(struct vehicle_priv *priv) {
+ // Try to connect to BT GPS, or use PDL method
+
+ dbg(lvl_debug,"enter");
+
+ PDL_Err err;
+ err = PDL_ServiceCallWithCallback("palm://com.palm.bluetooth/gap/gettrusteddevices",
+ "{}",
+ (PDL_ServiceCallbackFunc)vehicle_webos_bt_gap_callback,
+ priv,
+ PDL_TRUE);
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)", err, PDL_GetError());
+ vehicle_webos_close(priv);
+ return 0;
+ }
+ return 1;
}
+void vehicle_webos_bt_close(struct vehicle_priv *priv) {
+ dbg(lvl_debug,"XXX");
+ char parameters[128];
+ if (priv->spp_instance_id) {
+ snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", priv->spp_instance_id);
+ PDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters);
+ }
+ if (priv->spp_address) {
+ snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", priv->spp_address);
+ PDL_ServiceCall("palm://com.palm.bluetooth.spp/disconnect", parameters);
+ g_free(priv->spp_address);
+ priv->spp_address = NULL;
+ }
+ //g_free(priv->buffer);
+ //priv->buffer = NULL;
+ // g_free(priv->nmea_data);
+ // priv->nmea_data = NULL;
+ // g_free(priv->nmea_data_buf);
+ // priv->nmea_data_buf = NULL;
+}
diff --git a/navit/vehicle/webos/cJSON.c b/navit/vehicle/webos/cJSON.c
index 19d3151e2..9026a224f 100644
--- a/navit/vehicle/webos/cJSON.c
+++ b/navit/vehicle/webos/cJSON.c
@@ -34,208 +34,260 @@
static const char *ep;
-const char *cJSON_GetErrorPtr() {return ep;}
+const char *cJSON_GetErrorPtr() {
+ return ep;
+}
-static int cJSON_strcasecmp(const char *s1,const char *s2)
-{
- if (!s1) return (s1==s2)?0:1;if (!s2) return 1;
- for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0;
- return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2);
+static int cJSON_strcasecmp(const char *s1,const char *s2) {
+ if (!s1) return (s1==s2)?0:1;
+ if (!s2) return 1;
+ for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0;
+ return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2);
}
static void *(*cJSON_malloc)(size_t sz) = malloc;
static void (*cJSON_free)(void *ptr) = free;
-static char* cJSON_strdup(const char* str)
-{
- size_t len;
- char* copy;
+static char* cJSON_strdup(const char* str) {
+ size_t len;
+ char* copy;
- len = strlen(str) + 1;
- if (!(copy = (char*)cJSON_malloc(len))) return 0;
- memcpy(copy,str,len);
- return copy;
+ len = strlen(str) + 1;
+ if (!(copy = (char*)cJSON_malloc(len))) return 0;
+ memcpy(copy,str,len);
+ return copy;
}
-void cJSON_InitHooks(cJSON_Hooks* hooks)
-{
+void cJSON_InitHooks(cJSON_Hooks* hooks) {
if (!hooks) { /* Reset hooks */
cJSON_malloc = malloc;
cJSON_free = free;
return;
}
- cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc;
- cJSON_free = (hooks->free_fn)?hooks->free_fn:free;
+ cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc;
+ cJSON_free = (hooks->free_fn)?hooks->free_fn:free;
}
/* Internal constructor. */
-static cJSON *cJSON_New_Item(void)
-{
- cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON));
- if (node) memset(node,0,sizeof(cJSON));
- return node;
+static cJSON *cJSON_New_Item(void) {
+ cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON));
+ if (node) memset(node,0,sizeof(cJSON));
+ return node;
}
/* Delete a cJSON structure. */
-void cJSON_Delete(cJSON *c)
-{
- cJSON *next;
- while (c)
- {
- next=c->next;
- if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child);
- if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring);
- if (c->string) cJSON_free(c->string);
- cJSON_free(c);
- c=next;
- }
+void cJSON_Delete(cJSON *c) {
+ cJSON *next;
+ while (c) {
+ next=c->next;
+ if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child);
+ if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring);
+ if (c->string) cJSON_free(c->string);
+ cJSON_free(c);
+ c=next;
+ }
}
/* Parse the input text to generate a number, and populate the result into item. */
-static const char *parse_number(cJSON *item,const char *num)
-{
- double n=0,sign=1,scale=0;int subscale=0,signsubscale=1;
-
- /* Could use sscanf for this? */
- if (*num=='-') sign=-1,num++; /* Has sign? */
- if (*num=='0') num++; /* is zero */
- if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */
- if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */
- if (*num=='e' || *num=='E') /* Exponent? */
- { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */
- while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */
- }
-
- n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */
-
- item->valuedouble=n;
- item->valueint=(int)n;
- item->type=cJSON_Number;
- return num;
+static const char *parse_number(cJSON *item,const char *num) {
+ double n=0,sign=1,scale=0;
+ int subscale=0,signsubscale=1;
+
+ /* Could use sscanf for this? */
+ if (*num=='-') sign=-1,num++; /* Has sign? */
+ if (*num=='0') num++; /* is zero */
+ if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0');
+ while (*num>='0' && *num<='9'); /* Number? */
+ if (*num=='.' && num[1]>='0' && num[1]<='9') {
+ num++; /* Fractional part? */
+ do n=(n*10.0)+(*num++ -'0'),scale--;
+ while (*num>='0' && *num<='9');
+ }
+ if (*num=='e' || *num=='E') { /* Exponent? */
+ num++;
+ if (*num=='+') num++;
+ else if (*num=='-') signsubscale=-1,num++; /* With sign? */
+ while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */
+ }
+
+ n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */
+
+ item->valuedouble=n;
+ item->valueint=(int)n;
+ item->type=cJSON_Number;
+ return num;
}
/* Render the number nicely from the given item into a string. */
-static char *print_number(cJSON *item)
-{
- char *str;
- double d=item->valuedouble;
- if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN)
- {
- str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */
- if (str) sprintf(str,"%d",item->valueint);
- }
- else
- {
- str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */
- if (str)
- {
- if (fabs(floor(d)-d)<=DBL_EPSILON) sprintf(str,"%.0f",d);
- else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d);
- else sprintf(str,"%f",d);
- }
- }
- return str;
+static char *print_number(cJSON *item) {
+ char *str;
+ double d=item->valuedouble;
+ if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) {
+ str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */
+ if (str) sprintf(str,"%d",item->valueint);
+ } else {
+ str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */
+ if (str) {
+ if (fabs(floor(d)-d)<=DBL_EPSILON) sprintf(str,"%.0f",d);
+ else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d);
+ else sprintf(str,"%f",d);
+ }
+ }
+ return str;
}
/* Parse the input text into an unescaped cstring, and populate item. */
static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
-static const char *parse_string(cJSON *item,const char *str)
-{
- const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2;
- if (*str!='\"') {ep=str;return 0;} /* not a string! */
-
- while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */
-
- out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */
- if (!out) return 0;
-
- ptr=str+1;ptr2=out;
- while (*ptr!='\"' && *ptr)
- {
- if (*ptr!='\\') *ptr2++=*ptr++;
- else
- {
- ptr++;
- switch (*ptr)
- {
- case 'b': *ptr2++='\b'; break;
- case 'f': *ptr2++='\f'; break;
- case 'n': *ptr2++='\n'; break;
- case 'r': *ptr2++='\r'; break;
- case 't': *ptr2++='\t'; break;
- case 'u': /* transcode utf16 to utf8. */
- sscanf(ptr+1,"%4x",&uc);ptr+=4; /* get the unicode char. */
-
- if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid.
-
- if (uc>=0xD800 && uc<=0xDBFF) // UTF16 surrogate pairs.
- {
- if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate.
- sscanf(ptr+3,"%4x",&uc2);ptr+=6;
- if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate.
- uc=0x10000 | ((uc&0x3FF)<<10) | (uc2&0x3FF);
- }
-
- len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len;
-
- switch (len) {
- case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
- case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
- case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
- case 1: *--ptr2 =(uc | firstByteMark[len]);
- }
- ptr2+=len;
- break;
- default: *ptr2++=*ptr; break;
- }
- ptr++;
- }
- }
- *ptr2=0;
- if (*ptr=='\"') ptr++;
- item->valuestring=out;
- item->type=cJSON_String;
- return ptr;
+static const char *parse_string(cJSON *item,const char *str) {
+ const char *ptr=str+1;
+ char *ptr2;
+ char *out;
+ int len=0;
+ unsigned uc,uc2;
+ if (*str!='\"') {
+ ep=str; /* not a string! */
+ return 0;
+ }
+
+ while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */
+
+ out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */
+ if (!out) return 0;
+
+ ptr=str+1;
+ ptr2=out;
+ while (*ptr!='\"' && *ptr) {
+ if (*ptr!='\\') *ptr2++=*ptr++;
+ else {
+ ptr++;
+ switch (*ptr) {
+ case 'b':
+ *ptr2++='\b';
+ break;
+ case 'f':
+ *ptr2++='\f';
+ break;
+ case 'n':
+ *ptr2++='\n';
+ break;
+ case 'r':
+ *ptr2++='\r';
+ break;
+ case 't':
+ *ptr2++='\t';
+ break;
+ case 'u': /* transcode utf16 to utf8. */
+ sscanf(ptr+1,"%4x",&uc);
+ ptr+=4; /* get the unicode char. */
+
+ if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid.
+
+ if (uc>=0xD800 && uc<=0xDBFF) { // UTF16 surrogate pairs.
+ if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate.
+ sscanf(ptr+3,"%4x",&uc2);
+ ptr+=6;
+ if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate.
+ uc=0x10000 | ((uc&0x3FF)<<10) | (uc2&0x3FF);
+ }
+
+ len=4;
+ if (uc<0x80) len=1;
+ else if (uc<0x800) len=2;
+ else if (uc<0x10000) len=3;
+ ptr2+=len;
+
+ switch (len) {
+ case 4:
+ *--ptr2 =((uc | 0x80) & 0xBF);
+ uc >>= 6;
+ case 3:
+ *--ptr2 =((uc | 0x80) & 0xBF);
+ uc >>= 6;
+ case 2:
+ *--ptr2 =((uc | 0x80) & 0xBF);
+ uc >>= 6;
+ case 1:
+ *--ptr2 =(uc | firstByteMark[len]);
+ }
+ ptr2+=len;
+ break;
+ default:
+ *ptr2++=*ptr;
+ break;
+ }
+ ptr++;
+ }
+ }
+ *ptr2=0;
+ if (*ptr=='\"') ptr++;
+ item->valuestring=out;
+ item->type=cJSON_String;
+ return ptr;
}
/* Render the cstring provided to an escaped version that can be printed. */
-static char *print_string_ptr(const char *str)
-{
- const char *ptr;char *ptr2,*out;int len=0;unsigned char token;
-
- if (!str) return cJSON_strdup("");
- ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;}
-
- out=(char*)cJSON_malloc(len+3);
- if (!out) return 0;
-
- ptr2=out;ptr=str;
- *ptr2++='\"';
- while (*ptr)
- {
- if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++;
- else
- {
- *ptr2++='\\';
- switch (token=*ptr++)
- {
- case '\\': *ptr2++='\\'; break;
- case '\"': *ptr2++='\"'; break;
- case '\b': *ptr2++='b'; break;
- case '\f': *ptr2++='f'; break;
- case '\n': *ptr2++='n'; break;
- case '\r': *ptr2++='r'; break;
- case '\t': *ptr2++='t'; break;
- default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */
- }
- }
- }
- *ptr2++='\"';*ptr2++=0;
- return out;
+static char *print_string_ptr(const char *str) {
+ const char *ptr;
+ char *ptr2,*out;
+ int len=0;
+ unsigned char token;
+
+ if (!str) return cJSON_strdup("");
+ ptr=str;
+ while ((token=*ptr) && ++len) {
+ if (strchr("\"\\\b\f\n\r\t",token)) len++;
+ else if (token<32) len+=5;
+ ptr++;
+ }
+
+ out=(char*)cJSON_malloc(len+3);
+ if (!out) return 0;
+
+ ptr2=out;
+ ptr=str;
+ *ptr2++='\"';
+ while (*ptr) {
+ if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++;
+ else {
+ *ptr2++='\\';
+ switch (token=*ptr++) {
+ case '\\':
+ *ptr2++='\\';
+ break;
+ case '\"':
+ *ptr2++='\"';
+ break;
+ case '\b':
+ *ptr2++='b';
+ break;
+ case '\f':
+ *ptr2++='f';
+ break;
+ case '\n':
+ *ptr2++='n';
+ break;
+ case '\r':
+ *ptr2++='r';
+ break;
+ case '\t':
+ *ptr2++='t';
+ break;
+ default:
+ sprintf(ptr2,"u%04x",token);
+ ptr2+=5;
+ break; /* escape and print */
+ }
+ }
+ }
+ *ptr2++='\"';
+ *ptr2++=0;
+ return out;
}
/* Invote print_string_ptr (which is useful) on an item. */
-static char *print_string(cJSON *item) {return print_string_ptr(item->valuestring);}
+static char *print_string(cJSON *item) {
+ return print_string_ptr(item->valuestring);
+}
/* Predeclare these prototypes. */
static const char *parse_value(cJSON *item,const char *value);
@@ -246,269 +298,502 @@ static const char *parse_object(cJSON *item,const char *value);
static char *print_object(cJSON *item,int depth,int fmt);
/* Utility to jump whitespace and cr/lf */
-static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;}
+static const char *skip(const char *in) {
+ while (in && *in && (unsigned char)*in<=32) in++;
+ return in;
+}
/* Parse an object - create a new root, and populate. */
-cJSON *cJSON_Parse(const char *value)
-{
- cJSON *c=cJSON_New_Item();
- ep=0;
- if (!c) return 0; /* memory fail */
-
- if (!parse_value(c,skip(value))) {cJSON_Delete(c);return 0;}
- return c;
+cJSON *cJSON_Parse(const char *value) {
+ cJSON *c=cJSON_New_Item();
+ ep=0;
+ if (!c) return 0; /* memory fail */
+
+ if (!parse_value(c,skip(value))) {
+ cJSON_Delete(c);
+ return 0;
+ }
+ return c;
}
/* Render a cJSON item/entity/structure to text. */
-char *cJSON_Print(cJSON *item) {return print_value(item,0,1);}
-char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0);}
+char *cJSON_Print(cJSON *item) {
+ return print_value(item,0,1);
+}
+char *cJSON_PrintUnformatted(cJSON *item) {
+ return print_value(item,0,0);
+}
/* Parser core - when encountering text, process appropriately. */
-static const char *parse_value(cJSON *item,const char *value)
-{
- if (!value) return 0; /* Fail on null. */
- if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; }
- if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; }
- if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; }
- if (*value=='\"') { return parse_string(item,value); }
- if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); }
- if (*value=='[') { return parse_array(item,value); }
- if (*value=='{') { return parse_object(item,value); }
+static const char *parse_value(cJSON *item,const char *value) {
+ if (!value) return 0; /* Fail on null. */
+ if (!strncmp(value,"null",4)) {
+ item->type=cJSON_NULL;
+ return value+4;
+ }
+ if (!strncmp(value,"false",5)) {
+ item->type=cJSON_False;
+ return value+5;
+ }
+ if (!strncmp(value,"true",4)) {
+ item->type=cJSON_True;
+ item->valueint=1;
+ return value+4;
+ }
+ if (*value=='\"') {
+ return parse_string(item,value);
+ }
+ if (*value=='-' || (*value>='0' && *value<='9')) {
+ return parse_number(item,value);
+ }
+ if (*value=='[') {
+ return parse_array(item,value);
+ }
+ if (*value=='{') {
+ return parse_object(item,value);
+ }
- ep=value;return 0; /* failure. */
+ ep=value;
+ return 0; /* failure. */
}
/* Render a value to text. */
-static char *print_value(cJSON *item,int depth,int fmt)
-{
- char *out=0;
- if (!item) return 0;
- switch ((item->type)&255)
- {
- case cJSON_NULL: out=cJSON_strdup("null"); break;
- case cJSON_False: out=cJSON_strdup("false");break;
- case cJSON_True: out=cJSON_strdup("true"); break;
- case cJSON_Number: out=print_number(item);break;
- case cJSON_String: out=print_string(item);break;
- case cJSON_Array: out=print_array(item,depth,fmt);break;
- case cJSON_Object: out=print_object(item,depth,fmt);break;
- }
- return out;
+static char *print_value(cJSON *item,int depth,int fmt) {
+ char *out=0;
+ if (!item) return 0;
+ switch ((item->type)&255) {
+ case cJSON_NULL:
+ out=cJSON_strdup("null");
+ break;
+ case cJSON_False:
+ out=cJSON_strdup("false");
+ break;
+ case cJSON_True:
+ out=cJSON_strdup("true");
+ break;
+ case cJSON_Number:
+ out=print_number(item);
+ break;
+ case cJSON_String:
+ out=print_string(item);
+ break;
+ case cJSON_Array:
+ out=print_array(item,depth,fmt);
+ break;
+ case cJSON_Object:
+ out=print_object(item,depth,fmt);
+ break;
+ }
+ return out;
}
/* Build an array from input text. */
-static const char *parse_array(cJSON *item,const char *value)
-{
- cJSON *child;
- if (*value!='[') {ep=value;return 0;} /* not an array! */
-
- item->type=cJSON_Array;
- value=skip(value+1);
- if (*value==']') return value+1; /* empty array. */
-
- item->child=child=cJSON_New_Item();
- if (!item->child) return 0; /* memory fail */
- value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */
- if (!value) return 0;
+static const char *parse_array(cJSON *item,const char *value) {
+ cJSON *child;
+ if (*value!='[') {
+ ep=value; /* not an array! */
+ return 0;
+ }
- while (*value==',')
- {
- cJSON *new_item;
- if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */
- child->next=new_item;new_item->prev=child;child=new_item;
- value=skip(parse_value(child,skip(value+1)));
- if (!value) return 0; /* memory fail */
- }
+ item->type=cJSON_Array;
+ value=skip(value+1);
+ if (*value==']') return value+1; /* empty array. */
+
+ item->child=child=cJSON_New_Item();
+ if (!item->child) return 0; /* memory fail */
+ value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */
+ if (!value) return 0;
+
+ while (*value==',') {
+ cJSON *new_item;
+ if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */
+ child->next=new_item;
+ new_item->prev=child;
+ child=new_item;
+ value=skip(parse_value(child,skip(value+1)));
+ if (!value) return 0; /* memory fail */
+ }
- if (*value==']') return value+1; /* end of array */
- ep=value;return 0; /* malformed. */
+ if (*value==']') return value+1; /* end of array */
+ ep=value;
+ return 0; /* malformed. */
}
/* Render an array to text */
-static char *print_array(cJSON *item,int depth,int fmt)
-{
- char **entries;
- char *out=0,*ptr,*ret;int len=5;
- cJSON *child=item->child;
- int numentries=0,i=0,fail=0;
-
- /* How many entries in the array? */
- while (child) numentries++,child=child->next;
- /* Allocate an array to hold the values for each */
- entries=(char**)cJSON_malloc(numentries*sizeof(char*));
- if (!entries) return 0;
- memset(entries,0,numentries*sizeof(char*));
- /* Retrieve all the results: */
- child=item->child;
- while (child && !fail)
- {
- ret=print_value(child,depth+1,fmt);
- entries[i++]=ret;
- if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;
- child=child->next;
- }
-
- /* If we didn't fail, try to malloc the output string */
- if (!fail) out=(char*)cJSON_malloc(len);
- /* If that fails, we fail. */
- if (!out) fail=1;
-
- /* Handle failure. */
- if (fail)
- {
- for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
- cJSON_free(entries);
- return 0;
- }
-
- /* Compose the output array. */
- *out='[';
- ptr=out+1;*ptr=0;
- for (i=0;i<numentries;i++)
- {
- strcpy(ptr,entries[i]);ptr+=strlen(entries[i]);
- if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}
- cJSON_free(entries[i]);
- }
- cJSON_free(entries);
- *ptr++=']';*ptr++=0;
- return out;
+static char *print_array(cJSON *item,int depth,int fmt) {
+ char **entries;
+ char *out=0,*ptr,*ret;
+ int len=5;
+ cJSON *child=item->child;
+ int numentries=0,i=0,fail=0;
+
+ /* How many entries in the array? */
+ while (child) numentries++,child=child->next;
+ /* Allocate an array to hold the values for each */
+ entries=(char**)cJSON_malloc(numentries*sizeof(char*));
+ if (!entries) return 0;
+ memset(entries,0,numentries*sizeof(char*));
+ /* Retrieve all the results: */
+ child=item->child;
+ while (child && !fail) {
+ ret=print_value(child,depth+1,fmt);
+ entries[i++]=ret;
+ if (ret) len+=strlen(ret)+2+(fmt?1:0);
+ else fail=1;
+ child=child->next;
+ }
+
+ /* If we didn't fail, try to malloc the output string */
+ if (!fail) out=(char*)cJSON_malloc(len);
+ /* If that fails, we fail. */
+ if (!out) fail=1;
+
+ /* Handle failure. */
+ if (fail) {
+ for (i=0; i<numentries; i++) if (entries[i]) cJSON_free(entries[i]);
+ cJSON_free(entries);
+ return 0;
+ }
+
+ /* Compose the output array. */
+ *out='[';
+ ptr=out+1;
+ *ptr=0;
+ for (i=0; i<numentries; i++) {
+ strcpy(ptr,entries[i]);
+ ptr+=strlen(entries[i]);
+ if (i!=numentries-1) {
+ *ptr++=',';
+ if(fmt)*ptr++=' ';
+ *ptr=0;
+ }
+ cJSON_free(entries[i]);
+ }
+ cJSON_free(entries);
+ *ptr++=']';
+ *ptr++=0;
+ return out;
}
/* Build an object from the text. */
-static const char *parse_object(cJSON *item,const char *value)
-{
- cJSON *child;
- if (*value!='{') {ep=value;return 0;} /* not an object! */
-
- item->type=cJSON_Object;
- value=skip(value+1);
- if (*value=='}') return value+1; /* empty array. */
-
- item->child=child=cJSON_New_Item();
- if (!item->child) return 0;
- value=skip(parse_string(child,skip(value)));
- if (!value) return 0;
- child->string=child->valuestring;child->valuestring=0;
- if (*value!=':') {ep=value;return 0;} /* fail! */
- value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */
- if (!value) return 0;
-
- while (*value==',')
- {
- cJSON *new_item;
- if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */
- child->next=new_item;new_item->prev=child;child=new_item;
- value=skip(parse_string(child,skip(value+1)));
- if (!value) return 0;
- child->string=child->valuestring;child->valuestring=0;
- if (*value!=':') {ep=value;return 0;} /* fail! */
- value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */
- if (!value) return 0;
- }
-
- if (*value=='}') return value+1; /* end of array */
- ep=value;return 0; /* malformed. */
+static const char *parse_object(cJSON *item,const char *value) {
+ cJSON *child;
+ if (*value!='{') {
+ ep=value; /* not an object! */
+ return 0;
+ }
+
+ item->type=cJSON_Object;
+ value=skip(value+1);
+ if (*value=='}') return value+1; /* empty array. */
+
+ item->child=child=cJSON_New_Item();
+ if (!item->child) return 0;
+ value=skip(parse_string(child,skip(value)));
+ if (!value) return 0;
+ child->string=child->valuestring;
+ child->valuestring=0;
+ if (*value!=':') {
+ ep=value; /* fail! */
+ return 0;
+ }
+ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */
+ if (!value) return 0;
+
+ while (*value==',') {
+ cJSON *new_item;
+ if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */
+ child->next=new_item;
+ new_item->prev=child;
+ child=new_item;
+ value=skip(parse_string(child,skip(value+1)));
+ if (!value) return 0;
+ child->string=child->valuestring;
+ child->valuestring=0;
+ if (*value!=':') {
+ ep=value; /* fail! */
+ return 0;
+ }
+ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */
+ if (!value) return 0;
+ }
+
+ if (*value=='}') return value+1; /* end of array */
+ ep=value;
+ return 0; /* malformed. */
}
/* Render an object to text. */
-static char *print_object(cJSON *item,int depth,int fmt)
-{
- char **entries=0,**names=0;
- char *out=0,*ptr,*ret,*str;int len=7,i=0,j;
- cJSON *child=item->child;
- int numentries=0,fail=0;
- /* Count the number of entries. */
- while (child) numentries++,child=child->next;
- /* Allocate space for the names and the objects */
- entries=(char**)cJSON_malloc(numentries*sizeof(char*));
- if (!entries) return 0;
- names=(char**)cJSON_malloc(numentries*sizeof(char*));
- if (!names) {cJSON_free(entries);return 0;}
- memset(entries,0,sizeof(char*)*numentries);
- memset(names,0,sizeof(char*)*numentries);
-
- /* Collect all the results into our arrays: */
- child=item->child;depth++;if (fmt) len+=depth;
- while (child)
- {
- names[i]=str=print_string_ptr(child->string);
- entries[i++]=ret=print_value(child,depth,fmt);
- if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1;
- child=child->next;
- }
-
- /* Try to allocate the output string */
- if (!fail) out=(char*)cJSON_malloc(len);
- if (!out) fail=1;
-
- /* Handle failure */
- if (fail)
- {
- for (i=0;i<numentries;i++) {if (names[i]) cJSON_free(names[i]);if (entries[i]) cJSON_free(entries[i]);}
- cJSON_free(names);cJSON_free(entries);
- return 0;
- }
-
- /* Compose the output: */
- *out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0;
- for (i=0;i<numentries;i++)
- {
- if (fmt) for (j=0;j<depth;j++) *ptr++='\t';
- strcpy(ptr,names[i]);ptr+=strlen(names[i]);
- *ptr++=':';if (fmt) *ptr++='\t';
- strcpy(ptr,entries[i]);ptr+=strlen(entries[i]);
- if (i!=numentries-1) *ptr++=',';
- if (fmt) *ptr++='\n';*ptr=0;
- cJSON_free(names[i]);cJSON_free(entries[i]);
- }
-
- cJSON_free(names);cJSON_free(entries);
- if (fmt) for (i=0;i<depth-1;i++) *ptr++='\t';
- *ptr++='}';*ptr++=0;
- return out;
+static char *print_object(cJSON *item,int depth,int fmt) {
+ char **entries=0,**names=0;
+ char *out=0,*ptr,*ret,*str;
+ int len=7,i=0,j;
+ cJSON *child=item->child;
+ int numentries=0,fail=0;
+ /* Count the number of entries. */
+ while (child) numentries++,child=child->next;
+ /* Allocate space for the names and the objects */
+ entries=(char**)cJSON_malloc(numentries*sizeof(char*));
+ if (!entries) return 0;
+ names=(char**)cJSON_malloc(numentries*sizeof(char*));
+ if (!names) {
+ cJSON_free(entries);
+ return 0;
+ }
+ memset(entries,0,sizeof(char*)*numentries);
+ memset(names,0,sizeof(char*)*numentries);
+
+ /* Collect all the results into our arrays: */
+ child=item->child;
+ depth++;
+ if (fmt) len+=depth;
+ while (child) {
+ names[i]=str=print_string_ptr(child->string);
+ entries[i++]=ret=print_value(child,depth,fmt);
+ if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0);
+ else fail=1;
+ child=child->next;
+ }
+
+ /* Try to allocate the output string */
+ if (!fail) out=(char*)cJSON_malloc(len);
+ if (!out) fail=1;
+
+ /* Handle failure */
+ if (fail) {
+ for (i=0; i<numentries; i++) {
+ if (names[i]) cJSON_free(names[i]);
+ if (entries[i]) cJSON_free(entries[i]);
+ }
+ cJSON_free(names);
+ cJSON_free(entries);
+ return 0;
+ }
+
+ /* Compose the output: */
+ *out='{';
+ ptr=out+1;
+ if (fmt)*ptr++='\n';
+ *ptr=0;
+ for (i=0; i<numentries; i++) {
+ if (fmt) for (j=0; j<depth; j++) *ptr++='\t';
+ strcpy(ptr,names[i]);
+ ptr+=strlen(names[i]);
+ *ptr++=':';
+ if (fmt) *ptr++='\t';
+ strcpy(ptr,entries[i]);
+ ptr+=strlen(entries[i]);
+ if (i!=numentries-1) *ptr++=',';
+ if (fmt) *ptr++='\n';
+ *ptr=0;
+ cJSON_free(names[i]);
+ cJSON_free(entries[i]);
+ }
+
+ cJSON_free(names);
+ cJSON_free(entries);
+ if (fmt) for (i=0; i<depth-1; i++) *ptr++='\t';
+ *ptr++='}';
+ *ptr++=0;
+ return out;
}
/* Get Array size/item / object item. */
-int cJSON_GetArraySize(cJSON *array) {cJSON *c=array->child;int i=0;while(c)i++,c=c->next;return i;}
-cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;}
-cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;}
+int cJSON_GetArraySize(cJSON *array) {
+ cJSON *c=array->child;
+ int i=0;
+ while(c)i++,c=c->next;
+ return i;
+}
+cJSON *cJSON_GetArrayItem(cJSON *array,int item) {
+ cJSON *c=array->child;
+ while (c && item>0) item--,c=c->next;
+ return c;
+}
+cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {
+ cJSON *c=object->child;
+ while (c && cJSON_strcasecmp(c->string,string)) c=c->next;
+ return c;
+}
/* Utility for array list handling. */
-static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;}
+static void suffix_object(cJSON *prev,cJSON *item) {
+ prev->next=item;
+ item->prev=prev;
+}
/* Utility for handling references. */
-static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;}
+static cJSON *create_reference(cJSON *item) {
+ cJSON *ref=cJSON_New_Item();
+ if (!ref) return 0;
+ memcpy(ref,item,sizeof(cJSON));
+ ref->string=0;
+ ref->type|=cJSON_IsReference;
+ ref->next=ref->prev=0;
+ return ref;
+}
/* Add item to array/object. */
-void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}}
-void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);}
-void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));}
-void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));}
+void cJSON_AddItemToArray(cJSON *array, cJSON *item) {
+ cJSON *c=array->child;
+ if (!item) return;
+ if (!c) {
+ array->child=item;
+ } else {
+ while (c && c->next) c=c->next;
+ suffix_object(c,item);
+ }
+}
+void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {
+ if (!item) return;
+ if (item->string) cJSON_free(item->string);
+ item->string=cJSON_strdup(string);
+ cJSON_AddItemToArray(object,item);
+}
+void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {
+ cJSON_AddItemToArray(array,create_reference(item));
+}
+void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {
+ cJSON_AddItemToObject(object,string,create_reference(item));
+}
-cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0;
- if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;}
-void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));}
-cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;}
-void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));}
+cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {
+ cJSON *c=array->child;
+ while (c && which>0) c=c->next,which--;
+ if (!c) return 0;
+ if (c->prev) c->prev->next=c->next;
+ if (c->next) c->next->prev=c->prev;
+ if (c==array->child) array->child=c->next;
+ c->prev=c->next=0;
+ return c;
+}
+void cJSON_DeleteItemFromArray(cJSON *array,int which) {
+ cJSON_Delete(cJSON_DetachItemFromArray(array,which));
+}
+cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {
+ int i=0;
+ cJSON *c=object->child;
+ while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;
+ if (c) return cJSON_DetachItemFromArray(object,i);
+ return 0;
+}
+void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {
+ cJSON_Delete(cJSON_DetachItemFromObject(object,string));
+}
/* Replace array/object items with new ones. */
-void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return;
- newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem;
- if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);}
-void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}}
+void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {
+ cJSON *c=array->child;
+ while (c && which>0) c=c->next,which--;
+ if (!c) return;
+ newitem->next=c->next;
+ newitem->prev=c->prev;
+ if (newitem->next) newitem->next->prev=newitem;
+ if (c==array->child) array->child=newitem;
+ else newitem->prev->next=newitem;
+ c->next=c->prev=0;
+ cJSON_Delete(c);
+}
+void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem) {
+ int i=0;
+ cJSON *c=object->child;
+ while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;
+ if(c) {
+ newitem->string=cJSON_strdup(string);
+ cJSON_ReplaceItemInArray(object,i,newitem);
+ }
+}
/* Create basic types: */
-cJSON *cJSON_CreateNull() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;}
-cJSON *cJSON_CreateTrue() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;}
-cJSON *cJSON_CreateFalse() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;}
-cJSON *cJSON_CreateBool(int b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;}
-cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;}
-cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;}
-cJSON *cJSON_CreateArray() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;}
-cJSON *cJSON_CreateObject() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;}
+cJSON *cJSON_CreateNull() {
+ cJSON *item=cJSON_New_Item();
+ if(item)item->type=cJSON_NULL;
+ return item;
+}
+cJSON *cJSON_CreateTrue() {
+ cJSON *item=cJSON_New_Item();
+ if(item)item->type=cJSON_True;
+ return item;
+}
+cJSON *cJSON_CreateFalse() {
+ cJSON *item=cJSON_New_Item();
+ if(item)item->type=cJSON_False;
+ return item;
+}
+cJSON *cJSON_CreateBool(int b) {
+ cJSON *item=cJSON_New_Item();
+ if(item)item->type=b?cJSON_True:cJSON_False;
+ return item;
+}
+cJSON *cJSON_CreateNumber(double num) {
+ cJSON *item=cJSON_New_Item();
+ if(item) {
+ item->type=cJSON_Number;
+ item->valuedouble=num;
+ item->valueint=(int)num;
+ }
+ return item;
+}
+cJSON *cJSON_CreateString(const char *string) {
+ cJSON *item=cJSON_New_Item();
+ if(item) {
+ item->type=cJSON_String;
+ item->valuestring=cJSON_strdup(string);
+ }
+ return item;
+}
+cJSON *cJSON_CreateArray() {
+ cJSON *item=cJSON_New_Item();
+ if(item)item->type=cJSON_Array;
+ return item;
+}
+cJSON *cJSON_CreateObject() {
+ cJSON *item=cJSON_New_Item();
+ if(item)item->type=cJSON_Object;
+ return item;
+}
/* Create Arrays: */
-cJSON *cJSON_CreateIntArray(int *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-cJSON *cJSON_CreateFloatArray(float *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-cJSON *cJSON_CreateDoubleArray(double *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateString(strings[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
+cJSON *cJSON_CreateIntArray(int *numbers,int count) {
+ int i;
+ cJSON *n=0,*p=0,*a=cJSON_CreateArray();
+ for(i=0; a && i<count; i++) {
+ n=cJSON_CreateNumber(numbers[i]);
+ if(!i)a->child=n;
+ else suffix_object(p,n);
+ p=n;
+ }
+ return a;
+}
+cJSON *cJSON_CreateFloatArray(float *numbers,int count) {
+ int i;
+ cJSON *n=0,*p=0,*a=cJSON_CreateArray();
+ for(i=0; a && i<count; i++) {
+ n=cJSON_CreateNumber(numbers[i]);
+ if(!i)a->child=n;
+ else suffix_object(p,n);
+ p=n;
+ }
+ return a;
+}
+cJSON *cJSON_CreateDoubleArray(double *numbers,int count) {
+ int i;
+ cJSON *n=0,*p=0,*a=cJSON_CreateArray();
+ for(i=0; a && i<count; i++) {
+ n=cJSON_CreateNumber(numbers[i]);
+ if(!i)a->child=n;
+ else suffix_object(p,n);
+ p=n;
+ }
+ return a;
+}
+cJSON *cJSON_CreateStringArray(const char **strings,int count) {
+ int i;
+ cJSON *n=0,*p=0,*a=cJSON_CreateArray();
+ for(i=0; a && i<count; i++) {
+ n=cJSON_CreateString(strings[i]);
+ if(!i)a->child=n;
+ else suffix_object(p,n);
+ p=n;
+ }
+ return a;
+}
diff --git a/navit/vehicle/webos/cJSON.h b/navit/vehicle/webos/cJSON.h
index 97d529aea..61500858f 100644
--- a/navit/vehicle/webos/cJSON.h
+++ b/navit/vehicle/webos/cJSON.h
@@ -1,16 +1,16 @@
/*
Copyright (c) 2009 Dave Gamble
-
+
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
-
+
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
-
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -36,7 +36,7 @@ extern "C"
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6
-
+
#define cJSON_IsReference 256
/* The cJSON structure: */
@@ -80,7 +80,7 @@ extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
extern const char *cJSON_GetErrorPtr(void);
-
+
/* These calls create a cJSON item of the appropriate type. */
extern cJSON *cJSON_CreateNull(void);
extern cJSON *cJSON_CreateTrue(void);
@@ -109,7 +109,7 @@ extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
extern void cJSON_DeleteItemFromArray(cJSON *array,int which);
extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);
-
+
/* Update array items. */
extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
diff --git a/navit/vehicle/webos/vehicle_webos.c b/navit/vehicle/webos/vehicle_webos.c
index a5bba4bce..c81b6342b 100644
--- a/navit/vehicle/webos/vehicle_webos.c
+++ b/navit/vehicle/webos/vehicle_webos.c
@@ -1,4 +1,4 @@
-/**
+/*
* vim: sw=3 ts=3
*
* Navit, a modular navigation system.
@@ -26,7 +26,7 @@
#include <errno.h>
#include <sys/time.h>
#include <PDL.h>
-#include <SDL.h>
+#include "SDL.h"
#include "debug.h"
#include "callback.h"
#include "plugin.h"
@@ -37,350 +37,332 @@
#include "vehicle_webos.h"
#include "bluetooth.h"
+/**
+ * @defgroup vehicle-webos Vehicle WebOS
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from WebOS
+ *
+ * @{
+ */
+
static char *vehicle_webos_prefix="webos:";
/*******************************************************************/
-static void
-vehicle_webos_callback(PDL_ServiceParameters *params, void *priv)
-{
- PDL_Location *location;
- SDL_Event event;
- SDL_UserEvent userevent;
- int err;
+static void vehicle_webos_callback(PDL_ServiceParameters *params, void *priv) {
+ PDL_Location *location;
+ SDL_Event event;
+ SDL_UserEvent userevent;
+ int err;
- err = PDL_GetParamInt(params, "errorCode");
- if (err != 0) {
- dbg(lvl_error,"Location Callback errorCode %d\n", err);
- return /*PDL_EOTHER*/;
- }
+ err = PDL_GetParamInt(params, "errorCode");
+ if (err != 0) {
+ dbg(lvl_error,"Location Callback errorCode %d", err);
+ return /*PDL_EOTHER*/;
+ }
- location = g_new0 (PDL_Location, 1);
+ location = g_new0 (PDL_Location, 1);
- location->altitude = PDL_GetParamDouble(params, "altitude");
- location->velocity = PDL_GetParamDouble(params, "velocity");
- location->heading = PDL_GetParamDouble(params, "heading");
- location->horizontalAccuracy = PDL_GetParamDouble(params, "horizAccuracy");
- location->latitude = PDL_GetParamDouble(params, "latitude");
- location->longitude = PDL_GetParamDouble(params, "longitude");
+ location->altitude = PDL_GetParamDouble(params, "altitude");
+ location->velocity = PDL_GetParamDouble(params, "velocity");
+ location->heading = PDL_GetParamDouble(params, "heading");
+ location->horizontalAccuracy = PDL_GetParamDouble(params, "horizAccuracy");
+ location->latitude = PDL_GetParamDouble(params, "latitude");
+ location->longitude = PDL_GetParamDouble(params, "longitude");
- userevent.type = SDL_USEREVENT;
- userevent.code = PDL_GPS_UPDATE;
- userevent.data1 = location;
- userevent.data2 = NULL;
+ userevent.type = SDL_USEREVENT;
+ userevent.code = PDL_GPS_UPDATE;
+ userevent.data1 = location;
+ userevent.data2 = NULL;
- event.type = SDL_USEREVENT;
- event.user = userevent;
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
- SDL_PushEvent(&event);
+ SDL_PushEvent(&event);
- return /*PDL_NOERROR*/;
+ return /*PDL_NOERROR*/;
}
-static void
-vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location)
-{
- if(location) { // location may be NULL if called by bluetooth-code. priv is already prefilled there
- struct timeval tv;
- gettimeofday(&tv,NULL);
-
- priv->delta = (int)difftime(tv.tv_sec, priv->fix_time);
- dbg(lvl_info,"delta(%i)\n",priv->delta);
- priv->fix_time = tv.tv_sec;
- priv->geo.lat = location->latitude;
- /* workaround for webOS GPS bug following */
- priv->geo.lng = (priv->pdk_version >= 200 && location->longitude >= -1 && location->longitude <= 1) ?
- -location->longitude : location->longitude;
-
- dbg(lvl_info,"Location: %f %f %f %.12g %.12g +-%fm\n",
- location->altitude,
- location->velocity,
- location->heading,
- priv->geo.lat,
- priv->geo.lng,
- location->horizontalAccuracy);
-
- if (location->altitude != -1)
- priv->altitude = location->altitude;
- if (location->velocity != -1)
- priv->speed = location->velocity * 3.6;
- if (location->heading != -1)
- priv->track = location->heading;
- if (location->horizontalAccuracy != -1)
- priv->radius = location->horizontalAccuracy;
-
- if (priv->pdk_version <= 100)
- g_free(location);
- }
-
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+static void vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location) {
+ if(location) { // location may be NULL if called by bluetooth-code. priv is already prefilled there
+ struct timeval tv;
+ gettimeofday(&tv,NULL);
+
+ priv->delta = (int)difftime(tv.tv_sec, priv->fix_time);
+ dbg(lvl_info,"delta(%i)",priv->delta);
+ priv->fix_time = tv.tv_sec;
+ priv->geo.lat = location->latitude;
+ /* workaround for webOS GPS bug following */
+ priv->geo.lng = (priv->pdk_version >= 200 && location->longitude >= -1 && location->longitude <= 1) ?
+ -location->longitude : location->longitude;
+
+ dbg(lvl_info,"Location: %f %f %f %.12g %.12g +-%fm",
+ location->altitude,
+ location->velocity,
+ location->heading,
+ priv->geo.lat,
+ priv->geo.lng,
+ location->horizontalAccuracy);
+
+ if (location->altitude != -1)
+ priv->altitude = location->altitude;
+ if (location->velocity != -1)
+ priv->speed = location->velocity * 3.6;
+ if (location->heading != -1)
+ priv->track = location->heading;
+ if (location->horizontalAccuracy != -1)
+ priv->radius = location->horizontalAccuracy;
+
+ if (priv->pdk_version <= 100)
+ g_free(location);
+ }
+
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
-static void
-vehicle_webos_timeout_callback(struct vehicle_priv *priv)
-{
- struct timeval tv;
- gettimeofday(&tv,NULL);
+static void vehicle_webos_timeout_callback(struct vehicle_priv *priv) {
+ struct timeval tv;
+ gettimeofday(&tv,NULL);
- if (priv->fix_time && priv->delta) {
- int delta = (int)difftime(tv.tv_sec, priv->fix_time);
+ if (priv->fix_time && priv->delta) {
+ int delta = (int)difftime(tv.tv_sec, priv->fix_time);
- if (delta >= priv->delta*2) {
- dbg(lvl_warning, "GPS timeout triggered cb(%p) delta(%d)\n", priv->timeout_cb, delta);
+ if (delta >= priv->delta*2) {
+ dbg(lvl_warning, "GPS timeout triggered cb(%p) delta(%d)", priv->timeout_cb, delta);
- priv->delta = -1;
+ priv->delta = -1;
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
- }
- }
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ }
+ }
}
-void
-vehicle_webos_close(struct vehicle_priv *priv)
-{
- event_remove_timeout(priv->ev_timeout);
- priv->ev_timeout = NULL;
+void vehicle_webos_close(struct vehicle_priv *priv) {
+ event_remove_timeout(priv->ev_timeout);
+ priv->ev_timeout = NULL;
- callback_destroy(priv->timeout_cb);
+ callback_destroy(priv->timeout_cb);
- if (priv->pdk_version <= 100)
- PDL_UnregisterServiceCallback((PDL_ServiceCallbackFunc)vehicle_webos_callback);
- else {
- PDL_EnableLocationTracking(PDL_FALSE);
- vehicle_webos_bt_close(priv);
- }
+ if (priv->pdk_version <= 100)
+ PDL_UnregisterServiceCallback((PDL_ServiceCallbackFunc)vehicle_webos_callback);
+ else {
+ PDL_EnableLocationTracking(PDL_FALSE);
+ vehicle_webos_bt_close(priv);
+ }
}
-static int
-vehicle_webos_open(struct vehicle_priv *priv)
-{
- PDL_Err err;
-
- priv->pdk_version = PDL_GetPDKVersion();
- dbg(lvl_debug,"pdk_version(%d)\n", priv->pdk_version);
-
- if (priv->pdk_version <= 100) {
- // Use Location Service via callback interface
- err = PDL_ServiceCallWithCallback("palm://com.palm.location/startTracking",
- "{subscribe:true}",
- (PDL_ServiceCallbackFunc)vehicle_webos_callback,
- priv,
- PDL_FALSE);
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError());
- vehicle_webos_close(priv);
- return 0;
- }
- }
- else {
- PDL_Err err;
- err = PDL_EnableLocationTracking(PDL_TRUE);
- if (err != PDL_NOERROR) {
- dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError());
+static int vehicle_webos_open(struct vehicle_priv *priv) {
+ PDL_Err err;
+
+ priv->pdk_version = PDL_GetPDKVersion();
+ dbg(lvl_debug,"pdk_version(%d)", priv->pdk_version);
+
+ if (priv->pdk_version <= 100) {
+ // Use Location Service via callback interface
+ err = PDL_ServiceCallWithCallback("palm://com.palm.location/startTracking",
+ "{subscribe:true}",
+ (PDL_ServiceCallbackFunc)vehicle_webos_callback,
+ priv,
+ PDL_FALSE);
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)", err, PDL_GetError());
+ vehicle_webos_close(priv);
+ return 0;
+ }
+ } else {
+ PDL_Err err;
+ err = PDL_EnableLocationTracking(PDL_TRUE);
+ if (err != PDL_NOERROR) {
+ dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)", err, PDL_GetError());
// vehicle_webos_close(priv);
// return 0;
- }
-
- priv->gps_type = GPS_TYPE_INT;
+ }
+
+ priv->gps_type = GPS_TYPE_INT;
- if(!vehicle_webos_bt_open(priv))
- return 0;
- }
+ if(!vehicle_webos_bt_open(priv))
+ return 0;
+ }
- priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb);
- return 1;
+ priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb);
+ return 1;
}
-static void
-vehicle_webos_destroy(struct vehicle_priv *priv)
-{
- vehicle_webos_close(priv);
- if (priv->source)
- g_free(priv->source);
- g_free(priv);
+static void vehicle_webos_destroy(struct vehicle_priv *priv) {
+ vehicle_webos_close(priv);
+ if (priv->source)
+ g_free(priv->source);
+ g_free(priv);
}
-static int
-vehicle_webos_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- switch (type) {
- case attr_position_height:
- dbg(lvl_info,"Altitude: %f\n", priv->altitude);
- attr->u.numd = &priv->altitude;
- break;
- case attr_position_speed:
- dbg(lvl_info,"Speed: %f\n", priv->speed);
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- dbg(lvl_info,"Direction: %f\n", priv->track);
- attr->u.numd = &priv->track;
- break;
- case attr_position_magnetic_direction:
- switch (priv->gps_type) {
- case GPS_TYPE_BT:
- attr->u.num = priv->magnetic_direction;
- break;
- default:
- return 0;
- break;
- }
- break;
- case attr_position_hdop:
- switch (priv->gps_type) {
- case GPS_TYPE_BT:
- attr->u.numd = &priv->hdop;
- break;
- default:
- return 0;
- break;
- }
- break;
- case attr_position_coord_geo:
- dbg(lvl_info,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng);
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_radius:
- dbg(lvl_info,"Radius: %f\n", priv->radius);
- attr->u.numd = &priv->radius;
- break;
- case attr_position_time_iso8601:
- if (priv->fix_time) {
- struct tm tm;
- if (gmtime_r(&priv->fix_time, &tm)) {
- strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
- "%Y-%m-%dT%TZ", &tm);
- attr->u.str=priv->fixiso8601;
- }
- else {
- priv->fix_time = 0;
- return 0;
- }
- dbg(lvl_info,"Fix Time: %d %s\n", priv->fix_time, priv->fixiso8601);
- }
- else {
- dbg(lvl_info,"Fix Time: %d\n", priv->fix_time);
- return 0;
- }
-
- break;
- case attr_position_fix_type:
- switch (priv->gps_type) {
- case GPS_TYPE_INT:
- if (priv->delta <= 0 || priv->radius == 0.0)
- attr->u.num = 0; // strength = 1
- else if (priv->radius > 20.0)
- attr->u.num = 1; // strength >= 2
- else
- attr->u.num = 2; // strength >= 2
- break;
- case GPS_TYPE_BT:
- attr->u.num = priv->status;
- break;
- default:
- return 0;
- break;
- }
- break;
- case attr_position_sats_used:
- switch (priv->gps_type) {
- case GPS_TYPE_INT:
- if (priv->delta <= 0)
- attr->u.num = 0;
- else if (priv->radius <= 6.0 )
- attr->u.num = 6; // strength = 5
- else if (priv->radius <= 10.0 )
- attr->u.num = 5; // strength = 4
- else if (priv->radius <= 15.0 )
- attr->u.num = 4; // strength = 3
- else
- return 0;
- break;
- case GPS_TYPE_BT:
- attr->u.num = priv->sats_used;
- break;
- default:
- return 0;
- break;
- }
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_webos_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ switch (type) {
+ case attr_position_height:
+ dbg(lvl_info,"Altitude: %f", priv->altitude);
+ attr->u.numd = &priv->altitude;
+ break;
+ case attr_position_speed:
+ dbg(lvl_info,"Speed: %f", priv->speed);
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ dbg(lvl_info,"Direction: %f", priv->track);
+ attr->u.numd = &priv->track;
+ break;
+ case attr_position_magnetic_direction:
+ switch (priv->gps_type) {
+ case GPS_TYPE_BT:
+ attr->u.num = priv->magnetic_direction;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ break;
+ case attr_position_hdop:
+ switch (priv->gps_type) {
+ case GPS_TYPE_BT:
+ attr->u.numd = &priv->hdop;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ break;
+ case attr_position_coord_geo:
+ dbg(lvl_info,"Coord: %.12g %.12g", priv->geo.lat, priv->geo.lng);
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_radius:
+ dbg(lvl_info,"Radius: %f", priv->radius);
+ attr->u.numd = &priv->radius;
+ break;
+ case attr_position_time_iso8601:
+ if (priv->fix_time) {
+ struct tm tm;
+ if (gmtime_r(&priv->fix_time, &tm)) {
+ strftime(priv->fixiso8601, sizeof(priv->fixiso8601),
+ "%Y-%m-%dT%TZ", &tm);
+ attr->u.str=priv->fixiso8601;
+ } else {
+ priv->fix_time = 0;
+ return 0;
+ }
+ dbg(lvl_info,"Fix Time: %d %s", priv->fix_time, priv->fixiso8601);
+ } else {
+ dbg(lvl_info,"Fix Time: %d", priv->fix_time);
+ return 0;
+ }
+
+ break;
+ case attr_position_fix_type:
+ switch (priv->gps_type) {
+ case GPS_TYPE_INT:
+ if (priv->delta <= 0 || priv->radius == 0.0)
+ attr->u.num = 0; // strength = 1
+ else if (priv->radius > 20.0)
+ attr->u.num = 1; // strength >= 2
+ else
+ attr->u.num = 2; // strength >= 2
+ break;
+ case GPS_TYPE_BT:
+ attr->u.num = priv->status;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ break;
+ case attr_position_sats_used:
+ switch (priv->gps_type) {
+ case GPS_TYPE_INT:
+ if (priv->delta <= 0)
+ attr->u.num = 0;
+ else if (priv->radius <= 6.0 )
+ attr->u.num = 6; // strength = 5
+ else if (priv->radius <= 10.0 )
+ attr->u.num = 5; // strength = 4
+ else if (priv->radius <= 15.0 )
+ attr->u.num = 4; // strength = 3
+ else
+ return 0;
+ break;
+ case GPS_TYPE_BT:
+ attr->u.num = priv->sats_used;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
-static int
-vehicle_webos_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init)
-{
- switch (attr->type) {
- case attr_source:
- if (strncmp(vehicle_webos_prefix,attr->u.str,strlen(vehicle_webos_prefix))) {
- dbg(lvl_warning,"source must start with '%s'\n", vehicle_webos_prefix);
- return 0;
- }
- g_free(priv->source);
- priv->source=g_strdup(attr->u.str);
- priv->address=priv->source+strlen(vehicle_webos_prefix);
- if (!priv->address[0])
- priv->address=NULL;
- if (!init) {
- vehicle_webos_close(priv);
- vehicle_webos_open(priv);
- }
- return 1;
- case attr_profilename:
- return 1;
- case attr_pdl_gps_update:
- vehicle_webos_gps_update(priv, (PDL_Location *)attr->u.data);
- return 1;
- default:
- return 0;
- }
+static int vehicle_webos_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) {
+ switch (attr->type) {
+ case attr_source:
+ if (strncmp(vehicle_webos_prefix,attr->u.str,strlen(vehicle_webos_prefix))) {
+ dbg(lvl_warning,"source must start with '%s'", vehicle_webos_prefix);
+ return 0;
+ }
+ g_free(priv->source);
+ priv->source=g_strdup(attr->u.str);
+ priv->address=priv->source+strlen(vehicle_webos_prefix);
+ if (!priv->address[0])
+ priv->address=NULL;
+ if (!init) {
+ vehicle_webos_close(priv);
+ vehicle_webos_open(priv);
+ }
+ return 1;
+ case attr_profilename:
+ return 1;
+ case attr_pdl_gps_update:
+ vehicle_webos_gps_update(priv, (PDL_Location *)attr->u.data);
+ return 1;
+ default:
+ return 0;
+ }
}
-static int
-vehicle_webos_set_attr(struct vehicle_priv *priv, struct attr *attr)
-{
- return vehicle_webos_set_attr_do(priv, attr, 0);
+static int vehicle_webos_set_attr(struct vehicle_priv *priv, struct attr *attr) {
+ return vehicle_webos_set_attr_do(priv, attr, 0);
}
struct vehicle_methods vehicle_webos_methods = {
- vehicle_webos_destroy,
- vehicle_webos_position_attr_get,
- vehicle_webos_set_attr,
+ vehicle_webos_destroy,
+ vehicle_webos_position_attr_get,
+ vehicle_webos_set_attr,
};
-static struct vehicle_priv *
-vehicle_webos_new(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *priv;
+static struct vehicle_priv *vehicle_webos_new(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *priv;
- priv = g_new0(struct vehicle_priv, 1);
- priv->attrs = attrs;
- priv->cbl = cbl;
+ priv = g_new0(struct vehicle_priv, 1);
+ priv->attrs = attrs;
+ priv->cbl = cbl;
- priv->timeout_cb = callback_new_1(callback_cast(vehicle_webos_timeout_callback), priv);
+ priv->timeout_cb = callback_new_1(callback_cast(vehicle_webos_timeout_callback), priv);
- *meth = vehicle_webos_methods;
- while (*attrs) {
- vehicle_webos_set_attr_do(priv, *attrs, 1);
- attrs++;
- }
+ *meth = vehicle_webos_methods;
+ while (*attrs) {
+ vehicle_webos_set_attr_do(priv, *attrs, 1);
+ attrs++;
+ }
- vehicle_webos_open(priv);
+ vehicle_webos_open(priv);
- return priv;
+ return priv;
}
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("webos", vehicle_webos_new);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("webos", vehicle_webos_new);
}
-
diff --git a/navit/vehicle/wince/vehicle_wince.c b/navit/vehicle/wince/vehicle_wince.c
index d43c516f7..4d2afa0e9 100644
--- a/navit/vehicle/wince/vehicle_wince.c
+++ b/navit/vehicle/wince/vehicle_wince.c
@@ -1,4 +1,4 @@
-/**
+/*
* Navit, a modular navigation system.
* Copyright (C) 2005-2008 Navit Team
*
@@ -42,7 +42,14 @@
#include <winioctl.h>
#include <winbase.h>
#include <wchar.h>
-#include "support/win32/ConvertUTF.h"
+
+/**
+ * @defgroup vehicle-wince Vehicle WinCE
+ * @ingroup vehicle-plugins
+ * @brief The Vehicle to gain position data from WinCE
+ *
+ * @{
+ */
#define SwitchToThread() Sleep(0)
@@ -66,673 +73,700 @@ static int vehicle_wince_open(struct vehicle_priv *priv);
static void vehicle_wince_close(struct vehicle_priv *priv);
enum file_type {
- file_type_pipe = 1, file_type_device, file_type_file, file_type_socket
+ file_type_pipe = 1, file_type_device, file_type_file, file_type_socket
};
static int buffer_size = 1024;
struct gps_sat {
- int prn;
- int elevation;
- int azimuth;
- int snr;
+ int prn;
+ int elevation;
+ int azimuth;
+ int snr;
};
struct vehicle_priv {
- char *source;
- struct callback_list *cbl;
- struct callback_list *priv_cbl;
- int is_running;
- int thread_up;
- int fd;
- HANDLE m_hGPSDevice; // Handle to the device
- HANDLE m_hGPSThread; // Handle to the thread
- DWORD m_dwGPSThread; // Thread id
-
- char *buffer;
- int buffer_pos;
- char *read_buffer;
- int read_buffer_pos;
- char *nmea_data;
- char *nmea_data_buf;
-
- struct coord_geo geo;
- double speed;
- double direction;
- double height;
- double hdop;
- double vdop;
- char fixtime[20];
- int fixyear;
- int fixmonth;
- int fixday;
- int status;
- int sats_used;
- int sats_visible;
- int sats_signal;
- int time;
- int on_eof;
- int baudrate;
- enum file_type file_type;
- struct attr ** attrs;
- char fixiso8601[128];
- int checksum_ignore;
- HMODULE hBthDll;
- PFN_BthSetMode BthSetMode;
- int magnetic_direction;
- int current_count;
- struct gps_sat current[24];
- int next_count;
- struct gps_sat next[24];
- struct item sat_item;
- int valid;
- int has_data;
- GMutex lock;
+ char *source;
+ struct callback_list *cbl;
+ struct callback_list *priv_cbl;
+ struct callback *cb_fix_timeout;
+ struct event_timeout *ev_fix_timeout;
+ int is_running;
+ int thread_up;
+ int fd;
+ HANDLE m_hGPSDevice; // Handle to the device
+ HANDLE m_hGPSThread; // Handle to the thread
+ DWORD m_dwGPSThread; // Thread id
+
+ char *buffer;
+ int buffer_pos;
+ char *read_buffer;
+ int read_buffer_pos;
+ char *nmea_data;
+ char *nmea_data_buf;
+
+ struct coord_geo geo;
+ double speed;
+ double direction;
+ double height;
+ double hdop;
+ double vdop;
+ char fixtime[20];
+ int fixyear;
+ int fixmonth;
+ int fixday;
+ int status;
+ int sats_used;
+ int sats_visible;
+ int sats_signal;
+ int time;
+ int on_eof;
+ int baudrate;
+ enum file_type file_type;
+ struct attr ** attrs;
+ char fixiso8601[128];
+ int checksum_ignore;
+ HMODULE hBthDll;
+ PFN_BthSetMode BthSetMode;
+ int magnetic_direction;
+ int current_count;
+ struct gps_sat current[24];
+ int next_count;
+ struct gps_sat next[24];
+ struct item sat_item;
+ int valid;
+ int has_data;
+ GMutex lock;
};
-static void initBth(struct vehicle_priv *priv)
-{
-
- BOOL succeeded = FALSE;
- priv->hBthDll = LoadLibrary(TEXT("bthutil.dll"));
- if ( priv->hBthDll )
- {
- DWORD bthMode;
- PFN_BthGetMode BthGetMode = (PFN_BthGetMode)GetProcAddress(priv->hBthDll, TEXT("BthGetMode") );
-
- if ( BthGetMode && BthGetMode(&bthMode) == ERROR_SUCCESS && bthMode == 0 )
- {
- priv->BthSetMode = (PFN_BthSetMode)GetProcAddress(priv->hBthDll, TEXT("BthSetMode") );
- if( priv->BthSetMode && priv->BthSetMode(1) == ERROR_SUCCESS )
- {
- dbg(lvl_debug, "bluetooth activated\n");
- succeeded = TRUE;
- }
- }
-
- }
- else
- {
- dbg(lvl_error, "Bluetooth library notfound\n");
- }
-
- if ( !succeeded )
- {
-
- dbg(lvl_warning, "Bluetooth already enabled or failed to enable it.\n");
- priv->BthSetMode = NULL;
- if ( priv->hBthDll )
- {
- FreeLibrary(priv->hBthDll);
- }
- }
+static void initBth(struct vehicle_priv *priv) {
+
+ BOOL succeeded = FALSE;
+ priv->hBthDll = LoadLibrary(TEXT("bthutil.dll"));
+ if ( priv->hBthDll ) {
+ DWORD bthMode;
+ PFN_BthGetMode BthGetMode = (PFN_BthGetMode)GetProcAddress(priv->hBthDll, TEXT("BthGetMode") );
+
+ if ( BthGetMode && BthGetMode(&bthMode) == ERROR_SUCCESS && bthMode == 0 ) {
+ priv->BthSetMode = (PFN_BthSetMode)GetProcAddress(priv->hBthDll, TEXT("BthSetMode") );
+ if( priv->BthSetMode && priv->BthSetMode(1) == ERROR_SUCCESS ) {
+ dbg(lvl_debug, "bluetooth activated");
+ succeeded = TRUE;
+ }
+ }
+
+ } else {
+ dbg(lvl_error, "Bluetooth library notfound");
+ }
+
+ if ( !succeeded ) {
+
+ dbg(lvl_warning, "Bluetooth already enabled or failed to enable it.");
+ priv->BthSetMode = NULL;
+ if ( priv->hBthDll ) {
+ FreeLibrary(priv->hBthDll);
+ }
+ }
}
-static int initDevice(struct vehicle_priv *priv)
-{
- COMMTIMEOUTS commTiming;
- HANDLE hGPS;
- if ( priv->m_hGPSDevice )
- CloseHandle(priv->m_hGPSDevice);
-
- if ( priv->file_type == file_type_device )
- {
- dbg(lvl_debug, "Init Device\n");
- /* GPD0 is the control port for the GPS driver */
- hGPS = CreateFile(L"GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if (hGPS != INVALID_HANDLE_VALUE) {
+static int initDevice(struct vehicle_priv *priv) {
+ COMMTIMEOUTS commTiming;
+ HANDLE hGPS;
+ if ( priv->m_hGPSDevice )
+ CloseHandle(priv->m_hGPSDevice);
+
+ if ( priv->file_type == file_type_device ) {
+ dbg(lvl_debug, "Init Device");
+ /* GPD0 is the control port for the GPS driver */
+ hGPS = CreateFile(L"GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
+ 0);
+ if (hGPS != INVALID_HANDLE_VALUE) {
#ifndef IOCTL_SERVICE_REFRESH
#define IOCTL_SERVICE_REFRESH 0x4100000C
#endif
- DeviceIoControl(hGPS,IOCTL_SERVICE_REFRESH,0,0,0,0,0,0);
+ DeviceIoControl(hGPS,IOCTL_SERVICE_REFRESH,0,0,0,0,0,0);
#ifndef IOCTL_SERVICE_START
#define IOCTL_SERVICE_START 0x41000004
#endif
- DeviceIoControl(hGPS,IOCTL_SERVICE_START,0,0,0,0,0,0);
- CloseHandle(hGPS);
- }
-
- while (priv->is_running &&
- (priv->m_hGPSDevice = CreateFile(A2W(priv->source),
- GENERIC_READ, 0,
- NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE)
- {
- Sleep(1000);
- dbg(lvl_debug, "Waiting to connect to %s\n", priv->source);
- }
- GetCommTimeouts (priv->m_hGPSDevice, &commTiming);
- commTiming.ReadIntervalTimeout = 20;
- commTiming.ReadTotalTimeoutMultiplier = 0;
- commTiming.ReadTotalTimeoutConstant = 200;
-
- commTiming.WriteTotalTimeoutMultiplier=5;
- commTiming.WriteTotalTimeoutConstant=5;
- SetCommTimeouts (priv->m_hGPSDevice, &commTiming);
-
- if (priv->baudrate) {
- DCB portState;
- if (!GetCommState(priv->m_hGPSDevice, &portState)) {
- MessageBox (NULL, TEXT ("GetCommState Error"), TEXT (""),
- MB_APPLMODAL|MB_OK);
- priv->thread_up = 0;
- return 0;
- }
- portState.BaudRate = priv->baudrate;
- if (!SetCommState(priv->m_hGPSDevice, &portState)) {
- MessageBox (NULL, TEXT ("SetCommState Error"), TEXT (""),
- MB_APPLMODAL|MB_OK);
- priv->thread_up = 0;
- return 0;
- }
- }
-
- }
- else
- {
- dbg(lvl_debug, "Open File\n");
- priv->m_hGPSDevice = CreateFileW( A2W(priv->source),
- GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
- if ( priv->m_hGPSDevice == INVALID_HANDLE_VALUE) {
- dbg(lvl_error, "Could not open %s\n", priv->source);
- return 0;
- }
- }
- return 1;
+ DeviceIoControl(hGPS,IOCTL_SERVICE_START,0,0,0,0,0,0);
+ CloseHandle(hGPS);
+ }
+
+ while (priv->is_running &&
+ (priv->m_hGPSDevice = CreateFile(A2W(priv->source),
+ GENERIC_READ, 0,
+ NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) {
+ Sleep(1000);
+ dbg(lvl_debug, "Waiting to connect to %s", priv->source);
+ }
+ GetCommTimeouts (priv->m_hGPSDevice, &commTiming);
+ commTiming.ReadIntervalTimeout = 20;
+ commTiming.ReadTotalTimeoutMultiplier = 0;
+ commTiming.ReadTotalTimeoutConstant = 200;
+
+ commTiming.WriteTotalTimeoutMultiplier=5;
+ commTiming.WriteTotalTimeoutConstant=5;
+ SetCommTimeouts (priv->m_hGPSDevice, &commTiming);
+
+ if (priv->baudrate) {
+ DCB portState;
+ if (!GetCommState(priv->m_hGPSDevice, &portState)) {
+ MessageBox (NULL, TEXT ("GetCommState Error"), TEXT (""),
+ MB_APPLMODAL|MB_OK);
+ priv->thread_up = 0;
+ return 0;
+ }
+ portState.BaudRate = priv->baudrate;
+ if (!SetCommState(priv->m_hGPSDevice, &portState)) {
+ MessageBox (NULL, TEXT ("SetCommState Error"), TEXT (""),
+ MB_APPLMODAL|MB_OK);
+ priv->thread_up = 0;
+ return 0;
+ }
+ }
+
+ } else {
+ dbg(lvl_debug, "Open File");
+ priv->m_hGPSDevice = CreateFileW( A2W(priv->source),
+ GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
+ if ( priv->m_hGPSDevice == INVALID_HANDLE_VALUE) {
+ dbg(lvl_error, "Could not open %s", priv->source);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static int read_win32(struct vehicle_priv *priv, char *buffer, size_t size) {
+ int ret_size;
+
+ g_mutex_lock(&priv->lock);
+ ret_size = MIN(size,priv->read_buffer_pos);
+ priv->has_data = 0;
+ memcpy(buffer, priv->read_buffer, ret_size);
+
+ memmove(priv->read_buffer, priv->read_buffer + ret_size, buffer_size - ret_size);
+ priv->read_buffer_pos -= ret_size;
+ g_mutex_unlock(&priv->lock);
+ return ret_size;
+}
+
+static DWORD WINAPI wince_reader_thread (LPVOID lParam) {
+ struct vehicle_priv *priv = lParam;
+ char chunk_buffer[3*82];
+ BOOL status;
+ DWORD bytes_read;
+ int waitcounter;
+
+ dbg(lvl_debug, "GPS Port:[%s]", priv->source);
+ priv->thread_up = 1;
+
+ if ( !initDevice(priv) ) {
+ return -1;
+ }
+ while (priv->is_running) {
+ dbg(lvl_debug,"readfile");
+ waitcounter = 0;
+ status = ReadFile(priv->m_hGPSDevice,
+ chunk_buffer, sizeof(chunk_buffer),
+ &bytes_read, NULL);
+
+ if ( !status ) {
+ dbg(lvl_error,"Error reading file/device. Try again.");
+ initDevice(priv);
+ continue;
+ }
+
+ while ( priv->read_buffer_pos + bytes_read > buffer_size ) {
+ /* TODO (rikky#1#): should use blocking */
+ if ( priv->file_type != file_type_file ) {
+ dbg(lvl_debug, "GPS data comes too fast. Have to wait here");
+ }
+
+ Sleep(50);
+ waitcounter++;
+ if ( waitcounter % 8 == 0 ) {
+ dbg(lvl_debug, "Remind them of the data");
+ event_call_callback(priv->priv_cbl);
+ }
+ if(waitcounter % 200 == 0) {
+ dbg(lvl_error,"Will main thread ever be ready for the GPS data? Already %d intervals gone.",waitcounter);
+ }
+
+ }
+
+ if(waitcounter>2)
+ dbg(lvl_debug,"Sent GPS data to the main thread after %d intervals delay.",waitcounter);
+
+ g_mutex_lock(&priv->lock);
+ memcpy(priv->read_buffer + priv->read_buffer_pos, chunk_buffer, bytes_read );
+
+ priv->read_buffer_pos += bytes_read;
+
+ if ( !priv->has_data ) {
+ event_call_callback(priv->priv_cbl);
+ priv->has_data = 1;
+ }
+
+ g_mutex_unlock(&priv->lock);
+ }
+ return TRUE;
}
-static int read_win32(struct vehicle_priv *priv, char *buffer, size_t size)
-{
- int ret_size;
-
- g_mutex_lock(&priv->lock);
- ret_size = MIN(size,priv->read_buffer_pos);
- priv->has_data = 0;
- memcpy(buffer, priv->read_buffer, ret_size);
-
- memmove(priv->read_buffer, priv->read_buffer + ret_size, buffer_size - ret_size);
- priv->read_buffer_pos -= ret_size;
- g_mutex_unlock(&priv->lock);
- return ret_size;
+static int vehicle_wince_available_ports(void) {
+ HKEY hkResult;
+ HKEY hkSubResult;
+ wchar_t keyname[20];
+ wchar_t devicename[100];
+ wchar_t devicetype[100];
+ int index = 0;
+ DWORD regkey_length = sizeof(keyname);
+ DWORD regdevtype_length = sizeof(devicetype);
+
+ RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Drivers\\Active"), 0, 0, &hkResult);
+ while (RegEnumKeyEx( hkResult, index++, keyname, &regkey_length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) {
+ if (RegOpenKeyEx( hkResult, keyname, 0, 0, &hkSubResult) == ERROR_SUCCESS ) {
+ regkey_length = sizeof(keyname);
+ if ( RegQueryValueEx( hkSubResult, L"Name", NULL, NULL, (LPBYTE)devicename, &regkey_length) == ERROR_SUCCESS ) {
+ regdevtype_length = sizeof(devicetype);
+ if ( RegQueryValueEx( hkSubResult, L"Key", NULL, NULL, (LPBYTE)devicetype, &regdevtype_length) == ERROR_SUCCESS ) {
+ dbg(lvl_debug, "Found device '%s' (%s)", W2A(devicename), W2A(devicetype));
+ } else {
+ dbg(lvl_debug, "Found device '%s'", W2A(devicename));
+ }
+ }
+ RegCloseKey(hkSubResult);
+ }
+ regkey_length = sizeof(keyname);
+ }
+
+ RegCloseKey(hkResult);
+ return 0;
}
-static DWORD WINAPI wince_reader_thread (LPVOID lParam)
-{
- struct vehicle_priv *priv = lParam;
- char chunk_buffer[3*82];
- BOOL status;
- DWORD bytes_read;
- int waitcounter;
-
- dbg(lvl_debug, "GPS Port:[%s]\n", priv->source);
- priv->thread_up = 1;
-
- if ( !initDevice(priv) ) {
- return -1;
- }
- while (priv->is_running)
- {
- dbg(lvl_debug,"readfile\n");
- waitcounter = 0;
- status = ReadFile(priv->m_hGPSDevice,
- chunk_buffer, sizeof(chunk_buffer),
- &bytes_read, NULL);
-
- if ( !status )
- {
- dbg(lvl_error,"Error reading file/device. Try again.\n");
- initDevice(priv);
- continue;
- }
-
- while ( priv->read_buffer_pos + bytes_read > buffer_size )
- {
- /* TODO (rikky#1#): should use blocking */
- if ( priv->file_type != file_type_file )
- {
- dbg(lvl_debug, "GPS data comes too fast. Have to wait here\n");
- }
-
- Sleep(50);
- waitcounter++;
- if ( waitcounter % 8 == 0 )
- {
- dbg(lvl_debug, "Remind them of the data\n");
- event_call_callback(priv->priv_cbl);
- }
- if(waitcounter % 200 == 0) {
- dbg(lvl_error,"Will main thread ever be ready for the GPS data? Already %d intervals gone.\n",waitcounter);
- }
-
- }
-
- if(waitcounter>2)
- dbg(lvl_debug,"Sent GPS data to the main thread after %d intervals delay.\n",waitcounter);
-
- g_mutex_lock(&priv->lock);
- memcpy(priv->read_buffer + priv->read_buffer_pos , chunk_buffer, bytes_read );
-
- priv->read_buffer_pos += bytes_read;
-
- if ( !priv->has_data )
- {
- event_call_callback(priv->priv_cbl);
- priv->has_data = 1;
- }
-
- g_mutex_unlock(&priv->lock);
- }
- return TRUE;
+
+/**
+* @brief This is a callback function, called when the fix timeout
+* is done. Set the position to invalid.
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_wince_fix_timeout_cb(struct vehicle_priv *priv) {
+ priv->valid = attr_position_valid_invalid;
+ priv->ev_fix_timeout = NULL;
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
-static int
-vehicle_wince_available_ports(void)
-{
- HKEY hkResult;
- HKEY hkSubResult;
- wchar_t keyname[20];
- wchar_t devicename[100];
- wchar_t devicetype[100];
- int index = 0;
- DWORD regkey_length = sizeof(keyname);
- DWORD regdevtype_length = sizeof(devicetype);
-
- RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Drivers\\Active"), 0, 0, &hkResult);
- while (RegEnumKeyEx( hkResult, index++, keyname, &regkey_length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS )
- {
- if (RegOpenKeyEx( hkResult, keyname, 0, 0, &hkSubResult) == ERROR_SUCCESS )
- {
- regkey_length = sizeof(keyname);
- if ( RegQueryValueEx( hkSubResult, L"Name", NULL, NULL, (LPBYTE)devicename, &regkey_length) == ERROR_SUCCESS )
- {
- regdevtype_length = sizeof(devicetype);
- if ( RegQueryValueEx( hkSubResult, L"Key", NULL, NULL, (LPBYTE)devicetype, &regdevtype_length) == ERROR_SUCCESS )
- {
- dbg(lvl_debug, "Found device '%s' (%s)\n", W2A(devicename), W2A(devicetype));
- }
- else
- {
- dbg(lvl_debug, "Found device '%s'\n", W2A(devicename));
- }
- }
- RegCloseKey(hkSubResult);
- }
- regkey_length = sizeof(keyname);
- }
-
- RegCloseKey(hkResult);
- return 0;
+
+/**
+* @brief Cancel previous fix timeout event and add a new one
+*
+* @param priv Pointer on the private data of the plugin
+*/
+static void vehicle_wince_restart_fix_timeout(struct vehicle_priv *priv) {
+ if (priv->ev_fix_timeout != NULL)
+ event_remove_timeout(priv->ev_fix_timeout);
+ priv->ev_fix_timeout = event_add_timeout(10000, 0, priv->cb_fix_timeout);
}
-static int
-vehicle_wince_open(struct vehicle_priv *priv)
-{
- char* raw_setting_str;
- char* strport;
- char* strsettings;
- dbg(lvl_debug, "enter vehicle_wince_open, priv->source='%s'\n", priv->source);
+static int vehicle_wince_open(struct vehicle_priv *priv) {
+ char* raw_setting_str;
+ char* strport;
+ char* strsettings;
+
+ dbg(lvl_debug, "enter vehicle_wince_open, priv->source='%s'", priv->source);
- if (priv->source ) {
+ if (priv->source ) {
- if ( strcmp(priv->source, "list") == 0 )
- {
- vehicle_wince_available_ports();
- return 0;
- }
+ if ( strcmp(priv->source, "list") == 0 ) {
+ vehicle_wince_available_ports();
+ return 0;
+ }
- raw_setting_str = g_strdup( priv->source );
- strport = strchr(raw_setting_str, ':' );
- strsettings = strchr(raw_setting_str, ' ' );
+ raw_setting_str = g_strdup( priv->source );
+ strport = strchr(raw_setting_str, ':' );
+ strsettings = strchr(raw_setting_str, ' ' );
- if (raw_setting_str && strport&&strsettings ) {
- strport++;
- *strsettings = '\0';
- strsettings++;
+ if (raw_setting_str && strport&&strsettings ) {
+ strport++;
+ *strsettings = '\0';
+ strsettings++;
- dbg(lvl_debug, "serial('%s', '%s')\n", strport, strsettings );
- }
- if (raw_setting_str)
- g_free( raw_setting_str );
- }
- return 1;
+ dbg(lvl_debug, "serial('%s', '%s')", strport, strsettings );
+ }
+ if (raw_setting_str)
+ g_free( raw_setting_str );
+ }
+ return 1;
}
-static void
-vehicle_wince_close(struct vehicle_priv *priv)
-{
- dbg(lvl_debug,"enter");
+static void vehicle_wince_close(struct vehicle_priv *priv) {
+ dbg(lvl_debug,"enter");
}
-static int
-vehicle_wince_parse(struct vehicle_priv *priv, char *buffer)
-{
- char *nmea_data_buf, *p, *item[32];
- double lat, lng;
- int i, j, bcsum;
- int len = strlen(buffer);
- unsigned char csum = 0;
- int valid=0;
- int ret = 0;
-
- dbg(lvl_info, "enter: buffer='%s'\n", buffer);
- for (;;) {
- if (len < 4) {
- dbg(lvl_error, "'%s' too short\n", buffer);
- return ret;
- }
- if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') {
- buffer[--len] = '\0';
- if (buffer[len - 1] == '\r')
- buffer[--len] = '\0';
- } else
- break;
- }
- if (buffer[0] != '$') {
- dbg(lvl_error, "no leading $ in '%s'\n", buffer);
- return ret;
- }
- if (buffer[len - 3] != '*') {
- dbg(lvl_error, "no *XX in '%s'\n", buffer);
- return ret;
- }
- for (i = 1; i < len - 3; i++) {
- csum ^= (unsigned char) (buffer[i]);
- }
- if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) {
- dbg(lvl_error, "no checksum in '%s'\n", buffer);
- return ret;
- }
- if (bcsum != csum && priv->checksum_ignore == 0) {
- dbg(lvl_error, "wrong checksum in '%s'\n", buffer);
- return ret;
- }
-
- if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
- nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL);
- g_free(priv->nmea_data_buf);
- priv->nmea_data_buf=nmea_data_buf;
- } else {
- dbg(lvl_error, "nmea buffer overflow, discarding '%s'\n", buffer);
- }
- i = 0;
- p = buffer;
- while (i < 31) {
- item[i++] = p;
- while (*p && *p != ',')
- p++;
- if (!*p)
- break;
- *p++ = '\0';
- }
-
- if (!strncmp(&buffer[3], "GGA", 3)) {
- /* 1 1111
- 0 1 2 3 4 5 6 7 8 9 0 1234
- $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C
- UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
- HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
- */
- if (*item[2] && *item[3] && *item[4] && *item[5]) {
- lat = g_ascii_strtod(item[2], NULL);
- priv->geo.lat = floor(lat / 100);
- lat -= priv->geo.lat * 100;
- priv->geo.lat += lat / 60;
-
- if (!g_strcasecmp(item[3],"S"))
- priv->geo.lat=-priv->geo.lat;
-
- lng = g_ascii_strtod(item[4], NULL);
- priv->geo.lng = floor(lng / 100);
- lng -= priv->geo.lng * 100;
- priv->geo.lng += lng / 60;
-
- if (!g_strcasecmp(item[5],"W"))
- priv->geo.lng=-priv->geo.lng;
- priv->valid=attr_position_valid_valid;
-
- dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
-
- } else
- priv->valid=attr_position_valid_invalid;
- if (*item[6])
- sscanf(item[6], "%d", &priv->status);
- if (*item[7])
- sscanf(item[7], "%d", &priv->sats_used);
- if (*item[8])
- sscanf(item[8], "%lf", &priv->hdop);
- if (*item[1])
- strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
- if (*item[9])
- sscanf(item[9], "%lf", &priv->height);
-
- g_free(priv->nmea_data);
- priv->nmea_data=priv->nmea_data_buf;
- priv->nmea_data_buf=NULL;
- }
- if (!strncmp(&buffer[3], "VTG", 3)) {
- /* 0 1 2 34 5 6 7 8
- $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A
- Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4],
- Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8]
- */
- if (item[1] && item[7])
- valid = 1;
- if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D'))
- valid = 1;
- if (valid) {
- priv->direction = g_ascii_strtod( item[1], NULL );
- priv->speed = g_ascii_strtod( item[7], NULL );
- dbg(lvl_info,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed);
- }
- }
- if (!strncmp(&buffer[3], "RMC", 3)) {
- /* 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1
- $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
- Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9],
- magnetic variation[10],magnetic variation direction[11]
- */
- if (*item[2] == 'A')
- valid = 1;
- if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D'))
- valid = 1;
- if (valid) {
- priv->direction = g_ascii_strtod( item[8], NULL );
- priv->speed = g_ascii_strtod( item[7], NULL );
- priv->speed *= 1.852;
- sscanf(item[9], "%02d%02d%02d",
- &priv->fixday,
- &priv->fixmonth,
- &priv->fixyear);
- priv->fixyear += 2000;
- }
- ret = 1;
- }
- if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
- /*
- 0 GSV Satellites in view
- 1 2 Number of sentences for full data
- 2 1 sentence 1 of 2
- 3 08 Number of satellites in view
-
- 4 01 Satellite PRN number
- 5 40 Elevation, degrees
- 6 083 Azimuth, degrees
- 7 46 SNR - higher is better
- for up to 4 satellites per sentence
- *75 the checksum data, always begins with *
- */
- if (item[3]) {
- sscanf(item[3], "%d", &priv->sats_visible);
- }
- j=4;
- while (j+4 <= i && priv->current_count < 24) {
- struct gps_sat *sat=&priv->next[priv->next_count++];
- sat->prn=atoi(item[j]);
- sat->elevation=atoi(item[j+1]);
- sat->azimuth=atoi(item[j+2]);
- sat->snr=atoi(item[j+3]);
- j+=4;
- }
- if (!strcmp(item[1], item[2])) {
- priv->sats_signal=0;
- for (i = 0 ; i < priv->next_count ; i++) {
- priv->current[i]=priv->next[i];
- if (priv->current[i].snr)
- priv->sats_signal++;
- }
- priv->current_count=priv->next_count;
- priv->next_count=0;
- }
- }
- if (!strncmp(&buffer[3], "ZDA", 3)) {
- /*
- 0 1 2 3 4 5 6
- $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC
- hhmmss HrMinSec(UTC)
- dd,mm,yyy Day,Month,Year
- xx local zone hours -13..13
- yy local zone minutes 0..59
- */
- if (item[1] && item[2] && item[3] && item[4]) {
- strncpy(priv->fixtime, item[1], strlen(priv->fixtime));
- priv->fixday = atoi(item[2]);
- priv->fixmonth = atoi(item[3]);
- priv->fixyear = atoi(item[4]);
- }
- }
- if (!strncmp(buffer, "$IISMD", 6)) {
- /*
- 0 1 2 3 4
- $IISMD,dir,press,height,temp*CC"
- dir Direction (0-359)
- press Pressure (hpa, i.e. 1032)
- height Barometric height above ground (meter)
- temp Temperature (Degree Celsius)
- */
- if (item[1]) {
- priv->magnetic_direction = g_ascii_strtod( item[1], NULL );
- dbg(lvl_debug,"magnetic %d\n", priv->magnetic_direction);
- }
- }
- return ret;
+static int vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) {
+ char *nmea_data_buf, *p, *item[32];
+ double lat, lng;
+ int i, j, bcsum;
+ int len = strlen(buffer);
+ unsigned char csum = 0;
+ int valid=0;
+ int ret = 0;
+
+ dbg(lvl_info, "enter: buffer='%s'", buffer);
+ for (;;) {
+ if (len < 4) {
+ dbg(lvl_error, "'%s' too short", buffer);
+ return ret;
+ }
+ if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') {
+ buffer[--len] = '\0';
+ if (buffer[len - 1] == '\r')
+ buffer[--len] = '\0';
+ } else
+ break;
+ }
+ if (buffer[0] != '$') {
+ dbg(lvl_error, "no leading $ in '%s'", buffer);
+ return ret;
+ }
+ if (buffer[len - 3] != '*') {
+ dbg(lvl_error, "no *XX in '%s'", buffer);
+ return ret;
+ }
+ for (i = 1; i < len - 3; i++) {
+ csum ^= (unsigned char) (buffer[i]);
+ }
+ if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) {
+ dbg(lvl_error, "no checksum in '%s'", buffer);
+ return ret;
+ }
+ if (bcsum != csum && priv->checksum_ignore == 0) {
+ dbg(lvl_error, "wrong checksum in '%s'", buffer);
+ return ret;
+ }
+
+ if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) {
+ nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL);
+ g_free(priv->nmea_data_buf);
+ priv->nmea_data_buf=nmea_data_buf;
+ } else {
+ dbg(lvl_error, "nmea buffer overflow, discarding '%s'", buffer);
+ }
+ i = 0;
+ p = buffer;
+ while (i < 31) {
+ item[i++] = p;
+ while (*p && *p != ',')
+ p++;
+ if (!*p)
+ break;
+ *p++ = '\0';
+ }
+
+ if (!strncmp(&buffer[3], "GGA", 3)) {
+ /* 1 1111
+ 0 1 2 3 4 5 6 7 8 9 0 1234
+ $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C
+ UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
+ HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
+ */
+ if (*item[2] && *item[3] && *item[4] && *item[5] && *item[6] > 0) {
+ lat = g_ascii_strtod(item[2], NULL);
+ priv->geo.lat = floor(lat / 100);
+ lat -= priv->geo.lat * 100;
+ priv->geo.lat += lat / 60;
+
+ if (!g_strcasecmp(item[3],"S"))
+ priv->geo.lat=-priv->geo.lat;
+
+ lng = g_ascii_strtod(item[4], NULL);
+ priv->geo.lng = floor(lng / 100);
+ lng -= priv->geo.lng * 100;
+ priv->geo.lng += lng / 60;
+
+ if (!g_strcasecmp(item[5],"W"))
+ priv->geo.lng=-priv->geo.lng;
+
+ if (priv->valid == attr_position_valid_invalid)
+ ret = 1;
+ priv->valid = attr_position_valid_valid;
+ vehicle_wince_restart_fix_timeout(priv);
+
+ if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
+ ret = 1;
+ strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
+ }
+
+ dbg(lvl_info, "latitude '%2.4f' longitude %2.4f", priv->geo.lat, priv->geo.lng);
+
+ } else {
+ if (priv->valid == attr_position_valid_valid)
+ ret = 1;
+ priv->valid=attr_position_valid_invalid;
+ }
+
+ if (*item[6])
+ sscanf(item[6], "%d", &priv->status);
+ if (*item[7])
+ sscanf(item[7], "%d", &priv->sats_used);
+ if (*item[8])
+ sscanf(item[8], "%lf", &priv->hdop);
+ if (*item[9])
+ sscanf(item[9], "%lf", &priv->height);
+
+ g_free(priv->nmea_data);
+ priv->nmea_data=priv->nmea_data_buf;
+ priv->nmea_data_buf=NULL;
+ }
+ if (!strncmp(&buffer[3], "VTG", 3)) {
+ /* 0 1 2 34 5 6 7 8
+ $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A
+ Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4],
+ Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8]
+ */
+ if (item[1] && item[7])
+ valid = 1;
+ if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D'))
+ valid = 1;
+ if (valid) {
+ priv->direction = g_ascii_strtod( item[1], NULL );
+ priv->speed = g_ascii_strtod( item[7], NULL );
+ dbg(lvl_info,"direction %lf, speed %2.1lf", priv->direction, priv->speed);
+ }
+ }
+ if (!strncmp(&buffer[3], "RMC", 3)) {
+ /* 1 1
+ 0 1 2 3 4 5 6 7 8 9 0 1
+ $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
+ Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9],
+ magnetic variation[10],magnetic variation direction[11]
+ */
+ if (*item[2] == 'A')
+ valid = 1;
+ if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D'))
+ valid = 1;
+ if (valid) {
+ priv->direction = g_ascii_strtod( item[8], NULL );
+ priv->speed = g_ascii_strtod( item[7], NULL );
+ priv->speed *= 1.852;
+ sscanf(item[9], "%02d%02d%02d",
+ &priv->fixday,
+ &priv->fixmonth,
+ &priv->fixyear);
+ priv->fixyear += 2000;
+
+ lat = g_ascii_strtod(item[3], NULL);
+ priv->geo.lat = floor(lat / 100);
+ lat -= priv->geo.lat * 100;
+ priv->geo.lat += lat / 60;
+
+ if (!g_ascii_strcasecmp(item[4],"S"))
+ priv->geo.lat=-priv->geo.lat;
+
+ lng = g_ascii_strtod(item[5], NULL);
+ priv->geo.lng = floor(lng / 100);
+ lng -= priv->geo.lng * 100;
+ priv->geo.lng += lng / 60;
+
+ if (!g_ascii_strcasecmp(item[6],"W"))
+ priv->geo.lng=-priv->geo.lng;
+
+ if (priv->valid == attr_position_valid_invalid)
+ ret = 1;
+ priv->valid=attr_position_valid_valid;
+ vehicle_wince_restart_fix_timeout(priv);
+
+ if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
+ ret = 1;
+ strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
+ }
+
+ dbg(lvl_info, "latitude '%2.4f' longitude %2.4f", priv->geo.lat, priv->geo.lng);
+
+ } else {
+ if (priv->valid == attr_position_valid_valid)
+ ret = 1;
+ priv->valid=attr_position_valid_invalid;
+ }
+ }
+ if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
+ /*
+ 0 GSV Satellites in view
+ 1 2 Number of sentences for full data
+ 2 1 sentence 1 of 2
+ 3 08 Number of satellites in view
+
+ 4 01 Satellite PRN number
+ 5 40 Elevation, degrees
+ 6 083 Azimuth, degrees
+ 7 46 SNR - higher is better
+ for up to 4 satellites per sentence
+ *75 the checksum data, always begins with *
+ */
+ if (item[3]) {
+ sscanf(item[3], "%d", &priv->sats_visible);
+ }
+ j=4;
+ while (j+4 <= i && priv->current_count < 24) {
+ struct gps_sat *sat=&priv->next[priv->next_count++];
+ sat->prn=atoi(item[j]);
+ sat->elevation=atoi(item[j+1]);
+ sat->azimuth=atoi(item[j+2]);
+ sat->snr=atoi(item[j+3]);
+ j+=4;
+ }
+ if (!strcmp(item[1], item[2])) {
+ priv->sats_signal=0;
+ for (i = 0 ; i < priv->next_count ; i++) {
+ priv->current[i]=priv->next[i];
+ if (priv->current[i].snr)
+ priv->sats_signal++;
+ }
+ priv->current_count=priv->next_count;
+ priv->next_count=0;
+ }
+ }
+ if (!strncmp(&buffer[3], "ZDA", 3)) {
+ /*
+ 0 1 2 3 4 5 6
+ $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC
+ hhmmss HrMinSec(UTC)
+ dd,mm,yyy Day,Month,Year
+ xx local zone hours -13..13
+ yy local zone minutes 0..59
+ */
+ if (item[1] && item[2] && item[3] && item[4]) {
+ strncpy(priv->fixtime, item[1], strlen(priv->fixtime));
+ priv->fixday = atoi(item[2]);
+ priv->fixmonth = atoi(item[3]);
+ priv->fixyear = atoi(item[4]);
+ }
+ }
+ if (!strncmp(buffer, "$IISMD", 6)) {
+ /*
+ 0 1 2 3 4
+ $IISMD,dir,press,height,temp*CC"
+ dir Direction (0-359)
+ press Pressure (hpa, i.e. 1032)
+ height Barometric height above ground (meter)
+ temp Temperature (Degree Celsius)
+ */
+ if (item[1]) {
+ priv->magnetic_direction = g_ascii_strtod( item[1], NULL );
+ dbg(lvl_debug,"magnetic %d", priv->magnetic_direction);
+ }
+ }
+ return ret;
}
-static void
-vehicle_wince_io(struct vehicle_priv *priv)
-{
- int size, rc = 0;
- char *str, *tok;
-
- dbg(lvl_debug, "vehicle_file_io : enter\n");
-
- size = read_win32(priv, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1);
-
- if (size <= 0) {
- switch (priv->on_eof) {
- case 0:
- vehicle_wince_close(priv);
- vehicle_wince_open(priv);
- break;
- case 1:
- vehicle_wince_disable_watch(priv);
- break;
- case 2:
- exit(0);
- break;
- }
- return;
- }
- priv->buffer_pos += size;
- priv->buffer[priv->buffer_pos] = '\0';
- dbg(lvl_debug, "size=%d pos=%d buffer='%s'\n", size,
- priv->buffer_pos, priv->buffer);
- str = priv->buffer;
- while ((tok = strchr(str, '\n'))) {
- *tok++ = '\0';
- dbg(lvl_debug, "line='%s'\n", str);
- rc +=vehicle_wince_parse(priv, str);
- str = tok;
- if (priv->file_type == file_type_file && rc)
- break;
- }
-
- if (str != priv->buffer) {
- size = priv->buffer + priv->buffer_pos - str;
- memmove(priv->buffer, str, size + 1);
- priv->buffer_pos = size;
- dbg(lvl_info, "now pos=%d buffer='%s'\n",
- priv->buffer_pos, priv->buffer);
- } else if (priv->buffer_pos == buffer_size - 1) {
- dbg(lvl_error,
- "Overflow. Most likely wrong baud rate or no nmea protocol\n");
- priv->buffer_pos = 0;
- }
- if (rc)
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+static void vehicle_wince_io(struct vehicle_priv *priv) {
+ int size, rc = 0;
+ char *str, *tok;
+
+ dbg(lvl_debug, "vehicle_file_io : enter");
+
+ size = read_win32(priv, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1);
+
+ if (size <= 0) {
+ switch (priv->on_eof) {
+ case 0:
+ vehicle_wince_close(priv);
+ vehicle_wince_open(priv);
+ break;
+ case 1:
+ vehicle_wince_disable_watch(priv);
+ break;
+ case 2:
+ exit(0);
+ break;
+ }
+ return;
+ }
+ priv->buffer_pos += size;
+ priv->buffer[priv->buffer_pos] = '\0';
+ dbg(lvl_debug, "size=%d pos=%d buffer='%s'", size,
+ priv->buffer_pos, priv->buffer);
+ str = priv->buffer;
+ while ((tok = strchr(str, '\n'))) {
+ *tok++ = '\0';
+ dbg(lvl_debug, "line='%s'", str);
+ rc +=vehicle_wince_parse(priv, str);
+ str = tok;
+ if (priv->file_type == file_type_file && rc)
+ break;
+ }
+
+ if (str != priv->buffer) {
+ size = priv->buffer + priv->buffer_pos - str;
+ memmove(priv->buffer, str, size + 1);
+ priv->buffer_pos = size;
+ dbg(lvl_info, "now pos=%d buffer='%s'",
+ priv->buffer_pos, priv->buffer);
+ } else if (priv->buffer_pos == buffer_size - 1) {
+ dbg(lvl_error,
+ "Overflow. Most likely wrong baud rate or no nmea protocol\n");
+ priv->buffer_pos = 0;
+ }
+ if (rc)
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
}
-static void
-vehicle_wince_enable_watch(struct vehicle_priv *priv)
-{
- dbg(lvl_debug, "enter");
- vehicle_wince_disable_watch(priv);
- priv->is_running = 1;
-
- InitializeCriticalSection(&priv->lock);
- priv->m_hGPSThread = CreateThread(NULL, 0, wince_reader_thread,
- priv, 0, &priv->m_dwGPSThread);
-
- if (!priv->m_hGPSThread) {
- priv->is_running = 0;
- // error creating thread
- MessageBox (NULL, TEXT ("Can not create GPS reader thread"), TEXT (""),
- MB_APPLMODAL|MB_OK);
- }
+static void vehicle_wince_enable_watch(struct vehicle_priv *priv) {
+ dbg(lvl_debug, "enter");
+ vehicle_wince_disable_watch(priv);
+ priv->is_running = 1;
+
+ InitializeCriticalSection(&priv->lock);
+ priv->m_hGPSThread = CreateThread(NULL, 0, wince_reader_thread,
+ priv, 0, &priv->m_dwGPSThread);
+
+ if (!priv->m_hGPSThread) {
+ priv->is_running = 0;
+ // error creating thread
+ MessageBox (NULL, TEXT ("Can not create GPS reader thread"), TEXT (""),
+ MB_APPLMODAL|MB_OK);
+ }
}
-static void
-vehicle_wince_disable_watch(struct vehicle_priv *priv)
-{
- int wait = 5000;
-
- dbg(lvl_debug, "enter");
-
- priv->is_running = 0;
- while (wait-- > 0 && priv->thread_up) {
- SwitchToThread();
- }
- if (priv->m_hGPSThread) {
- // Terminate reader, sorry
- TerminateThread(priv->m_hGPSThread, -1);
- }
+static void vehicle_wince_disable_watch(struct vehicle_priv *priv) {
+ int wait = 5000;
+
+ dbg(lvl_debug, "enter");
+
+ priv->is_running = 0;
+ while (wait-- > 0 && priv->thread_up) {
+ SwitchToThread();
+ }
+ if (priv->m_hGPSThread) {
+ // Terminate reader, sorry
+ TerminateThread(priv->m_hGPSThread, -1);
+ }
}
/**
* @brief Frees the wince_vehicle
- *
+ *
* @param priv vehicle_priv structure for the vehicle
*/
-static void
-vehicle_wince_destroy(struct vehicle_priv *priv)
-{
- vehicle_wince_disable_watch(priv);
- vehicle_wince_close(priv);
- if (priv->BthSetMode)
- {
- (void)priv->BthSetMode(0);
- FreeLibrary(priv->hBthDll);
- }
- if (priv->source)
- g_free(priv->source);
- if (priv->buffer)
- g_free(priv->buffer);
- if (priv->read_buffer)
- g_free(priv->read_buffer);
- g_free(priv);
+static void vehicle_wince_destroy(struct vehicle_priv *priv) {
+ vehicle_wince_disable_watch(priv);
+ vehicle_wince_close(priv);
+ if (priv->BthSetMode) {
+ (void)priv->BthSetMode(0);
+ FreeLibrary(priv->hBthDll);
+ }
+ if (priv->source)
+ g_free(priv->source);
+ if (priv->buffer)
+ g_free(priv->buffer);
+ if (priv->read_buffer)
+ g_free(priv->read_buffer);
+ g_free(priv);
}
/**
@@ -741,215 +775,210 @@ vehicle_wince_destroy(struct vehicle_priv *priv)
* @param priv vehicle_priv structure for the vehicle
* @param type The attribute type to retrieve
* @param attr Points to an attr structure that will receive the attribute data
- * @returns True for success, false for failure
+ *
+ * @return True for success, false for failure
*/
-static int
-vehicle_wince_position_attr_get(struct vehicle_priv *priv,
- enum attr_type type, struct attr *attr)
-{
- switch (type) {
- case attr_position_fix_type:
- attr->u.num = priv->status;
- break;
- case attr_position_height:
- attr->u.numd = &priv->height;
- break;
- case attr_position_speed:
- attr->u.numd = &priv->speed;
- break;
- case attr_position_direction:
- attr->u.numd = &priv->direction;
- break;
- case attr_position_magnetic_direction:
- attr->u.num = priv->magnetic_direction;
- break;
- case attr_position_hdop:
- attr->u.numd = &priv->hdop;
- break;
- case attr_position_qual:
- attr->u.num = priv->sats_visible;
- break;
- case attr_position_sats_signal:
- attr->u.num = priv->sats_signal;
- break;
- case attr_position_sats_used:
- attr->u.num = priv->sats_used;
- break;
- case attr_position_coord_geo:
- attr->u.coord_geo = &priv->geo;
- break;
- case attr_position_nmea:
- attr->u.str=priv->nmea_data;
- if (! attr->u.str)
- return 0;
- break;
- case attr_position_time_iso8601:
- if (!priv->fixyear || !priv->fixtime[0])
- return 0;
- sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ",
- priv->fixyear, priv->fixmonth, priv->fixday,
- priv->fixtime, (priv->fixtime+2), (priv->fixtime+4));
- attr->u.str=priv->fixiso8601;
- break;
- case attr_position_sat_item:
- dbg(lvl_debug,"at here\n");
- priv->sat_item.id_lo++;
- if (priv->sat_item.id_lo > priv->current_count) {
- priv->sat_item.id_lo=0;
- return 0;
- }
- attr->u.item=&priv->sat_item;
- break;
- case attr_position_valid:
- attr->u.num=priv->valid;
- break;
- default:
- return 0;
- }
- if (type != attr_position_sat_item)
- priv->sat_item.id_lo=0;
- attr->type = type;
- return 1;
+static int vehicle_wince_position_attr_get(struct vehicle_priv *priv,
+ enum attr_type type, struct attr *attr) {
+ switch (type) {
+ case attr_position_fix_type:
+ attr->u.num = priv->status;
+ break;
+ case attr_position_height:
+ attr->u.numd = &priv->height;
+ break;
+ case attr_position_speed:
+ attr->u.numd = &priv->speed;
+ break;
+ case attr_position_direction:
+ attr->u.numd = &priv->direction;
+ break;
+ case attr_position_magnetic_direction:
+ attr->u.num = priv->magnetic_direction;
+ break;
+ case attr_position_hdop:
+ attr->u.numd = &priv->hdop;
+ break;
+ case attr_position_qual:
+ attr->u.num = priv->sats_visible;
+ break;
+ case attr_position_sats_signal:
+ attr->u.num = priv->sats_signal;
+ break;
+ case attr_position_sats_used:
+ attr->u.num = priv->sats_used;
+ break;
+ case attr_position_coord_geo:
+ attr->u.coord_geo = &priv->geo;
+ break;
+ case attr_position_nmea:
+ attr->u.str=priv->nmea_data;
+ if (! attr->u.str)
+ return 0;
+ break;
+ case attr_position_time_iso8601:
+ if (!priv->fixyear || !priv->fixtime[0])
+ return 0;
+ sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ",
+ priv->fixyear, priv->fixmonth, priv->fixday,
+ priv->fixtime, (priv->fixtime+2), (priv->fixtime+4));
+ attr->u.str=priv->fixiso8601;
+ break;
+ case attr_position_sat_item:
+ dbg(lvl_debug,"at here");
+ priv->sat_item.id_lo++;
+ if (priv->sat_item.id_lo > priv->current_count) {
+ priv->sat_item.id_lo=0;
+ return 0;
+ }
+ attr->u.item=&priv->sat_item;
+ break;
+ case attr_position_valid:
+ attr->u.num=priv->valid;
+ break;
+ default:
+ return 0;
+ }
+ if (type != attr_position_sat_item)
+ priv->sat_item.id_lo=0;
+ attr->type = type;
+ return 1;
}
-static int
-vehicle_wince_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr)
-{
- struct vehicle_priv *priv=priv_data;
- struct gps_sat *sat;
-
- if (priv->sat_item.id_lo < 1)
- return 0;
- if (priv->sat_item.id_lo > priv->current_count)
- return 0;
- sat=&priv->current[priv->sat_item.id_lo-1];
- switch (type) {
- case attr_sat_prn:
- attr->u.num=sat->prn;
- break;
- case attr_sat_elevation:
- attr->u.num=sat->elevation;
- break;
- case attr_sat_azimuth:
- attr->u.num=sat->azimuth;
- break;
- case attr_sat_snr:
- attr->u.num=sat->snr;
- break;
- default:
- return 0;
- }
- attr->type = type;
- return 1;
+static int vehicle_wince_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) {
+ struct vehicle_priv *priv=priv_data;
+ struct gps_sat *sat;
+
+ if (priv->sat_item.id_lo < 1)
+ return 0;
+ if (priv->sat_item.id_lo > priv->current_count)
+ return 0;
+ sat=&priv->current[priv->sat_item.id_lo-1];
+ switch (type) {
+ case attr_sat_prn:
+ attr->u.num=sat->prn;
+ break;
+ case attr_sat_elevation:
+ attr->u.num=sat->elevation;
+ break;
+ case attr_sat_azimuth:
+ attr->u.num=sat->azimuth;
+ break;
+ case attr_sat_snr:
+ attr->u.num=sat->snr;
+ break;
+ default:
+ return 0;
+ }
+ attr->type = type;
+ return 1;
}
static struct item_methods vehicle_wince_sat_methods = {
- NULL,
- NULL,
- NULL,
- vehicle_wince_sat_attr_get,
- NULL,
- NULL,
- NULL,
- NULL,
+ NULL,
+ NULL,
+ NULL,
+ vehicle_wince_sat_attr_get,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
};
struct vehicle_methods vehicle_wince_methods = {
- vehicle_wince_destroy,
- vehicle_wince_position_attr_get,
- NULL,
+ vehicle_wince_destroy,
+ vehicle_wince_position_attr_get,
+ NULL,
};
/**
* @brief Creates a new wince_vehicle
- *
- * @param meth
- * @param cbl
- * @param attrs
- * @returns vehicle_priv
+ *
+ * @param meth ?
+ * @param cbl ?
+ * @param attrs ?
+ *
+ * @return vehicle_priv
*/
-static struct vehicle_priv *
-vehicle_wince_new(struct vehicle_methods
- *meth, struct callback_list
- *cbl, struct attr **attrs)
-{
- struct vehicle_priv *ret;
- struct attr *source;
- struct attr *time;
- struct attr *on_eof;
- struct attr *baudrate;
- struct attr *checksum_ignore;
- struct attr *handle_bluetooth;
- char *cp;
-
- dbg(lvl_debug, "enter\n");
- source = attr_search(attrs, NULL, attr_source);
- ret = g_new0(struct vehicle_priv, 1);
- ret->fd = -1;
- ret->cbl = cbl;
-
- ret->file_type = file_type_device;
- cp = strchr(source->u.str,':');
- if (cp)
- {
- if ( strncmp(source->u.str, "file", 4) == 0 )
- ret->file_type = file_type_file;
- cp++;
- }
- else
- cp = source->u.str;
- ret->source = g_strdup(cp);
- ret->buffer = g_malloc(buffer_size);
- ret->time=1000;
- ret->baudrate=0; // do not change the rate if not configured
-
- time = attr_search(attrs, NULL, attr_time);
- if (time)
- ret->time=time->u.num;
- baudrate = attr_search(attrs, NULL, attr_baudrate);
- if (baudrate) {
- ret->baudrate = baudrate->u.num;
- }
- checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore);
- if (checksum_ignore)
- ret->checksum_ignore=checksum_ignore->u.num;
- ret->attrs = attrs;
- on_eof = attr_search(attrs, NULL, attr_on_eof);
- if (on_eof && !g_strcasecmp(on_eof->u.str, "stop"))
- ret->on_eof=1;
- if (on_eof && !g_strcasecmp(on_eof->u.str, "exit"))
- ret->on_eof=2;
- dbg(lvl_debug,"on_eof=%d\n", ret->on_eof);
- *meth = vehicle_wince_methods;
- ret->priv_cbl = callback_list_new();
- callback_list_add(ret->priv_cbl, callback_new_1(callback_cast(vehicle_wince_io), ret));
- ret->sat_item.type=type_position_sat;
- ret->sat_item.id_hi=ret->sat_item.id_lo=0;
- ret->sat_item.priv_data=ret;
- ret->sat_item.meth=&vehicle_wince_sat_methods;
-
- ret->read_buffer = g_malloc(buffer_size);
-
- handle_bluetooth = attr_search(attrs, NULL, attr_bluetooth);
- if ( handle_bluetooth && handle_bluetooth->u.num == 1 )
- initBth(ret);
-
- if (vehicle_wince_open(ret)) {
- vehicle_wince_enable_watch(ret);
- return ret;
- }
- dbg(lvl_error, "Failed to open '%s'\n", ret->source);
- vehicle_wince_destroy(ret);
- return NULL;
+static struct vehicle_priv *vehicle_wince_new(struct vehicle_methods
+ *meth, struct callback_list
+ *cbl, struct attr **attrs) {
+ struct vehicle_priv *ret;
+ struct attr *source;
+ struct attr *time;
+ struct attr *on_eof;
+ struct attr *baudrate;
+ struct attr *checksum_ignore;
+ struct attr *handle_bluetooth;
+ char *cp;
+
+ dbg(lvl_debug, "enter");
+ source = attr_search(attrs, NULL, attr_source);
+ ret = g_new0(struct vehicle_priv, 1);
+ ret->fd = -1;
+ ret->cbl = cbl;
+
+ ret->file_type = file_type_device;
+ cp = strchr(source->u.str,':');
+ if (cp) {
+ if ( strncmp(source->u.str, "file", 4) == 0 )
+ ret->file_type = file_type_file;
+ cp++;
+ } else
+ cp = source->u.str;
+ ret->source = g_strdup(cp);
+ ret->buffer = g_malloc(buffer_size);
+ ret->time=1000;
+ ret->baudrate=0; // do not change the rate if not configured
+ ret->fixtime[0] = '\0';
+ ret->ev_fix_timeout = NULL;
+
+ time = attr_search(attrs, NULL, attr_time);
+ if (time)
+ ret->time=time->u.num;
+ baudrate = attr_search(attrs, NULL, attr_baudrate);
+ if (baudrate) {
+ ret->baudrate = baudrate->u.num;
+ }
+ checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore);
+ if (checksum_ignore)
+ ret->checksum_ignore=checksum_ignore->u.num;
+ ret->attrs = attrs;
+ on_eof = attr_search(attrs, NULL, attr_on_eof);
+ if (on_eof && !g_strcasecmp(on_eof->u.str, "stop"))
+ ret->on_eof=1;
+ if (on_eof && !g_strcasecmp(on_eof->u.str, "exit"))
+ ret->on_eof=2;
+ dbg(lvl_debug,"on_eof=%d", ret->on_eof);
+ *meth = vehicle_wince_methods;
+ ret->priv_cbl = callback_list_new();
+ callback_list_add(ret->priv_cbl, callback_new_1(callback_cast(vehicle_wince_io), ret));
+ ret->cb_fix_timeout=callback_new_1(callback_cast(vehicle_wince_fix_timeout_cb), ret);
+ ret->sat_item.type=type_position_sat;
+ ret->sat_item.id_hi=ret->sat_item.id_lo=0;
+ ret->sat_item.priv_data=ret;
+ ret->sat_item.meth=&vehicle_wince_sat_methods;
+
+ ret->read_buffer = g_malloc(buffer_size);
+
+ handle_bluetooth = attr_search(attrs, NULL, attr_bluetooth);
+ if ( handle_bluetooth && handle_bluetooth->u.num == 1 )
+ initBth(ret);
+
+ if (vehicle_wince_open(ret)) {
+ vehicle_wince_enable_watch(ret);
+ return ret;
+ }
+ dbg(lvl_error, "Failed to open '%s'", ret->source);
+ vehicle_wince_destroy(ret);
+ return NULL;
}
/**
* @brief Registers the vehicle_wince plugin
*/
-void
-plugin_init(void)
-{
- dbg(lvl_debug, "enter\n");
- plugin_register_category_vehicle("wince", vehicle_wince_new);
- plugin_register_category_vehicle("file", vehicle_wince_new);
+void plugin_init(void) {
+ dbg(lvl_debug, "enter");
+ plugin_register_category_vehicle("wince", vehicle_wince_new);
+ plugin_register_category_vehicle("file", vehicle_wince_new);
}