16 , _positionTask(_scheduler, this)
18 qCDebug(GPSSourceHealthLog) <<
this;
23 qCDebug(GPSSourceHealthLog) <<
this;
26std::optional<std::chrono::milliseconds> GPSSourceHealth::_age(quint64 timestampUs)
const
32 return std::chrono::duration_cast<std::chrono::milliseconds>(*age);
38 if (_position.invalidated ||
39 _remaining(_position.observation.monotonicTimestampUs, maximumAge) == std::chrono::microseconds::zero()) {
42 return _position.observation.projected(use);
45std::chrono::microseconds GPSSourceHealth::_remaining(quint64 timestampUs,
46 std::optional<std::chrono::milliseconds> maximumAge)
const
48 const auto lifetime = maximumAge ? (std::min) (_freshnessTimeout, *maximumAge) : _freshnessTimeout;
49 return lifetime > std::chrono::milliseconds::zero()
51 : std::chrono::microseconds::zero();
57 ++_observationRevision;
59 _position.observation = observation;
62 _position.state = _updatedPositionState();
63 _schedulePositionExpiry();
64 _logStateChange(previousState);
68void GPSSourceHealth::_schedulePositionExpiry()
71 const auto remaining = _remaining(_position.observation.monotonicTimestampUs);
72 if (remaining == std::chrono::microseconds::zero()) {
78void GPSSourceHealth::_logStateChange(State previous)
const
80 if (previous !=
state()) {
81 qCDebug(GPSSourceHealthLog) <<
this <<
"Position health changed:" << previous <<
"->" <<
state();
85void GPSSourceHealth::_setState(State state)
87 if (_position.state !=
state) {
88 const State previous = _position.state;
89 _position.state =
state;
90 _logStateChange(previous);
97 const bool wasInvalidated = std::exchange(_position.invalidated,
true);
98 _schedulePositionExpiry();
100 const auto age = _age(_position.observation.monotonicTimestampUs);
102 }
else if (!wasInvalidated) {
113 _logStateChange(previousState);
119 _freshnessTimeout = (std::max) (std::chrono::milliseconds{1}, timeout);
124 _position.state = _updatedPositionState();
125 _schedulePositionExpiry();
126 _logStateChange(previousState);
132 const auto age = _age(_position.observation.monotonicTimestampUs);
136 if (*age >= _freshnessTimeout) {
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Session health is independent of transport readiness and RTK survey-in validity.
void setFreshnessTimeout(std::chrono::milliseconds timeout)
void invalidatePosition()
void updateObservation(const GPSObservation &observation)
std::optional< GPSObservation > acceptedObservation(GPSObservation::PositionUse use=GPSObservation::PositionUse::GroundStation, std::optional< std::chrono::milliseconds > maximumAge=std::nullopt) const
~GPSSourceHealth() override
virtual quint64 nowUs() const =0
bool schedule(std::chrono::microseconds delay, RuntimeScheduler::Callback callback)
constexpr std::optional< std::chrono::duration< Rep, Period > > age(std::chrono::duration< Rep, Period > timestamp, std::chrono::duration< Rep, Period > now)
Age of timestamp at now, both in the same unit; empty for a missing or future timestamp.
constexpr std::chrono::microseconds remaining(uint64_t timestampUs, uint64_t nowUs, std::chrono::microseconds lifetime)
Time left before a receipt reaches lifetime; zero for a missing, future or expired one.
Receiver-independent data. Unknown metadata remains absent, never a manufactured zero.
quint64 monotonicTimestampUs