summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Wildemann <metalstrolch@metalstrolche.de>2015-11-22 20:06:02 +0100
committerStefan Wildemann <gta04@metalstrolche.de>2017-02-23 19:40:26 +0100
commit2ef6a502c3afb86faf014cf32f94dc00b9ae581d (patch)
tree77b5e8a58769c0452733b39158cf0926b306e6d4
parentf0fc887283073f17764f690112e2bb961c371961 (diff)
downloadnavit-2ef6a502c3afb86faf014cf32f94dc00b9ae581d.tar.gz
Add Qt5 based vehicle
-rwxr-xr-xCMakeLists.txt8
-rw-r--r--navit/vehicle/qt5/CMakeLists.txt6
-rw-r--r--navit/vehicle/qt5/Makefile.am9
-rw-r--r--navit/vehicle/qt5/vehicle_qt5.cpp289
-rw-r--r--navit/vehicle/qt5/vehicle_qt5.h58
5 files changed, 370 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a240b6630..168275814 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -99,6 +99,7 @@ add_module(binding/python "python libraries not found" FALSE)
add_module(speech/dbus "dbus-glib-1 not found" FALSE)
add_module(speech/cmdline "neither system() nor CreateProcess() found" FALSE)
add_module(vehicle/gpsd_dbus "dbus-glib-1 not found" FALSE)
+add_module(vehicle/qt5 "Qt5 libraries not found" FALSE)
add_module(speech/speech_dispatcher "speech_dispatcher lib not found" FALSE)
add_module(autoload/osso "Default" FALSE)
add_module(map/garmin "Garmin library not found" FALSE)
@@ -158,6 +159,8 @@ libfind_pkg_check_modules(FONTCONFIG fontconfig)
if (NOT DISABLE_QT)
find_package(Qt5Widgets)
find_package(Qt5Svg)
+ find_package(Qt5Positioning)
+ find_package(Qt5Sensors)
#find_package(Qt5Declarative)
if (Qt5Widgets_FOUND)
else (Qt5Widgets_FOUND)
@@ -314,6 +317,11 @@ if (Qt5Widgets_FOUND)
${Qt5Declarative_LIBRARIES}
${Qt5Svg_LIBRARIES})
endif ()
+if (Qt5Positioning_FOUND)
+ set_with_reason(vehicle/qt5 "Qt5 Positioning found" TRUE
+ ${Qt5Positioning_LIBRARIES}
+ ${Qt5Sensors_LIBRARIES})
+endif ()
if(GTK2_FOUND)
# Include gtk.h with "SYSTEM" to avoid GCC compiler warning for gtkitemfactory.h.
include_directories(SYSTEM ${GTK2_GTK_INCLUDE_DIR})
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