summaryrefslogtreecommitdiff
path: root/src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2019-05-10 19:55:33 +0200
committerpaolo <paolo.angelelli@qt.io>2019-08-15 10:08:13 +0200
commitf613eb3a6031d6d4f3e5ee230fab3056314fa9a4 (patch)
tree804e4d47b2eed988c1af0847f023b81dae4afc96 /src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp
parent3334c6f6d00255f6fd5690e4b9cb05416950fd4d (diff)
downloadqtlocation-f613eb3a6031d6d4f3e5ee230fab3056314fa9a4.tar.gz
Add Satellite support to serialnmea plugin
This adds a new class, QNmeaSatelliteInfoSource, locally to the plugin, that behaves similarly to QNmeaPositionInfoSource in the way of handling the IODevice and producing the updates. Change-Id: Id594152dd70514974ac79c7757ce6f0da4631191 Fixes: QTBUG-59274 Reviewed-by: Paolo Angelelli <paolo.angelelli@qt.io>
Diffstat (limited to 'src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp')
-rw-r--r--src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp67
1 files changed, 64 insertions, 3 deletions
diff --git a/src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp b/src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp
index bebf7230..d56f1d46 100644
--- a/src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp
+++ b/src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp
@@ -45,6 +45,7 @@
#include <QSet>
#include "qiopipe_p.h"
#include <QSharedPointer>
+#include "qnmeasatelliteinfosource_p.h"
Q_LOGGING_CATEGORY(lcSerial, "qt.positioning.serialnmea")
@@ -172,6 +173,67 @@ NmeaSource::~NmeaSource()
deviceContainer->releaseSerial(m_portName, m_port);
}
+
+
+class NmeaSatelliteSource : public QNmeaSatelliteInfoSource
+{
+public:
+ NmeaSatelliteSource(QObject *parent, const QVariantMap &parameters)
+ : QNmeaSatelliteInfoSource(parent)
+ {
+ QByteArray requestedPort;
+ if (parameters.contains(QStringLiteral("serialnmea.serial_port")))
+ requestedPort = parameters.value(QStringLiteral("serialnmea.serial_port")).toString().toLatin1();
+ else
+ requestedPort = qgetenv("QT_NMEA_SERIAL_PORT");
+ QString portName;
+ if (requestedPort.isEmpty()) {
+ const QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
+ qCDebug(lcSerial) << "Found" << ports.count() << "serial ports";
+ if (ports.isEmpty()) {
+ qWarning("serialnmea: No serial ports found");
+ return;
+ }
+
+ // Try to find a well-known device.
+ QSet<int> supportedDevices;
+ supportedDevices << 0x67b; // GlobalSat (BU-353S4 and probably others)
+ supportedDevices << 0xe8d; // Qstarz MTK II
+ foreach (const QSerialPortInfo& port, ports) {
+ if (port.hasVendorIdentifier() && supportedDevices.contains(port.vendorIdentifier())) {
+ portName = port.portName();
+ break;
+ }
+ }
+
+ if (portName.isEmpty()) {
+ qWarning("serialnmea: No known GPS device found. Specify the COM port via QT_NMEA_SERIAL_PORT.");
+ return;
+ }
+ m_portName = portName;
+ } else {
+ m_portName = QString::fromUtf8(requestedPort);
+ }
+
+ m_port = deviceContainer->serial(m_portName);
+ if (!m_port)
+ return;
+
+ setDevice(m_port.data());
+ }
+
+ ~NmeaSatelliteSource()
+ {
+ deviceContainer->releaseSerial(m_portName, m_port);
+ }
+
+ bool isValid() const { return !m_port.isNull(); }
+
+private:
+ QSharedPointer<QIOPipe> m_port;
+ QString m_portName;
+};
+
QGeoPositionInfoSource *QGeoPositionInfoSourceFactorySerialNmea::positionInfoSource(QObject *parent)
{
return positionInfoSourceWithParameters(parent, QVariantMap());
@@ -195,9 +257,8 @@ QGeoPositionInfoSource *QGeoPositionInfoSourceFactorySerialNmea::positionInfoSou
QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactorySerialNmea::satelliteInfoSourceWithParameters(QObject *parent, const QVariantMap &parameters)
{
- Q_UNUSED(parent);
- Q_UNUSED(parameters)
- return nullptr;
+ QScopedPointer<NmeaSatelliteSource> src(new NmeaSatelliteSource(parent, parameters));
+ return src->isValid() ? src.take() : nullptr;
}
QGeoAreaMonitorSource *QGeoPositionInfoSourceFactorySerialNmea::areaMonitorWithParameters(QObject *parent, const QVariantMap &parameters)