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/QLoggingCategory>
4#include <QtCore/QObject>
5#include <QtPositioning/QGeoCoordinate>
6#include <QtPositioning/QGeoPositionInfo>
7#include <QtQmlIntegration/QtQmlIntegration>
8
9Q_DECLARE_LOGGING_CATEGORY(QGCPositionManagerLog)
10
11class QGeoPositionInfoSource;
12class QNmeaPositionInfoSource;
13class QGCCompass;
14
15class QGCPositionManager : public QObject
16{
17 Q_OBJECT
18 QML_ELEMENT
19 QML_UNCREATABLE("")
20
21 Q_PROPERTY(QGeoCoordinate gcsPosition READ gcsPosition NOTIFY gcsPositionChanged)
22 Q_PROPERTY(qreal gcsHeading READ gcsHeading NOTIFY gcsHeadingChanged)
23 Q_PROPERTY(qreal gcsPositionHorizontalAccuracy READ gcsPositionHorizontalAccuracy NOTIFY gcsPositionHorizontalAccuracyChanged)
24
25public:
26 explicit QGCPositionManager(QObject *parent = nullptr);
28
31 static QGCPositionManager *instance();
32
33 void init();
34 QGeoCoordinate gcsPosition() const { return _gcsPosition; }
35 qreal gcsHeading() const { return _gcsHeading; }
36 qreal gcsPositionHorizontalAccuracy() const { return _gcsPositionHorizontalAccuracy; }
37 QGeoPositionInfo geoPositionInfo() const { return _geoPositionInfo; }
38 int updateInterval() const { return _updateInterval; }
39
40 void setNmeaSourceDevice(QIODevice *device);
41
42signals:
43 void gcsPositionChanged(QGeoCoordinate gcsPosition);
44 void gcsHeadingChanged(qreal gcsHeading);
45 void positionInfoUpdated(QGeoPositionInfo update);
46 void gcsPositionHorizontalAccuracyChanged(qreal gcsPositionHorizontalAccuracy);
47
48private slots:
49 void _positionUpdated(const QGeoPositionInfo &update);
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 QGeoCoordinate _gcsPosition;
72 qreal _gcsHeading = qQNaN();
73 qreal _gcsPositionHorizontalAccuracy = std::numeric_limits<qreal>::infinity();
74 qreal _gcsPositionVerticalAccuracy = std::numeric_limits<qreal>::infinity();
75 qreal _gcsPositionAccuracy = std::numeric_limits<qreal>::infinity();
76 qreal _gcsDirectionAccuracy = std::numeric_limits<qreal>::infinity();
77
78 QGeoPositionInfoSource *_currentSource = nullptr;
79 QGeoPositionInfoSource *_defaultSource = nullptr;
80 QNmeaPositionInfoSource *_nmeaSource = nullptr;
81 QGeoPositionInfoSource *_simulatedSource = nullptr;
82
83 QGCCompass *_compass = nullptr;
84
85 static constexpr qreal kMinHorizonalAccuracyMeters = 100.;
86 static constexpr qreal kMinVerticalAccuracyMeters = 10.;
87 static constexpr qreal kMinDirectionAccuracyDegrees = 30.;
88};
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
void gcsPositionChanged(QGeoCoordinate gcsPosition)
void gcsPositionHorizontalAccuracyChanged(qreal gcsPositionHorizontalAccuracy)
void positionInfoUpdated(QGeoPositionInfo update)
void gcsHeadingChanged(qreal gcsHeading)