diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2019-05-10 19:55:33 +0200 |
---|---|---|
committer | paolo <paolo.angelelli@qt.io> | 2019-08-15 10:08:13 +0200 |
commit | f613eb3a6031d6d4f3e5ee230fab3056314fa9a4 (patch) | |
tree | 804e4d47b2eed988c1af0847f023b81dae4afc96 /src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp | |
parent | 3334c6f6d00255f6fd5690e4b9cb05416950fd4d (diff) | |
download | qtlocation-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.cpp | 67 |
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 ¶meters) + : 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 ¶meters) { - 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 ¶meters) |