diff options
author | Stefan Wildemann <metalstrolch@metalstrolche.de> | 2015-11-22 20:06:02 +0100 |
---|---|---|
committer | Stefan Wildemann <gta04@metalstrolche.de> | 2017-02-23 19:40:26 +0100 |
commit | 2ef6a502c3afb86faf014cf32f94dc00b9ae581d (patch) | |
tree | 77b5e8a58769c0452733b39158cf0926b306e6d4 /navit/vehicle | |
parent | f0fc887283073f17764f690112e2bb961c371961 (diff) | |
download | navit-2ef6a502c3afb86faf014cf32f94dc00b9ae581d.tar.gz |
Add Qt5 based vehicle
Diffstat (limited to 'navit/vehicle')
-rw-r--r-- | navit/vehicle/qt5/CMakeLists.txt | 6 | ||||
-rw-r--r-- | navit/vehicle/qt5/Makefile.am | 9 | ||||
-rw-r--r-- | navit/vehicle/qt5/vehicle_qt5.cpp | 289 | ||||
-rw-r--r-- | navit/vehicle/qt5/vehicle_qt5.h | 58 |
4 files changed, 362 insertions, 0 deletions
diff --git a/navit/vehicle/qt5/CMakeLists.txt b/navit/vehicle/qt5/CMakeLists.txt new file mode 100644 index 000000000..411d9d6ee --- /dev/null +++ b/navit/vehicle/qt5/CMakeLists.txt @@ -0,0 +1,6 @@ +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Instruct CMake to run moc automatically when needed. +set(CMAKE_AUTOMOC ON) + +module_add_library(vehicle_qt5 vehicle_qt5.cpp) diff --git a/navit/vehicle/qt5/Makefile.am b/navit/vehicle/qt5/Makefile.am new file mode 100644 index 000000000..b4c0ebb92 --- /dev/null +++ b/navit/vehicle/qt5/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_qt5 +if PLUGINS + modulevehicle_LTLIBRARIES = libvehicle_qt5.la +else + noinst_LTLIBRARIES = libvehicle_qt5.la +endif +libvehicle_null_la_SOURCES = vehicle_qt5.cpp +libvehicle_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/vehicle/qt5/vehicle_qt5.cpp b/navit/vehicle/qt5/vehicle_qt5.cpp new file mode 100644 index 000000000..a69d633e3 --- /dev/null +++ b/navit/vehicle/qt5/vehicle_qt5.cpp @@ -0,0 +1,289 @@ +/** @file vehicle_null.c + * @brief null uses dbus signals + * + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * @Author Tim Niemeyer <reddog@mastersword.de> + * @date 2008-2009 + */ + +#include "vehicle_qt5.h" +#include "vehicle_qt5.moc" + +QNavitGeoReceiver::QNavitGeoReceiver (QObject * parent, struct vehicle_priv * c):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> &))); + } +} +void QNavitGeoReceiver::satellitesInUseUpdated(const QList<QGeoSatelliteInfo> & sats) +{ + dbg(lvl_debug, "Sats in use: %d\n", 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()); + priv->sats = sats.count(); + callback_list_call_attr_0(priv->cbl, attr_position_qual); +} + +void QNavitGeoReceiver::positionUpdated(const QGeoPositionInfo &info) +{ + if(info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + { + dbg(lvl_debug,"Horizontal acc (%f)\n",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)); + 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)); + priv->direction = info.attribute(QGeoPositionInfo::Direction); + callback_list_call_attr_0(priv->cbl, attr_position_direction); + } + + switch(info.coordinate().type()) + { + case QGeoCoordinate::Coordinate3D: + priv->fix_type = 2; + break; + case QGeoCoordinate::Coordinate2D: + priv->fix_type = 1; + break; + case QGeoCoordinate::InvalidCoordinate: + priv->fix_type = 0; + break; + } + + + if(info.coordinate().isValid()) + { + dbg(lvl_debug, "Got valid coordinate (lat %f, lon %f)\n", 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()); + priv->height = info.coordinate().altitude(); + } + //dbg(lvl_debug, "Time %s\n", 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); + } + else + { + dbg(lvl_debug, "Got invalid coordinate\n"); + priv->have_coords = 0; + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + } +} + + +/** + * @brief Free the null_vehicle + * + * @param priv + * @returns nothing + */ +static void +vehicle_qt5_destroy(struct vehicle_priv *priv) +{ + dbg(lvl_debug,"enter\n"); + if(priv->receiver != NULL) + delete priv->receiver; + if(priv->source != NULL) + delete 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_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)); + switch (type) { + case attr_position_valid: + attr->u.num = priv->have_coords; + break; + 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->have_coords) + return 0; + 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_debug,"Fix Time: %s\n", priv->fixiso8601); + } + else { + //dbg(lvl_debug,"Fix Time: 0\n"); + 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; + } + dbg(lvl_debug,"ok\n"); + attr->type = type; + return 1; +} + +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; + 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_qt5_destroy, + vehicle_qt5_position_attr_get, + vehicle_qt5_set_attr, +}; + +/** + * @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) +{ + struct vehicle_priv *ret; + + dbg(lvl_debug, "enter\n"); + ret = g_new0(struct vehicle_priv, 1); + ret->cbl = cbl; + *meth = vehicle_null_methods; + ret->attrs = attrs; + ret->source = QGeoPositionInfoSource::createDefaultSource(NULL); + ret->satellites = QGeoSatelliteInfoSource::createDefaultSource(NULL); + if(ret->source == NULL) + { + dbg(lvl_error, "Got NO QGeoPositionInfoSource\n"); + } + else + { + dbg(lvl_debug, "Using %s\n", ret->source->sourceName().toLatin1().data()); + ret->receiver = new QNavitGeoReceiver(NULL,ret); + ret->satellites->setUpdateInterval(1000); + ret->satellites->startUpdates(); + ret->source->setUpdateInterval(500); + ret->source->startUpdates(); + } + dbg(lvl_debug, "return\n"); + return ret; +} + +/** + * @brief register vehicle_null + * + * @returns nothing + */ +void +plugin_init(void) +{ + dbg(lvl_debug, "enter\n"); + plugin_register_vehicle_type("qt5", vehicle_qt5_new_qt5); +} diff --git a/navit/vehicle/qt5/vehicle_qt5.h b/navit/vehicle/qt5/vehicle_qt5.h new file mode 100644 index 000000000..c38c45284 --- /dev/null +++ b/navit/vehicle/qt5/vehicle_qt5.h @@ -0,0 +1,58 @@ +#ifndef __vehicle_qt5_h +#define __vehicle_qt5_h + +#include <config.h> +#include <string.h> +#include <glib.h> +#include <math.h> +#include <time.h> +#include "debug.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" + +#include <QObject> +#include <QStringList> +#include <QGeoPositionInfoSource> +#include <QGeoSatelliteInfoSource> + +#include "callback.h" + +#include <QObject> + +class QNavitGeoReceiver; +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; + + QGeoPositionInfoSource *source; + QGeoSatelliteInfoSource *satellites; + QNavitGeoReceiver * receiver; +}; + +class QNavitGeoReceiver : public QObject +{ + Q_OBJECT +public: + QNavitGeoReceiver (QObject * parent, struct vehicle_priv * c); +public slots: + void positionUpdated(const QGeoPositionInfo &info); + void satellitesInUseUpdated(const QList<QGeoSatelliteInfo> & satellites); + void satellitesInViewUpdated(const QList<QGeoSatelliteInfo> & satellites); + +private: + struct vehicle_priv * priv; +}; +#endif
\ No newline at end of file |