9GPSReceiverFactGroup::GPSReceiverFactGroup(QObject* parent)
10 :
FactGroup(1000, QStringLiteral(
":/json/GPS/GPSReceiverFact.json"), parent)
12 _addFact(&_currentDurationFact);
13 _addFact(&_currentAccuracyFact);
14 _addFact(&_validFact);
15 _addFact(&_activeFact);
16 _addFact(&_numSatellitesFact);
17 _addFact(&_numSatellitesUsedFact);
18 _addFact(&_fixTypeFact);
19 _addFact(&_jammingStateFact);
20 _addFact(&_spoofingStateFact);
21 _addFact(&_antennaStateFact);
23 for (
Fact* fact : {&_jammingStateFact, &_spoofingStateFact, &_antennaStateFact}) {
29void GPSReceiverFactGroup::_update(
Fact& fact,
const QVariant& value)
32 if (!std::isnan(value.toDouble()) || !std::isnan(fact.
rawValue().toDouble())) {
37void GPSReceiverFactGroup::_restoreDefaults(std::initializer_list<Fact*> facts)
39 for (
Fact* fact : facts) {
47 _update(_currentDurationFact,
static_cast<qint64
>(report.
duration.count()));
48 _update(_currentAccuracyFact, accuracy);
49 _update(_validFact, report.
valid);
50 _update(_activeFact, report.
active);
52 _setCurrentBasePositionSaved(
false);
54 std::optional<GPSBaseStationConfig::Fixed>
base;
55 if (report.
valid && std::isfinite(accuracy) && accuracy >= 0 && accuracy <= (std::numeric_limits<float>::max)()) {
57 .accuracyMeters =
static_cast<float>(accuracy)};
62 _setCurrentBasePosition(base);
65void GPSReceiverFactGroup::_setSatellites(
int inView,
int used)
67 _update(_numSatellitesFact, inView);
68 _update(_numSatellitesUsedFact, used);
73 _update(_fixTypeFact,
static_cast<int>(
fixType));
74 _update(_jammingStateFact,
static_cast<int>(integrity.
jamming.
state));
75 _update(_spoofingStateFact,
static_cast<int>(integrity.
spoofing.
state));
76 _update(_antennaStateFact,
static_cast<int>(integrity.
antenna.
state));
79void GPSReceiverFactGroup::_clearSolution()
81 _restoreDefaults({&_numSatellitesFact, &_numSatellitesUsedFact, &_fixTypeFact, &_jammingStateFact,
82 &_spoofingStateFact, &_antennaStateFact});
85void GPSReceiverFactGroup::_reset()
87 _restoreDefaults({&_currentDurationFact, &_currentAccuracyFact, &_validFact, &_activeFact, &_numSatellitesFact,
88 &_numSatellitesUsedFact, &_fixTypeFact, &_jammingStateFact, &_spoofingStateFact,
90 _setCurrentBasePosition(std::nullopt);
94void GPSReceiverFactGroup::_updateReceiverWarning()
99 const int jamming = _jammingStateFact.
rawValue().toInt();
100 const int spoofing = _spoofingStateFact.
rawValue().toInt();
101 const int antenna = _antennaStateFact.
rawValue().toInt();
103 jamming ==
static_cast<int>(JammingState::Warning) || jamming ==
static_cast<int>(JammingState::Critical) ||
104 spoofing ==
static_cast<int>(SpoofingState::Indicated) ||
105 spoofing ==
static_cast<int>(SpoofingState::Multiple) || antenna ==
static_cast<int>(AntennaState::Open) ||
106 antenna ==
static_cast<int>(AntennaState::Short);
107 if (std::exchange(_receiverWarning, warning) != warning) {
112void GPSReceiverFactGroup::_setCurrentBasePosition(
const std::optional<GPSBaseStationConfig::Fixed>& base)
115 _currentBasePosition =
base;
117 _setCurrentBasePositionSaved(
false);
124void GPSReceiverFactGroup::_setCurrentBasePositionSaved(
bool saved)
126 if (std::exchange(_currentBasePositionSaved, saved) != saved) {
GPSReceiverConfigError gpsValidateBaseStationConfig(const GPSBaseStationConfig &config)
Check the selected base mode against the existing receiver wire-unit limits.
Used to group Facts together into an object hierarachy.
void _setTelemetryAvailable(bool telemetryAvailable)
A Fact is used to hold a single value within the system.
QVariant rawDefaultValue() const
void rawValueChanged(const QVariant &value)
void setRawValue(const QVariant &value)
QVariant rawValue() const
void receiverWarningChanged()
bool canSaveCurrentBasePosition() const
void currentBasePositionChanged()
GPSCommandSequence base(QByteArrayView port, const GPSBaseStationConfig &base)
Streams RTCM3 corrections and the PVTGeodetic survey status over port in the mode base selects.
GPSEllipsoidPosition position
AntennaState
Ordered by severity, so the worst of several reports is the greatest.
GPSEllipsoidPosition position
std::optional< double > meanAccuracyMeters
std::chrono::seconds duration