QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
PositionManager.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QDateTime>
4#include <QtCore/QObject>
5#include <QtPositioning/QGeoCoordinate>
6#include <QtPositioning/QGeoPositionInfo>
7#include <QtPositioning/QGeoPositionInfoSource>
8#include <QtQmlIntegration/QtQmlIntegration>
9
10class QNmeaPositionInfoSource;
11class QGCCompass;
12
13class QGCPositionManager : public QObject
14{
15 Q_OBJECT
16 QML_ELEMENT
17 QML_UNCREATABLE("")
18
19 Q_PROPERTY(QGeoCoordinate gcsPosition READ gcsPosition NOTIFY gcsPositionChanged)
20 Q_PROPERTY(qreal gcsHeading READ gcsHeading NOTIFY gcsHeadingChanged)
22
23public:
24 explicit QGCPositionManager(QObject *parent = nullptr);
26
30
31 void init();
32 QGeoCoordinate gcsPosition() const { return _gcsPosition; }
33 qreal gcsHeading() const { return _gcsHeading; }
34 qreal gcsPositionHorizontalAccuracy() const { return _gcsPositionHorizontalAccuracy; }
35 QGeoPositionInfo geoPositionInfo() const { return _geoPositionInfo; }
36 QGeoPositionInfoSource::Error gcsPositioningError() const { return _gcsPositioningError; }
37
43 QDateTime gcsPositionTimestamp() const { return _gcsPositionTimestamp; }
44
45 int updateInterval() const { return _updateInterval; }
46
47 void setNmeaSourceDevice(QIODevice *device);
51
52signals:
53 void gcsPositionChanged(QGeoCoordinate gcsPosition);
55 void positionInfoUpdated(QGeoPositionInfo update);
57
58private slots:
59 void _positionUpdated(const QGeoPositionInfo &update);
60 void _positionError(QGeoPositionInfoSource::Error gcsPositioningError);
61
62private:
63 enum QGCPositionSource {
64 Simulated,
65 InternalGPS,
66 Log,
67 NmeaGPS,
68 ExternalGPS
69 };
70
71 void _setPositionSource(QGCPositionSource source);
72 void _setupPositionSources();
73 void _handlePermissionStatus(Qt::PermissionStatus permissionStatus);
74 void _checkPermission();
75 void _setGCSHeading(qreal newGCSHeading);
76 void _setGCSPosition(const QGeoCoordinate &newGCSPosition);
77
78 bool _usingPluginSource = false;
79 int _updateInterval = 0;
80
81 QGeoPositionInfo _geoPositionInfo;
82 QGeoPositionInfoSource::Error _gcsPositioningError = QGeoPositionInfoSource::NoError;
83
84 QGeoCoordinate _gcsPosition;
85 QDateTime _gcsPositionTimestamp;
86 qreal _gcsHeading = qQNaN();
87 qreal _gcsPositionHorizontalAccuracy = std::numeric_limits<qreal>::infinity();
88 qreal _gcsPositionVerticalAccuracy = std::numeric_limits<qreal>::infinity();
89 qreal _gcsPositionAccuracy = std::numeric_limits<qreal>::infinity();
90 qreal _gcsDirectionAccuracy = std::numeric_limits<qreal>::infinity();
91
92 QGeoPositionInfoSource *_currentSource = nullptr;
93 QGeoPositionInfoSource *_defaultSource = nullptr;
94 QNmeaPositionInfoSource *_nmeaSource = nullptr;
95 QGeoPositionInfoSource *_simulatedSource = nullptr;
96
97 QGCCompass *_compass = nullptr;
98
99 static constexpr qreal kMinHorizonalAccuracyMeters = 100.;
100 static constexpr qreal kMinVerticalAccuracyMeters = 10.;
101 static constexpr qreal kMinDirectionAccuracyDegrees = 30.;
102};
qreal gcsHeading() const
QGeoPositionInfo geoPositionInfo() const
qreal gcsPositionHorizontalAccuracy() const
static QGCPositionManager * instance()
QDateTime gcsPositionTimestamp() const
QGeoCoordinate gcsPosition() const
void gcsPositionChanged(QGeoCoordinate gcsPosition)
QGeoPositionInfoSource::Error gcsPositioningError() const
void setNmeaSourceDevice(QIODevice *device)
void gcsPositionHorizontalAccuracyChanged(qreal gcsPositionHorizontalAccuracy)
void positionInfoUpdated(QGeoPositionInfo update)
int updateInterval() const
void gcsHeadingChanged(qreal gcsHeading)