QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
NTRIPGgaReporter.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4#include <functional>
5#include <optional>
6#include <tuple>
7
8#include <QtCore/QHash>
9#include <QtCore/QObject>
10#include <QtCore/QPointer>
11#include <QtCore/QString>
12
13#include "GPSObservation.h"
14#include "ScheduledTask.h"
15
16class NTRIPTransport;
18
19class NTRIPGgaReporter : public QObject
20{
21 Q_OBJECT
22
23public:
24 enum class PositionSource
25 {
26 Auto = 0,
27 VehicleGPS = 1,
28 VehicleEKF = 2,
29 RTKReceiver = 3,
30 GCSPosition = 4
31 };
32 Q_ENUM(PositionSource)
33
34
35 static constexpr std::chrono::milliseconds DEFAULT_INTERVAL{5000};
38 static constexpr std::chrono::milliseconds FAST_RETRY_INTERVAL{1000};
39
42 using PositionProvider = std::function<std::optional<GPSObservation>()>;
43
45 {
47 std::chrono::milliseconds interval = DEFAULT_INTERVAL;
48 bool operator==(const Configuration&) const = default;
49 };
50
51 explicit NTRIPGgaReporter(QObject* parent = nullptr, RuntimeScheduler* scheduler = nullptr);
52
53 void configure(const Configuration& configuration);
54
55 void start(NTRIPTransport* transport);
56 void stop();
57
58 QString currentSource() const { return _source; }
59
61
62signals:
63 void sourceChanged(const QString& source);
64
65private:
66 struct SelectedPosition
67 {
68 std::optional<GPSObservation> position;
70 };
71
73 static QString _sourceLabel(PositionSource source);
74
75 void _sendGGA();
76 void _scheduleNextGGA();
77 std::chrono::milliseconds _currentInterval() const;
78 void _clearSource();
79
80 SelectedPosition _getBestPosition(PositionSource requested) const;
81 void _logSelection(PositionSource requested, const SelectedPosition& selection);
82
83 QPointer<NTRIPTransport> _transport;
84 RuntimeScheduler* const _scheduler;
85 ScheduledTask _ggaTask;
86 QString _source;
87 QHash<PositionSource, PositionProvider> _providers;
89 std::optional<std::tuple<PositionSource, PositionSource, bool>> _loggedSelection;
91 bool _awaitingFirstGga = false;
92 PositionSource _requestedSource = PositionSource::Auto;
93 std::chrono::milliseconds _normalInterval = DEFAULT_INTERVAL;
94};
std::function< std::optional< GPSObservation >()> PositionProvider
void start(NTRIPTransport *transport)
static constexpr std::chrono::milliseconds FAST_RETRY_INTERVAL
void sourceChanged(const QString &source)
static constexpr std::chrono::milliseconds DEFAULT_INTERVAL
Interval of a default configuration, and of one whose interval is not positive.
QString currentSource() const
void setPositionProvider(PositionSource source, PositionProvider provider)
void configure(const Configuration &configuration)
std::chrono::milliseconds interval
bool operator==(const Configuration &) const =default