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/QObject>
4#include <QtPositioning/QGeoCoordinate>
5#include <QtPositioning/QGeoPositionInfo>
6#include <QtPositioning/QGeoPositionInfoSource>
7#include <QtQmlIntegration/QtQmlIntegration>
8
9class QNmeaPositionInfoSource;
10class QGCCompass;
11
12class QGCPositionManager : public QObject
13{
14 Q_OBJECT
15 QML_ELEMENT
16 QML_UNCREATABLE("")
17
18 Q_PROPERTY(QGeoCoordinate gcsPosition READ gcsPosition NOTIFY gcsPositionChanged)
19 Q_PROPERTY(qreal gcsHeading READ gcsHeading NOTIFY gcsHeadingChanged)
21
22public:
23 explicit QGCPositionManager(QObject *parent = nullptr);
25
29
30 void init();
31 QGeoCoordinate gcsPosition() const { return _gcsPosition; }
32 qreal gcsHeading() const { return _gcsHeading; }
33 qreal gcsPositionHorizontalAccuracy() const { return _gcsPositionHorizontalAccuracy; }
34 QGeoPositionInfo geoPositionInfo() const { return _geoPositionInfo; }
35 QGeoPositionInfoSource::Error gcsPositioningError() const { return _gcsPositioningError; }
36
37 int updateInterval() const { return _updateInterval; }
38
39 void setNmeaSourceDevice(QIODevice *device);
40
41signals:
42 void gcsPositionChanged(QGeoCoordinate gcsPosition);
44 void positionInfoUpdated(QGeoPositionInfo update);
46
47private slots:
48 void _positionUpdated(const QGeoPositionInfo &update);
49 void _positionError(QGeoPositionInfoSource::Error gcsPositioningError);
50
51private:
52 enum QGCPositionSource {
53 Simulated,
54 InternalGPS,
55 Log,
56 NmeaGPS,
57 ExternalGPS
58 };
59
60 void _setPositionSource(QGCPositionSource source);
61 void _setupPositionSources();
62 void _handlePermissionStatus(Qt::PermissionStatus permissionStatus);
63 void _checkPermission();
64 void _setGCSHeading(qreal newGCSHeading);
65 void _setGCSPosition(const QGeoCoordinate &newGCSPosition);
66
67 bool _usingPluginSource = false;
68 int _updateInterval = 0;
69
70 QGeoPositionInfo _geoPositionInfo;
71 QGeoPositionInfoSource::Error _gcsPositioningError = QGeoPositionInfoSource::NoError;
72
73 QGeoCoordinate _gcsPosition;
74 qreal _gcsHeading = qQNaN();
75 qreal _gcsPositionHorizontalAccuracy = std::numeric_limits<qreal>::infinity();
76 qreal _gcsPositionVerticalAccuracy = std::numeric_limits<qreal>::infinity();
77 qreal _gcsPositionAccuracy = std::numeric_limits<qreal>::infinity();
78 qreal _gcsDirectionAccuracy = std::numeric_limits<qreal>::infinity();
79
80 QGeoPositionInfoSource *_currentSource = nullptr;
81 QGeoPositionInfoSource *_defaultSource = nullptr;
82 QNmeaPositionInfoSource *_nmeaSource = nullptr;
83 QGeoPositionInfoSource *_simulatedSource = nullptr;
84
85 QGCCompass *_compass = nullptr;
86
87 static constexpr qreal kMinHorizonalAccuracyMeters = 100.;
88 static constexpr qreal kMinVerticalAccuracyMeters = 10.;
89 static constexpr qreal kMinDirectionAccuracyDegrees = 30.;
90};
qreal gcsHeading() const
QGeoPositionInfo geoPositionInfo() const
qreal gcsPositionHorizontalAccuracy() const
static QGCPositionManager * instance()
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)