diff --git a/qgcimages.qrc b/qgcimages.qrc index 5c995eac1753..909cecce09a0 100644 --- a/qgcimages.qrc +++ b/qgcimages.qrc @@ -105,6 +105,8 @@ src/UI/toolbar/Images/Gps.svg src/UI/toolbar/Images/Hamburger.svg src/UI/toolbar/Images/HamburgerThin.svg + src/UI/toolbar/Images/GpsAuthentication.svg + src/UI/toolbar/Images/GpsInterference.svg src/FlightMap/Images/Help.svg src/FlightMap/Images/HelpBlack.svg src/AutoPilotPlugins/PX4/Images/HITL.svg diff --git a/src/Comms/MockLink/MockLink.cc b/src/Comms/MockLink/MockLink.cc index ca095b548261..1deeffda4a0e 100644 --- a/src/Comms/MockLink/MockLink.cc +++ b/src/Comms/MockLink/MockLink.cc @@ -1357,23 +1357,22 @@ void MockLink::_sendGpsRawInt() _vehicleComponentId, mavlinkChannel(), &msg, - timeTick++, // time since boot + timeTick++, // time since boot GPS_FIX_TYPE_3D_FIX, - static_cast(_vehicleLatitude * 1E7), - static_cast(_vehicleLongitude * 1E7), - static_cast(_vehicleAltitudeAMSL * 1000), - 3 * 100, // hdop - 3 * 100, // vdop - UINT16_MAX, // velocity not known - UINT16_MAX, // course over ground not known - 8, // satellites visible + (int32_t)(_vehicleLatitude * 1E7), + (int32_t)(_vehicleLongitude * 1E7), + (int32_t)(_vehicleAltitudeAMSL * 1000), + UINT16_MAX, UINT16_MAX, // HDOP/VDOP not known + UINT16_MAX, // velocity not known + UINT16_MAX, // course over ground not known + 8, // satellites visible //-- Extension - 0, // Altitude (above WGS84, EGM96 ellipsoid), in meters * 1000 (positive for up). - 0, // Position uncertainty in meters * 1000 (positive for up). - 0, // Altitude uncertainty in meters * 1000 (positive for up). - 0, // Speed uncertainty in meters * 1000 (positive for up). - 0, // Heading / track uncertainty in degrees * 1e5. - 65535 // Yaw not provided + 0, // Altitude (above WGS84, EGM96 ellipsoid), in meters * 1000 (positive for up). + 0, // Position uncertainty in meters * 1000 (positive for up). + 0, // Altitude uncertainty in meters * 1000 (positive for up). + 0, // Speed uncertainty in meters * 1000 (positive for up). + 0, // Heading / track uncertainty in degrees * 1e5. + 65535 // Yaw not provided ); respondWithMavlinkMessage(msg); } diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index 3c308db319c4..3b76119f689f 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -205,6 +205,8 @@ const QVariantList &FirmwarePlugin::toolIndicators(const Vehicle*) _toolIndicatorList = QVariantList({ QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Controls/FlightModeIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Toolbar/VehicleGPSIndicator.qml")), + QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Toolbar/GPSInterferenceIndicator.qml")), + QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Toolbar/GPSAuthenticationIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Toolbar/TelemetryRSSIIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Toolbar/RCRSSIIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Controls/BatteryIndicator.qml")), diff --git a/src/QmlControls/GPSIndicatorPage.qml b/src/QmlControls/GPSIndicatorPage.qml index 3849c97df4f5..01ced7b5563f 100644 --- a/src/QmlControls/GPSIndicatorPage.qml +++ b/src/QmlControls/GPSIndicatorPage.qml @@ -64,6 +64,27 @@ ToolIndicatorPage { } + function errorText() { + if(!_activeVehicle){ + return qsTr("Disconnected") + } else if (_activeVehicle.gps.systemErrors.value === 1) { + return qsTr("Incoming correction") + } else if (_activeVehicle.gps.systemErrors.value === 2) { + return qsTr("Configuration") + } else if (_activeVehicle.gps.systemErrors.value === 4) { + return qsTr("Software") + } else if (_activeVehicle.gps.systemErrors.value === 8) { + return qsTr("Antenna") + } else if (_activeVehicle.gps.systemErrors.value === 16) { + return qsTr("Event congestion") + } else if (_activeVehicle.gps.systemErrors.value === 32) { + return qsTr("CPU overload") + } else if (_activeVehicle.gps.systemErrors.value === 64) { + return qsTr("Output congestion") + } + return qsTr("Multiple errors") + } + contentComponent: Component { ColumnLayout { spacing: ScreenTools.defaultFontPixelHeight / 2 @@ -96,6 +117,12 @@ ToolIndicatorPage { label: qsTr("Course Over Ground") labelText: activeVehicle ? activeVehicle.gps.courseOverGround.valueString : valueNA } + + LabelledLabel { + label: qsTr("GPS Error") + labelText: errorText() + visible: _activeVehicle && _activeVehicle.gps.systemErrors.value > 0 + } } SettingsGroupLayout { diff --git a/src/QmlControls/QGCPalette.cc b/src/QmlControls/QGCPalette.cc index 9adda85a7f98..5b2228f629c5 100644 --- a/src/QmlControls/QGCPalette.cc +++ b/src/QmlControls/QGCPalette.cc @@ -74,6 +74,7 @@ void QGCPalette::_buildMap() DECLARE_QGC_COLOR(colorRed, "#b52b2b", "#b52b2b", "#f32836", "#f32836") DECLARE_QGC_COLOR(colorGrey, "#808080", "#808080", "#bfbfbf", "#bfbfbf") DECLARE_QGC_COLOR(colorBlue, "#1a72ff", "#1a72ff", "#536dff", "#536dff") + DECLARE_QGC_COLOR(colorWhite, "#222222", "#222222", "#ffffff", "#ffffff") DECLARE_QGC_COLOR(alertBackground, "#eecc44", "#eecc44", "#eecc44", "#eecc44") DECLARE_QGC_COLOR(alertBorder, "#808080", "#808080", "#808080", "#808080") DECLARE_QGC_COLOR(alertText, "#000000", "#000000", "#000000", "#000000") diff --git a/src/QmlControls/QGCPalette.h b/src/QmlControls/QGCPalette.h index 465a43bbf3ea..53950468655b 100644 --- a/src/QmlControls/QGCPalette.h +++ b/src/QmlControls/QGCPalette.h @@ -144,6 +144,7 @@ class QGCPalette : public QObject DEFINE_QGC_COLOR(colorRed, setColorRed) DEFINE_QGC_COLOR(colorGrey, setColorGrey) DEFINE_QGC_COLOR(colorBlue, setColorBlue) + DEFINE_QGC_COLOR(colorWhite, setColorWhite) DEFINE_QGC_COLOR(alertBackground, setAlertBackground) DEFINE_QGC_COLOR(alertBorder, setAlertBorder) DEFINE_QGC_COLOR(alertText, setAlertText) diff --git a/src/UI/toolbar/CMakeLists.txt b/src/UI/toolbar/CMakeLists.txt index 3397c482d344..7dbd40eadd19 100644 --- a/src/UI/toolbar/CMakeLists.txt +++ b/src/UI/toolbar/CMakeLists.txt @@ -14,6 +14,8 @@ qt_add_qml_module(ToolbarModule EscIndicatorPage.qml GCSControlIndicator.qml GimbalIndicator.qml + GPSAuthenticationIndicator.qml + GPSInterferenceIndicator.qml JoystickIndicator.qml LinkIndicator.qml ModeIndicator.qml diff --git a/src/UI/toolbar/GPSAuthenticationIndicator.qml b/src/UI/toolbar/GPSAuthenticationIndicator.qml new file mode 100644 index 000000000000..7408619ee44b --- /dev/null +++ b/src/UI/toolbar/GPSAuthenticationIndicator.qml @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * (c) 2009-2024 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick +import QtQuick.Layouts + +import QGroundControl +import QGroundControl.Controls +import QGroundControl.ScreenTools +import QGroundControl.Palette + +//------------------------------------------------------------------------- +//-- GPS Authentication Indicator +Item { + id: control + width: height + anchors.top: parent.top + anchors.bottom: parent.bottom + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + property bool showIndicator: _activeVehicle && _activeVehicle.gps.authenticationState.value > 0 + + function authenticationIconColor() { + if(!_activeVehicle){ + return qgcPal.colorGrey // Not connected + } + + switch (_activeVehicle.gps.authenticationState.value) { + case 1: // Initializing + return qgcPal.colorYellow; + case 2: // Error + return qgcPal.colorRed; + case 3: // OK + return qgcPal.colorGreen; + case 0: // Unknown + case 4: // Disabled + default: + return qgcPal.colorGrey; + } + } + + QGCColoredImage { + id: gpsAuthenticationIcon + width: height + anchors.top: parent.top + anchors.bottom: parent.bottom + source: "/qmlimages/GpsAuthentication.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + opacity: 1 + color: authenticationIconColor() + } + + MouseArea { + anchors.fill: parent + onClicked: mainWindow.showIndicatorDrawer(authenticationContentComponent, control) + } + + Component{ + id: authenticationContentComponent + + ColumnLayout{ + spacing: ScreenTools.defaultFontPixelHeight / 2 + + SettingsGroupLayout { + heading: qsTr("GPS Authentication") + contentSpacing: 0 + showDividers: false + + LabelledLabel { + label: qsTr("Status") + labelText: _activeVehicle ? (_activeVehicle.gps.authenticationState.valueString || qsTr("n/a")) : qsTr("n/a") + } + } + } + } +} diff --git a/src/UI/toolbar/GPSInterferenceIndicator.qml b/src/UI/toolbar/GPSInterferenceIndicator.qml new file mode 100644 index 000000000000..bfa1c9a327d7 --- /dev/null +++ b/src/UI/toolbar/GPSInterferenceIndicator.qml @@ -0,0 +1,95 @@ +/**************************************************************************** + * + * (c) 2009-2024 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick +import QtQuick.Layouts + +import QGroundControl +import QGroundControl.Controls +import QGroundControl.ScreenTools +import QGroundControl.Palette + +//------------------------------------------------------------------------- +//-- GPS Interference Indicator +Item { + id: control + width: height + anchors.top: parent.top + anchors.bottom: parent.bottom + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + property bool showIndicator: _activeVehicle && (_activeVehicle.gps.spoofingState.value > 0 || _activeVehicle.gps.jammingState.value > 0) + + QGCColoredImage { + id: gpsSpoofingIcon + width: height + anchors.top: parent.top + anchors.bottom: parent.bottom + source: "/qmlimages/GpsInterference.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + opacity: 1 + color: { + if(!_activeVehicle){ + return qgcPal.colorGrey + } + + let maxState = Math.max(_activeVehicle.gps.spoofingState.value, _activeVehicle.gps.jammingState.value); + + switch (maxState) { + case 3: + return qgcPal.colorRed; + case 2: + return qgcPal.colorOrange; + case 1: + return qgcPal.colorWhite; + default: + return qgcPal.colorGrey; + } + } + } + + MouseArea { + anchors.fill: parent + onClicked: mainWindow.showIndicatorDrawer(gpsSpoofingPopup, control) + } + + Component { + id: gpsSpoofingPopup + + ToolIndicatorPage { + showExpand: expandedComponent ? true : false + contentComponent: spoofingContentComponent + } + } + + Component{ + id: spoofingContentComponent + + ColumnLayout{ + spacing: ScreenTools.defaultFontPixelHeight / 2 + + SettingsGroupLayout { + heading: qsTr("GPS Interference Status") + showDividers: true + + LabelledLabel { + label: qsTr("GPS Jamming") + labelText: _activeVehicle ? (_activeVehicle.gps.jammingState.valueString || qsTr("n/a")) : qsTr("n/a") + } + + LabelledLabel { + label: qsTr("GPS Spoofing") + labelText: _activeVehicle ? (_activeVehicle.gps.spoofingState.valueString || qsTr("n/a")) : qsTr("n/a") + } + } + } + } +} diff --git a/src/UI/toolbar/Images/GpsAuthentication.svg b/src/UI/toolbar/Images/GpsAuthentication.svg new file mode 100644 index 000000000000..68e0fd625a02 --- /dev/null +++ b/src/UI/toolbar/Images/GpsAuthentication.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/UI/toolbar/Images/GpsInterference.svg b/src/UI/toolbar/Images/GpsInterference.svg new file mode 100644 index 000000000000..62a92a6e3c29 --- /dev/null +++ b/src/UI/toolbar/Images/GpsInterference.svg @@ -0,0 +1,80 @@ + + + +image/svg+xml + + + + + + + + + + + + diff --git a/src/Vehicle/FactGroups/GPSFact.json b/src/Vehicle/FactGroups/GPSFact.json index a563f7cb8dd9..df00ecda3574 100644 --- a/src/Vehicle/FactGroups/GPSFact.json +++ b/src/Vehicle/FactGroups/GPSFact.json @@ -58,6 +58,55 @@ "name": "count", "shortDesc": "Sat Count", "type": "uint32" +}, +{ + "name": "systemErrors", + "shortDesc": "General System Errors", + "type": "uint32" +}, +{ + "name": "spoofingState", + "shortDesc": "Signal Spoofing State", + "type": "uint8", + "enumStrings": "Unknown,Ok,Mitigated,Detected", + "enumValues": "0,1,2,3", + "decimalPlaces": 0 +}, +{ + "name": "jammingState", + "shortDesc": "Signal Jamming State", + "type": "uint8", + "enumStrings": "Unknown,Ok,Mitigated,Detected", + "enumValues": "0,1,2,3", + "decimalPlaces": 0 +}, +{ + "name": "authenticationState", + "shortDesc": "Signal Authentication State", + "type": "uint8", + "enumStrings": "Unknown,Initializing,Error,Ok,Disabled", + "enumValues": "0,1,2,3,4", + "decimalPlaces": 0 +}, +{ + "name": "correctionsQuality", + "shortDesc": "Corrections Quality", + "type": "uint8" +}, +{ + "name": "systemQuality", + "shortDesc": "System Status Quality", + "type": "uint8" +}, +{ + "name": "gnssSignalQuality", + "shortDesc": "Gnss Signal Quality", + "type": "uint8" +}, +{ + "name": "postProcessingQuality", + "shortDesc": "Post Processing Quality", + "type": "uint8" } ] } diff --git a/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc b/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc index cebadd664218..1db6b9e7e7b5 100644 --- a/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc +++ b/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc @@ -10,6 +10,7 @@ #include "VehicleGPSFactGroup.h" #include "Vehicle.h" #include "QGCGeo.h" +#include "development/mavlink_msg_gnss_integrity.h" #include @@ -25,6 +26,29 @@ VehicleGPSFactGroup::VehicleGPSFactGroup(QObject *parent) _addFact(&_yawFact); _addFact(&_lockFact); _addFact(&_countFact); + _addFact(&_systemErrorsFact); + _addFact(&_spoofingStateFact); + _addFact(&_jammingStateFact); + _addFact(&_authenticationStateFact); + _addFact(&_correctionsQualityFact); + _addFact(&_systemQualityFact); + _addFact(&_gnssSignalQualityFact); + _addFact(&_postProcessingQualityFact); + + _spoofingStateFact.metaData()->setEnumInfo( + QStringList() << "Disconnected" << "OK" << "Mitigated" << "Ongoing", + QVariantList() << 0 << 1 << 2 << 3 + ); + + _jammingStateFact.metaData()->setEnumInfo( + QStringList() << "Disconnected" << "OK" << "Mitigated" << "Ongoing", + QVariantList() << 0 << 1 << 2 << 3 + ); + + _authenticationStateFact.metaData()->setEnumInfo( + QStringList() << "Unknown" << "Initializing..." << "Failed" << "OK" << "Disabled", + QVariantList() << 0 << 1 << 2 << 3 << 4 + ); _latFact.setRawValue(std::numeric_limits::quiet_NaN()); _lonFact.setRawValue(std::numeric_limits::quiet_NaN()); @@ -32,6 +56,13 @@ VehicleGPSFactGroup::VehicleGPSFactGroup(QObject *parent) _hdopFact.setRawValue(std::numeric_limits::quiet_NaN()); _vdopFact.setRawValue(std::numeric_limits::quiet_NaN()); _courseOverGroundFact.setRawValue(std::numeric_limits::quiet_NaN()); + _spoofingStateFact.setRawValue(0); + _jammingStateFact.setRawValue(0); + _authenticationStateFact.setRawValue(255); + _correctionsQualityFact.setRawValue(255); + _systemQualityFact.setRawValue(255); + _gnssSignalQualityFact.setRawValue(255); + _postProcessingQualityFact.setRawValue(255); _yawFact.setRawValue(std::numeric_limits::quiet_NaN()); } @@ -49,6 +80,9 @@ void VehicleGPSFactGroup::handleMessage(Vehicle *vehicle, const mavlink_message_ case MAVLINK_MSG_ID_HIGH_LATENCY2: _handleHighLatency2(message); break; + case MAVLINK_MSG_ID_GNSS_INTEGRITY: + _handleGnssIntegrity(message); + break; default: break; } @@ -99,3 +133,19 @@ void VehicleGPSFactGroup::_handleHighLatency2(const mavlink_message_t &message) _setTelemetryAvailable(true); } + +void VehicleGPSFactGroup::_handleGnssIntegrity(const mavlink_message_t& message) +{ + mavlink_gnss_integrity_t gnssIntegrity; + mavlink_msg_gnss_integrity_decode(&message, &gnssIntegrity); + + systemErrors()->setRawValue (gnssIntegrity.system_errors); + spoofingState()->setRawValue (gnssIntegrity.spoofing_state); + jammingState()->setRawValue (gnssIntegrity.jamming_state); + authenticationState()->setRawValue (gnssIntegrity.authentication_state); + correctionsQuality()->setRawValue (gnssIntegrity.corrections_quality); + systemQuality()->setRawValue (gnssIntegrity.system_status_summary); + gnssSignalQuality()->setRawValue (gnssIntegrity.gnss_signal_quality); + postProcessingQuality()->setRawValue(gnssIntegrity.post_processing_quality); +} + diff --git a/src/Vehicle/FactGroups/VehicleGPSFactGroup.h b/src/Vehicle/FactGroups/VehicleGPSFactGroup.h index 75a6aac85b69..9bc05599440c 100644 --- a/src/Vehicle/FactGroups/VehicleGPSFactGroup.h +++ b/src/Vehicle/FactGroups/VehicleGPSFactGroup.h @@ -14,15 +14,24 @@ class VehicleGPSFactGroup : public FactGroup { Q_OBJECT - Q_PROPERTY(Fact *lat READ lat CONSTANT) - Q_PROPERTY(Fact *lon READ lon CONSTANT) - Q_PROPERTY(Fact *mgrs READ mgrs CONSTANT) - Q_PROPERTY(Fact *hdop READ hdop CONSTANT) - Q_PROPERTY(Fact *vdop READ vdop CONSTANT) - Q_PROPERTY(Fact *courseOverGround READ courseOverGround CONSTANT) - Q_PROPERTY(Fact *yaw READ yaw CONSTANT) - Q_PROPERTY(Fact *count READ count CONSTANT) - Q_PROPERTY(Fact *lock READ lock CONSTANT) + + Q_PROPERTY(Fact *lat READ lat CONSTANT) + Q_PROPERTY(Fact *lon READ lon CONSTANT) + Q_PROPERTY(Fact *mgrs READ mgrs CONSTANT) + Q_PROPERTY(Fact *hdop READ hdop CONSTANT) + Q_PROPERTY(Fact *vdop READ vdop CONSTANT) + Q_PROPERTY(Fact *courseOverGround READ courseOverGround CONSTANT) + Q_PROPERTY(Fact *count READ count CONSTANT) + Q_PROPERTY(Fact *lock READ lock CONSTANT) + Q_PROPERTY(Fact* systemErrors READ systemErrors CONSTANT) + Q_PROPERTY(Fact* spoofingState READ spoofingState CONSTANT) + Q_PROPERTY(Fact* jammingState READ jammingState CONSTANT) + Q_PROPERTY(Fact* authenticationState READ authenticationState CONSTANT) + Q_PROPERTY(Fact* correctionsQuality READ correctionsQuality CONSTANT) + Q_PROPERTY(Fact* systemQuality READ systemQuality CONSTANT) + Q_PROPERTY(Fact* gnssSignalQuality READ gnssSignalQuality CONSTANT) + Q_PROPERTY(Fact* postProcessingQuality READ postProcessingQuality CONSTANT) + Q_PROPERTY(Fact *yaw READ yaw CONSTANT) public: explicit VehicleGPSFactGroup(QObject *parent = nullptr); @@ -36,14 +45,23 @@ class VehicleGPSFactGroup : public FactGroup Fact *yaw() { return &_yawFact; } Fact *count() { return &_countFact; } Fact *lock() { return &_lockFact; } + Fact *systemErrors() { return &_systemErrorsFact; } + Fact *spoofingState() { return &_spoofingStateFact; } + Fact *jammingState() { return &_jammingStateFact; } + Fact *authenticationState() { return &_authenticationStateFact; } + Fact *correctionsQuality() { return &_correctionsQualityFact; } + Fact *systemQuality() { return &_systemQualityFact; } + Fact *gnssSignalQuality() { return &_gnssSignalQualityFact; } + Fact *postProcessingQuality() { return &_postProcessingQualityFact; } // Overrides from FactGroup void handleMessage(Vehicle *vehicle, const mavlink_message_t &message) override; protected: - void _handleGpsRawInt(const mavlink_message_t &message); - void _handleHighLatency(const mavlink_message_t &message); - void _handleHighLatency2(const mavlink_message_t &message); + void _handleGpsRawInt (const mavlink_message_t& message); + void _handleHighLatency (const mavlink_message_t& message); + void _handleHighLatency2 (const mavlink_message_t& message); + void _handleGnssIntegrity(const mavlink_message_t& message); Fact _latFact = Fact(0, QStringLiteral("lat"), FactMetaData::valueTypeDouble); Fact _lonFact = Fact(0, QStringLiteral("lon"), FactMetaData::valueTypeDouble); @@ -54,4 +72,12 @@ class VehicleGPSFactGroup : public FactGroup Fact _yawFact = Fact(0, QStringLiteral("yaw"), FactMetaData::valueTypeDouble); Fact _countFact = Fact(0, QStringLiteral("count"), FactMetaData::valueTypeInt32); Fact _lockFact = Fact(0, QStringLiteral("lock"), FactMetaData::valueTypeInt32); + Fact _systemErrorsFact = Fact(0, QStringLiteral("systemErrors"), FactMetaData::valueTypeUint8); + Fact _spoofingStateFact = Fact(0, QStringLiteral("spoofingState"), FactMetaData::valueTypeUint8); + Fact _jammingStateFact = Fact(0, QStringLiteral("jammingState"), FactMetaData::valueTypeUint8); + Fact _authenticationStateFact = Fact(0, QStringLiteral("authenticationState"), FactMetaData::valueTypeUint8); + Fact _correctionsQualityFact = Fact(0, QStringLiteral("correctionsQuality"), FactMetaData::valueTypeUint8); + Fact _systemQualityFact = Fact(0, QStringLiteral("systemQuality"), FactMetaData::valueTypeUint8); + Fact _gnssSignalQualityFact = Fact(0, QStringLiteral("gnssSignalQuality"), FactMetaData::valueTypeUint8); + Fact _postProcessingQualityFact = Fact(0, QStringLiteral("postProcessingQuality"), FactMetaData::valueTypeUint8); }; diff --git a/translations/qgc-json.ts b/translations/qgc-json.ts index 765b1f0137c7..ae4ea12b6b84 100644 --- a/translations/qgc-json.ts +++ b/translations/qgc-json.ts @@ -1979,6 +1979,9 @@ UAVCAN configure + + + VibrationFact.json .mavCmdInfo[MAV_CMD_PREFLIGHT_STORAGE].friendlyName, @@ -2473,6 +2476,30 @@ Sat Count + + .QGC.MetaData.Facts[correctionsQuality].shortDesc, + + Corrections Quality + + + + .QGC.MetaData.Facts[systemQuality].shortDesc, + + System Status Quality + + + + .QGC.MetaData.Facts[gnssSignalQuality].shortDesc, + + Gnss Signal Quality + + + + .QGC.MetaData.Facts[postProcessingQuality].shortDesc, + + Post Processing Quality + + TerrainFactGroup.json