QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GPSReceiverReports.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4#include <cstdint>
5#include <limits>
6#include <optional>
7
8#include <QtCore/QObject>
9
10#include "GPSReceiverConfig.h"
11#include "MonotonicClock.h"
12
13namespace GPSFixQualities {
14Q_NAMESPACE
15
16enum class GPSFixQuality
17{
18 Unknown = 0,
19 NoFix = 1,
20 Fix2D = 2,
21 Fix3D = 3,
22 Differential = 4,
23 RTKFloat = 5,
24 RTKFixed = 6,
25 Extrapolated = 8,
26};
27Q_ENUM_NS(GPSFixQuality)
28
29} // namespace GPSFixQualities
30
32
33[[nodiscard]] constexpr GPSFixQuality gpsFixQualityFromValue(int value)
34{
35 return (value >= static_cast<int>(GPSFixQuality::Unknown) && value <= static_cast<int>(GPSFixQuality::RTKFixed)) ||
36 value == static_cast<int>(GPSFixQuality::Extrapolated)
37 ? static_cast<GPSFixQuality>(value)
38 : GPSFixQuality::Unknown;
39}
40
42{
43 Unknown,
44 GPS,
45 GLONASS,
46 Galileo,
47 BeiDou,
48 QZSS,
49 SBAS,
50 NavIC
51};
52
54{
55 enum class JammingState
56 {
57 Unknown,
58 Ok,
59 Warning,
61 };
62 enum class SpoofingState
63 {
64 Unknown,
65 None,
68 };
70 enum class AntennaState
71 {
72 Unknown,
73 Ok,
74 Open,
75 Short
76 };
77
78 [[nodiscard]] static constexpr JammingState jammingStateFromValue(int value)
79 {
80 return value >= static_cast<int>(JammingState::Unknown) && value <= static_cast<int>(JammingState::Critical)
81 ? static_cast<JammingState>(value)
83 }
84
85 [[nodiscard]] static constexpr SpoofingState spoofingStateFromValue(int value)
86 {
87 return value >= static_cast<int>(SpoofingState::Unknown) && value <= static_cast<int>(SpoofingState::Multiple)
88 ? static_cast<SpoofingState>(value)
90 }
91
97
103
109
110 // Receipt of this update; the retained diagnostic groups have independent receipts.
111 uint64_t timestampUs = 0;
117 uint64_t outputOverflowUs = 0;
118
120 static constexpr std::chrono::microseconds DIAGNOSTIC_MAX_AGE = std::chrono::seconds(5);
121
123 GPSIntegrityReport freshAt(uint64_t nowUs, std::chrono::microseconds maximumAge = DIAGNOSTIC_MAX_AGE) const
124 {
125 auto result = *this;
126 if (!MonotonicClock::fresh(jamming.timestampUs, nowUs, maximumAge)) {
128 }
129 if (!MonotonicClock::fresh(spoofing.timestampUs, nowUs, maximumAge)) {
130 result.spoofing.state = SpoofingState::Unknown;
131 }
132 if (!MonotonicClock::fresh(antenna.timestampUs, nowUs, maximumAge)) {
133 result.antenna.state = AntennaState::Unknown;
134 }
135 return result;
136 }
137};
138
140{
142
143 uint64_t timestampUs = 0;
144 uint64_t utcTimeUs = 0;
145 FixType fixType = FixType::Unknown;
146 double latitudeDegrees = std::numeric_limits<double>::quiet_NaN();
147 double longitudeDegrees = std::numeric_limits<double>::quiet_NaN();
148 double altitudeMslMeters = std::numeric_limits<double>::quiet_NaN();
149 double altitudeEllipsoidMeters = std::numeric_limits<double>::quiet_NaN();
150 float horizontalAccuracyMeters = std::numeric_limits<float>::quiet_NaN();
151 float verticalAccuracyMeters = std::numeric_limits<float>::quiet_NaN();
152 float horizontalDop = std::numeric_limits<float>::quiet_NaN();
153 float verticalDop = std::numeric_limits<float>::quiet_NaN();
154 // Unavailable when the producer rejects its velocity solution, even with a valid position fix.
155 float speedMetersPerSecond = std::numeric_limits<float>::quiet_NaN();
156 float courseRadians = std::numeric_limits<float>::quiet_NaN();
157 std::optional<uint8_t> satellitesUsed = std::nullopt;
158};
159
167
169{
170 // Latest accepted view receipt. Zero plus absent inView means no view coverage.
171 uint64_t timestampUs = 0;
172 std::optional<int> inView = std::nullopt;
173 std::optional<int> used = std::nullopt;
174
175 bool operator==(const GPSSatelliteReport&) const = default;
176};
177
179{
181 uint64_t timestampUs = 0;
183 std::optional<double> meanAccuracyMeters = std::nullopt;
184 std::chrono::seconds duration{0};
185 bool valid = false;
186 bool active = false;
187};
GPSFixQualities::GPSFixQuality GPSFixQuality
constexpr GPSFixQuality gpsFixQualityFromValue(int value)
GPSConstellation
constexpr bool fresh(uint64_t timestampUs, uint64_t nowUs, std::chrono::microseconds lifetime)
Whether a receipt is younger than lifetime.
WGS84 geodetic position with ellipsoid height, not mean-sea-level altitude.
AntennaState
Ordered by severity, so the worst of several reports is the greatest.
GPSIntegrityReport freshAt(uint64_t nowUs, std::chrono::microseconds maximumAge=DIAGNOSTIC_MAX_AGE) const
Project independent diagnostic groups at the consumer's monotonic time.
static constexpr SpoofingState spoofingStateFromValue(int value)
static constexpr JammingState jammingStateFromValue(int value)
static constexpr std::chrono::microseconds DIAGNOSTIC_MAX_AGE
Receipt age at which a diagnostic group reverts to unknown.
std::optional< uint8_t > satellitesUsed
GPSIntegrityReport integrity
GPSNavigationValues navigation
std::optional< int > used
bool operator==(const GPSSatelliteReport &) const =default
std::optional< int > inView
GPSEllipsoidPosition position
std::optional< double > meanAccuracyMeters
uint64_t timestampUs
Receipt of this status; a status a family buffered keeps its original receipt.
std::chrono::seconds duration