QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
NMEANavigationEpoch.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <chrono>
5#include <cmath>
6#include <cstddef>
7#include <cstdint>
8#include <optional>
9
10#include "GPSReceiverReports.h"
11#include "NMEASentence.h"
12
13namespace NMEA {
14
16{
17 std::optional<int> timeMs;
18 uint64_t receivedAtUs = 0;
20 uint64_t sequence = 0;
21 GPSFixQuality fixQuality = GPSFixQuality::Unknown;
22 std::optional<unsigned> ggaQuality;
23
24 double latitude = NAN;
25 double longitude = NAN;
26 std::optional<double> altitudeMslMeters;
27 std::optional<double> geoidSeparationMeters;
28 std::optional<unsigned> satellitesUsed;
29
30 std::optional<double> horizontalDop;
31 std::optional<double> verticalDop;
33
34 std::optional<double> horizontalAccuracyMeters;
35 std::optional<double> verticalAccuracyMeters;
37
38 std::optional<double> speedMetersPerSecond;
39 std::optional<double> courseDegrees;
40
41 [[nodiscard]] std::optional<double> altitudeEllipsoidMeters() const;
42};
43
63
65{
66public:
67 static constexpr size_t MAX_RETAINED_EPOCHS = 32;
69 static constexpr std::chrono::microseconds METADATA_MAX_AGE = std::chrono::seconds(2);
70
71 void reset();
72 std::optional<NavigationUpdate> ingest(const Sentence& sentence, uint64_t receivedAtUs);
73 std::optional<NavigationEpoch> expireUntimedMetadata(uint64_t nowUs);
74
75private:
76 struct StoredEpoch
77 {
78 bool active = false;
79 int key = 0;
80 NavigationEpoch epoch;
81 };
82
83 static constexpr int NO_TIME_KEY = -1;
84
85 StoredEpoch& _find(std::optional<int> timeMs);
86 StoredEpoch* _findExisting(std::optional<int> timeMs);
87 StoredEpoch* _current();
88 void _resetEpoch(StoredEpoch& stored, std::optional<int> timeMs);
89 void _resetExpiredEpoch(StoredEpoch& stored, uint64_t receivedAtUs);
90 NavigationEpoch& _positionEpoch(std::optional<int> timeMs, uint64_t receivedAtUs);
91 bool _hiddenByFixLoss(const NavigationEpoch& epoch) const;
92 std::optional<NavigationUpdate> _handlePositionSentence(const Sentence& sentence, uint64_t receivedAtUs);
93 std::optional<NavigationUpdate> _handleAccuracy(const Sentence& sentence, uint64_t receivedAtUs);
94 std::optional<NavigationUpdate> _handleUntimedMetadata(const Sentence& sentence, uint64_t receivedAtUs);
95
96 std::array<StoredEpoch, MAX_RETAINED_EPOCHS> _epochs{};
97 int _currentKey = NO_TIME_KEY;
98 bool _hasCurrent = false;
99 uint64_t _sequence = 0;
100 uint64_t _invalidThroughSequence = 0;
101 bool _navigationValid = true;
102};
103
104} // namespace NMEA
static constexpr std::chrono::microseconds METADATA_MAX_AGE
Receipt age beyond which retained metadata no longer joins a new sentence of its epoch.
static constexpr size_t MAX_RETAINED_EPOCHS
std::optional< NavigationEpoch > expireUntimedMetadata(uint64_t nowUs)
std::optional< NavigationUpdate > ingest(const Sentence &sentence, uint64_t receivedAtUs)
std::optional< Sentence > sentence(std::string_view text)
std::optional< double > horizontalDop
std::optional< double > horizontalAccuracyMeters
std::optional< double > verticalDop
std::optional< double > altitudeEllipsoidMeters() const
std::optional< double > geoidSeparationMeters
std::optional< double > altitudeMslMeters
std::optional< int > timeMs
std::optional< double > courseDegrees
std::optional< double > verticalAccuracyMeters
std::optional< unsigned > satellitesUsed
std::optional< double > speedMetersPerSecond
std::optional< unsigned > ggaQuality