QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GPSCorrectionSelector.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <chrono>
5#include <optional>
6
7#include <QtCore/QString>
8#include <QtQmlIntegration/QtQmlIntegration>
9
11
12// HighestPriority, the automatic routing setting, names no specific source; it never carries corrections.
13inline constexpr int GPS_CORRECTION_SOURCE_COUNT = static_cast<int>(GPSCorrectionSettings::Udp) + 1;
14
17{
18 Q_GADGET
19 QML_VALUE_TYPE(gpsCorrectionStream)
20 QML_STRUCTURED_VALUE
21 Q_PROPERTY(int source MEMBER source FINAL)
22 Q_PROPERTY(QString instanceId MEMBER instanceId FINAL)
23
24public:
25 int source = 0;
26 QString instanceId;
27
28 bool operator==(const GPSCorrectionStream&) const = default;
29};
30
35{
36public:
39
46 bool submit(GPSCorrectionSettings::CorrectionSource source, const QString& instance, qint64 receivedAtMs,
47 qint64 now);
48 void shutdown();
49
51 bool hasSources() const;
52
54 std::optional<GPSCorrectionStream> selectedStream(qint64 now) const;
55
57 static constexpr std::chrono::milliseconds FRESHNESS_TIMEOUT{5000};
58 static constexpr std::chrono::milliseconds SWITCH_HOLD_DOWN{2000};
59
60private:
61 struct Category
62 {
63 bool begun = false;
64 QString instance{};
65 qint64 lastRoutableMs = 0;
66 };
67
68 static int _index(GPSCorrectionSettings::CorrectionSource source);
69 bool _fresh(const Category& category, qint64 now) const;
70 bool _eligible(int index, qint64 now) const;
71 void _select(qint64 now);
72
74 std::array<Category, GPS_CORRECTION_SOURCE_COUNT> _categories{};
76 int _active = -1;
77 int _candidate = -1;
78 qint64 _candidateSinceMs = 0;
79 bool _shutdown = false;
80};
constexpr int GPS_CORRECTION_SOURCE_COUNT
static constexpr std::chrono::milliseconds SWITCH_HOLD_DOWN
bool hasSources() const
Whether any source is begun.
bool submit(GPSCorrectionSettings::CorrectionSource source, const QString &instance, qint64 receivedAtMs, qint64 now)
void beginSource(GPSCorrectionSettings::CorrectionSource source, qint64 now)
Starts source. A category has one source at a time, which ends itself before a replacement begins.
std::optional< GPSCorrectionStream > selectedStream(qint64 now) const
The selected fresh stream, if any.
void endSource(GPSCorrectionSettings::CorrectionSource source, qint64 now)
Stops routing source.
static constexpr std::chrono::milliseconds FRESHNESS_TIMEOUT
Age at which a frame is no longer routed and its stream stops being eligible for selection.
void configure(GPSCorrectionSettings::CorrectionSource source, qint64 now)
Routes only source, or selects automatically for HighestPriority. A valid, changed source reselects a...
CorrectionSource
Persisted values of correctionSource. The storage type keeps any saved value a valid enum value.
The stream vehicles receive: its source category and the instance within it.
bool operator==(const GPSCorrectionStream &) const =default