diff options
Diffstat (limited to 'navit/vehicle/qt5/vehicle_qt5.cpp')
-rw-r--r-- | navit/vehicle/qt5/vehicle_qt5.cpp | 128 |
1 files changed, 68 insertions, 60 deletions
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); } |