summaryrefslogtreecommitdiff
path: root/navit/vehicle/gypsy/vehicle_gypsy.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/vehicle/gypsy/vehicle_gypsy.c')
-rw-r--r--navit/vehicle/gypsy/vehicle_gypsy.c617
1 files changed, 297 insertions, 320 deletions
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);
}