QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GPSSourceHealth.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4#include <optional>
5
6#include <QtCore/QObject>
7
8#include "GPSObservation.h"
9#include "ScheduledTask.h"
10
12class GPSSourceHealth : public QObject
13{
14 Q_OBJECT
15 friend class GPSSourceHealthTest;
16 friend class PositionManagerTest;
17
18public:
19 enum class State
20 {
21 NoData = 0,
22 Usable = 1,
23 Invalid = 2,
24 Stale = 3,
25 };
26 Q_ENUM(State)
27
28 explicit GPSSourceHealth(QObject* parent = nullptr, RuntimeScheduler* scheduler = nullptr);
29 ~GPSSourceHealth() override;
30
32 static constexpr std::chrono::milliseconds FRESHNESS_TIMEOUT{5000};
33
34 void setFreshnessTimeout(std::chrono::milliseconds timeout);
35
36 State state() const { return _position.state; }
37
38 quint64 observationRevision() const { return _observationRevision; }
39
40 std::optional<GPSObservation> acceptedObservation(
42 std::optional<std::chrono::milliseconds> maximumAge = std::nullopt) const;
43
44 void updateObservation(const GPSObservation& observation);
45 void invalidatePosition();
46 void reset();
47
48signals:
50
51private:
53 GPSObservation _observation() const { return _position.observation; }
54
55 void _logStateChange(State previous) const;
56 void _setState(State state);
57 State _updatedPositionState() const;
58 void _schedulePositionExpiry();
60 std::optional<std::chrono::milliseconds> _age(quint64 timestampUs) const;
61 std::chrono::microseconds _remaining(quint64 timestampUs,
62 std::optional<std::chrono::milliseconds> maximumAge = std::nullopt) const;
63
64 struct PositionState
65 {
66 GPSObservation observation;
67 State state = State::NoData;
68 bool invalidated = true;
69 };
70
71 std::chrono::milliseconds _freshnessTimeout = FRESHNESS_TIMEOUT;
72 PositionState _position;
73 RuntimeScheduler* const _scheduler;
74 ScheduledTask _positionTask;
75 quint64 _observationRevision = 0;
76};
Session health is independent of transport readiness and RTK survey-in validity.
void setFreshnessTimeout(std::chrono::milliseconds timeout)
void positionChanged()
void updateObservation(const GPSObservation &observation)
std::optional< GPSObservation > acceptedObservation(GPSObservation::PositionUse use=GPSObservation::PositionUse::GroundStation, std::optional< std::chrono::milliseconds > maximumAge=std::nullopt) const
friend class GPSSourceHealthTest
friend class PositionManagerTest
~GPSSourceHealth() override
static constexpr std::chrono::milliseconds FRESHNESS_TIMEOUT
Default position age at which health becomes Stale and the position stops being usable.
quint64 observationRevision() const
State state() const
Receiver-independent data. Unknown metadata remains absent, never a manufactured zero.