From f978894dced68d8f8cc6599d4e213c10e41a41e1 Mon Sep 17 00:00:00 2001 From: Thomas Frans Date: Fri, 26 Apr 2024 16:14:21 +0200 Subject: [PATCH] Add support for GNSS receiver resilience information --- qgcimages.qrc | 2 + qgroundcontrol.qrc | 2 + src/Comms/MockLink/MockLink.cc | 2 +- src/FirmwarePlugin/FirmwarePlugin.cc | 2 + src/QmlControls/QGCPalette.cc | 1 + src/QmlControls/QGCPalette.h | 1 + src/UI/toolbar/GPSAuthenticationIndicator.qml | 97 ++++++++++++++ src/UI/toolbar/GPSIndicator.qml | 2 +- src/UI/toolbar/GPSIndicatorPage.qml | 25 ++++ src/UI/toolbar/GPSInterferenceIndicator.qml | 123 ++++++++++++++++++ src/UI/toolbar/Images/GpsAuthentication.svg | 4 + src/UI/toolbar/Images/GpsInterference.svg | 80 ++++++++++++ src/Vehicle/FactGroups/GPSFact.json | 20 +++ src/Vehicle/FactGroups/VehicleGPSFactGroup.cc | 55 +++++--- src/Vehicle/FactGroups/VehicleGPSFactGroup.h | 55 +++++--- src/ui/toolbar/CMakeLists.txt | 26 ++++ tools/setup/install-dependencies-debian.sh | 0 17 files changed, 460 insertions(+), 37 deletions(-) create mode 100644 src/UI/toolbar/GPSAuthenticationIndicator.qml create mode 100644 src/UI/toolbar/GPSInterferenceIndicator.qml create mode 100644 src/UI/toolbar/Images/GpsAuthentication.svg create mode 100644 src/UI/toolbar/Images/GpsInterference.svg create mode 100644 src/ui/toolbar/CMakeLists.txt mode change 100755 => 100644 tools/setup/install-dependencies-debian.sh diff --git a/qgcimages.qrc b/qgcimages.qrc index 20f5b1ed135..a4d0b7b9398 100644 --- a/qgcimages.qrc +++ b/qgcimages.qrc @@ -96,6 +96,8 @@ src/AnalyzeView/GeoTagIcon.svg src/UI/toolbar/Images/Gps.svg src/UI/toolbar/Images/Hamburger.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/qgroundcontrol.qrc b/qgroundcontrol.qrc index 5aae1a80561..aaf2d7ea1a2 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -14,6 +14,8 @@ src/UI/toolbar/VTOLModeIndicator.qml src/UI/toolbar/APMSupportForwardingIndicator.qml src/UI/toolbar/GimbalIndicator.qml + src/UI/toolbar/GPSAuthenticationIndicator.qml + src/UI/toolbar/GPSInterferenceIndicator.qml src/FlightDisplay/DefaultChecklist.qml diff --git a/src/Comms/MockLink/MockLink.cc b/src/Comms/MockLink/MockLink.cc index 1859c2969d0..09f46139b73 100644 --- a/src/Comms/MockLink/MockLink.cc +++ b/src/Comms/MockLink/MockLink.cc @@ -1312,7 +1312,7 @@ void MockLink::_sendGpsRawInt(void) 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 + 65535); respondWithMavlinkMessage(msg); } diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index 2d6d4aa7a1c..014bb0ea8d5 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -311,6 +311,8 @@ const QVariantList& FirmwarePlugin::toolIndicators(const Vehicle*) QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Controls/FlightModeIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/MessageIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSIndicator.qml")), + QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSInterferenceIndicator.qml")), + QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSAuthenticationIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/TelemetryRSSIIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RCRSSIIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/qml/QGroundControl/Controls/BatteryIndicator.qml")), diff --git a/src/QmlControls/QGCPalette.cc b/src/QmlControls/QGCPalette.cc index fedfa73b488..9f0b9ececd7 100644 --- a/src/QmlControls/QGCPalette.cc +++ b/src/QmlControls/QGCPalette.cc @@ -69,6 +69,7 @@ void QGCPalette::_buildMap() DECLARE_QGC_COLOR(mapIndicator, "#585858", "#be781c", "#585858", "#be781c") DECLARE_QGC_COLOR(mapIndicatorChild, "#585858", "#766043", "#585858", "#766043") DECLARE_QGC_COLOR(colorGreen, "#009431", "#009431", "#00e04b", "#00e04b") + DECLARE_QGC_COLOR(colorYellow, "#ffdb00", "#ffdb00", "#e1c100", "#e1c100") DECLARE_QGC_COLOR(colorOrange, "#b95604", "#b95604", "#de8500", "#de8500") DECLARE_QGC_COLOR(colorRed, "#ed3939", "#ed3939", "#f32836", "#f32836") DECLARE_QGC_COLOR(colorGrey, "#808080", "#808080", "#bfbfbf", "#bfbfbf") diff --git a/src/QmlControls/QGCPalette.h b/src/QmlControls/QGCPalette.h index ceb860a7196..388f0c14b93 100644 --- a/src/QmlControls/QGCPalette.h +++ b/src/QmlControls/QGCPalette.h @@ -138,6 +138,7 @@ class QGCPalette : public QObject DEFINE_QGC_COLOR(brandingPurple, setBrandingPurple) DEFINE_QGC_COLOR(brandingBlue, setBrandingBlue) DEFINE_QGC_COLOR(colorGreen, setColorGreen) + DEFINE_QGC_COLOR(colorYellow, setColorYellow) DEFINE_QGC_COLOR(colorOrange, setColorOrange) DEFINE_QGC_COLOR(colorRed, setColorRed) DEFINE_QGC_COLOR(colorGrey, setColorGrey) diff --git a/src/UI/toolbar/GPSAuthenticationIndicator.qml b/src/UI/toolbar/GPSAuthenticationIndicator.qml new file mode 100644 index 00000000000..35b0e6d9441 --- /dev/null +++ b/src/UI/toolbar/GPSAuthenticationIndicator.qml @@ -0,0 +1,97 @@ +/**************************************************************************** + * + * (c) 2009-2020 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 bool showIndicator: _activeVehicle.gps.authenticationState.value > 0 + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + function authenticationIconColor() { + if (_activeVehicle.gps.authenticationState.value === 0) { + return qgcPal.colorGrey + } else if (_activeVehicle.gps.authenticationState.value === 1) { + return qgcPal.colorYellow + } else if (_activeVehicle.gps.authenticationState.value === 2) { + return qgcPal.colorRed + } else if (_activeVehicle.gps.authenticationState.value === 3) { + return qgcPal.colorGreen + } else if (_activeVehicle.gps.authenticationState.value === 4) { + return qgcPal.colorGrey + } + } + + function getAuthenticationText(){ + if (_activeVehicle.gps.authenticationState.value === 0) { + return qsTr("Unkown") + } else if (_activeVehicle.gps.authenticationState.value === 1) { + return qsTr("Initializing...") + } else if (_activeVehicle.gps.authenticationState.value === 2) { + return qsTr("Failed") + } else if (_activeVehicle.gps.authenticationState.value === 3) { + return qsTr("OK") + } else if (_activeVehicle.gps.authenticationState.value === 4) { + return qsTr("Disabled") + } + return qsTr("n/a") + } + + 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 + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + SettingsGroupLayout { + heading: qsTr("GPS Authentication") + contentSpacing: 0 + showDividers: false + + LabelledLabel { + label: qsTr("Status") + labelText: getAuthenticationText() + } + + } + } + } +} diff --git a/src/UI/toolbar/GPSIndicator.qml b/src/UI/toolbar/GPSIndicator.qml index 36f159cda12..0fdc41c9931 100644 --- a/src/UI/toolbar/GPSIndicator.qml +++ b/src/UI/toolbar/GPSIndicator.qml @@ -37,7 +37,7 @@ Item { fillMode: Image.PreserveAspectFit sourceSize.height: height opacity: (_activeVehicle && _activeVehicle.gps.count.value >= 0) ? 1 : 0.5 - color: qgcPal.buttonText + color: (_activeVehicle && _activeVehicle.gps.systemErrors.value !== 0) ? qgcPal.colorRed : qgcPal.buttonText } Column { diff --git a/src/UI/toolbar/GPSIndicatorPage.qml b/src/UI/toolbar/GPSIndicatorPage.qml index fd5a9a5dfdb..34b22e6ad3b 100644 --- a/src/UI/toolbar/GPSIndicatorPage.qml +++ b/src/UI/toolbar/GPSIndicatorPage.qml @@ -27,6 +27,25 @@ ToolIndicatorPage { property var rtkSettings: QGroundControl.settingsManager.rtkSettings property bool useFixedPosition: rtkSettings.useFixedBasePosition.rawValue + function errorText() { + 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 "Multiple errors" + } + contentComponent: Component { ColumnLayout { spacing: ScreenTools.defaultFontPixelHeight / 2 @@ -58,6 +77,12 @@ ToolIndicatorPage { label: qsTr("Course Over Ground") labelText: activeVehicle ? activeVehicle.gps.courseOverGround.valueString : valueNA } + + LabelledLabel { + label: qsTr("GPS Error") + labelText: errorText() + visible: _activeVehicle.gps.systemErrors.value > 0 + } } SettingsGroupLayout { diff --git a/src/UI/toolbar/GPSInterferenceIndicator.qml b/src/UI/toolbar/GPSInterferenceIndicator.qml new file mode 100644 index 00000000000..bf987417a88 --- /dev/null +++ b/src/UI/toolbar/GPSInterferenceIndicator.qml @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * (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 bool showIndicator: _activeVehicle.gps.spoofingState.value > 0 || _activeVehicle.gps.jammingState.value > 0 + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + function interferenceIconColor() { + if (_activeVehicle.gps.spoofingState.value === 1 && _activeVehicle.gps.jammingState.value === 1) { + return qgcPal.colorWhite + } else if ((_activeVehicle.gps.spoofingState.value === 2 && _activeVehicle.gps.jammingState.value<3) || (_activeVehicle.gps.jammingState.value === 2 && _activeVehicle.gps.spoofingState.value<3)) { + return qgcPal.colorOrange + } else if (_activeVehicle.gps.spoofingState.value === 3 || _activeVehicle.gps.jammingState.value === 3) { + return qgcPal.colorRed + } + return qgcPal.colorGrey + } + + function spoofingText() { + if (_activeVehicle.gps.spoofingState.value === 1) { + return qsTr("OK") + } else if (_activeVehicle.gps.spoofingState.value === 2) { + return qsTr("Mitigated") + } else if (_activeVehicle.gps.spoofingState.value === 3) { + return qsTr("Ongoing") + } + return qsTr("n/a") + } + function jammingText() { + if (_activeVehicle.gps.jammingState.value === 1) { + return qsTr("OK") + } else if (_activeVehicle.gps.jammingState.value === 2) { + return qsTr("Mitigated") + } else if (_activeVehicle.gps.jammingState.value === 3) { + return qsTr("Ongoing") + } + return qsTr("n/a") + } + + function interferenceText() { + if (_activeVehicle.gps.spoofingState.value === 1) { + return qsTr("OK") + } else if (_activeVehicle.gps.spoofingState.value === 2) { + return qsTr("Mitigated") + } else if (_activeVehicle.gps.spoofingState.value === 3) { + return qsTr("Ongoing") + } + return Integer.class.isIntsance(_activeVehicle.gps.spoofingState.value) ? qsTr("N/A") : qsTr("n/a") + } + + 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: interferenceIconColor() + } + + 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 + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + SettingsGroupLayout { + heading: qsTr("GPS Interference Status") + showDividers: true + + LabelledLabel { + label: qsTr("GPS Jamming") + labelText: jammingText() + } + + LabelledLabel { + label: qsTr("GPS Spoofing") + labelText: spoofingText() + } + } + } + } +} diff --git a/src/UI/toolbar/Images/GpsAuthentication.svg b/src/UI/toolbar/Images/GpsAuthentication.svg new file mode 100644 index 00000000000..68e0fd625a0 --- /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 00000000000..62a92a6e3c2 --- /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 c02412eacde..820f80c7348 100644 --- a/src/Vehicle/FactGroups/GPSFact.json +++ b/src/Vehicle/FactGroups/GPSFact.json @@ -51,6 +51,26 @@ "name": "count", "shortDesc": "Sat Count", "type": "uint32" +}, +{ + "name": "systemErrors", + "shortDesc": "General System Errors", + "type": "uint32" +}, +{ + "name": "spoofingState", + "shortDesc": "Signal Spoofing State", + "type": "uint8" +}, +{ + "name": "jammingState", + "shortDesc": "Signal Jamming State", + "type": "uint8" +}, +{ + "name": "authenticationState", + "shortDesc": "Signal Authentication State", + "type": "uint8" } ] } diff --git a/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc b/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc index 963351cfefb..3776de8e171 100644 --- a/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc +++ b/src/Vehicle/FactGroups/VehicleGPSFactGroup.cc @@ -10,17 +10,22 @@ #include "VehicleGPSFactGroup.h" #include "Vehicle.h" #include "QGCGeo.h" +#include "development/mavlink_msg_gnss_integrity.h" VehicleGPSFactGroup::VehicleGPSFactGroup(QObject* parent) : FactGroup(1000, ":/json/Vehicle/GPSFact.json", parent) - , _latFact (0, _latFactName, FactMetaData::valueTypeDouble) - , _lonFact (0, _lonFactName, FactMetaData::valueTypeDouble) - , _mgrsFact (0, _mgrsFactName, FactMetaData::valueTypeString) - , _hdopFact (0, _hdopFactName, FactMetaData::valueTypeDouble) - , _vdopFact (0, _vdopFactName, FactMetaData::valueTypeDouble) - , _courseOverGroundFact (0, _courseOverGroundFactName, FactMetaData::valueTypeDouble) - , _countFact (0, _countFactName, FactMetaData::valueTypeInt32) - , _lockFact (0, _lockFactName, FactMetaData::valueTypeInt32) + , _latFact (0, _latFactName, FactMetaData::valueTypeDouble) + , _lonFact (0, _lonFactName, FactMetaData::valueTypeDouble) + , _mgrsFact (0, _mgrsFactName, FactMetaData::valueTypeString) + , _hdopFact (0, _hdopFactName, FactMetaData::valueTypeDouble) + , _vdopFact (0, _vdopFactName, FactMetaData::valueTypeDouble) + , _courseOverGroundFact (0, _courseOverGroundFactName, FactMetaData::valueTypeDouble) + , _countFact (0, _countFactName, FactMetaData::valueTypeInt32) + , _lockFact (0, _lockFactName, FactMetaData::valueTypeInt32) + , _systemErrorsFact (0, _systemErrorsFactName, FactMetaData::valueTypeUint32) + , _spoofingStateFact (0, _spoofingStateFactName, FactMetaData::valueTypeUint8) + , _jammingStateFact (0, _jammingStateFactName, FactMetaData::valueTypeUint8) + , _authenticationStateFact (0, _authenticationStateFactName, FactMetaData::valueTypeUint8) { _addFact(&_latFact, _latFactName); _addFact(&_lonFact, _lonFactName); @@ -30,6 +35,10 @@ VehicleGPSFactGroup::VehicleGPSFactGroup(QObject* parent) _addFact(&_courseOverGroundFact, _courseOverGroundFactName); _addFact(&_lockFact, _lockFactName); _addFact(&_countFact, _countFactName); + _addFact(&_systemErrorsFact, _systemErrorsFactName); + _addFact(&_spoofingStateFact, _spoofingStateFactName); + _addFact(&_jammingStateFact, _jammingStateFactName); + _addFact(&_authenticationStateFact, _authenticationStateFactName); _latFact.setRawValue(std::numeric_limits::quiet_NaN()); _lonFact.setRawValue(std::numeric_limits::quiet_NaN()); @@ -51,6 +60,9 @@ void VehicleGPSFactGroup::handleMessage(Vehicle* /* vehicle */, mavlink_message_ case MAVLINK_MSG_ID_HIGH_LATENCY2: _handleHighLatency2(message); break; + case MAVLINK_MSG_ID_GNSS_INTEGRITY: + _handleGnssIntegrity(message); + break; default: break; } @@ -61,14 +73,14 @@ void VehicleGPSFactGroup::_handleGpsRawInt(mavlink_message_t& message) mavlink_gps_raw_int_t gpsRawInt; mavlink_msg_gps_raw_int_decode(&message, &gpsRawInt); - lat()->setRawValue (gpsRawInt.lat * 1e-7); - lon()->setRawValue (gpsRawInt.lon * 1e-7); - mgrs()->setRawValue (QGCGeo::convertGeoToMGRS(QGeoCoordinate(gpsRawInt.lat * 1e-7, gpsRawInt.lon * 1e-7))); - count()->setRawValue (gpsRawInt.satellites_visible == 255 ? 0 : gpsRawInt.satellites_visible); - hdop()->setRawValue (gpsRawInt.eph == UINT16_MAX ? qQNaN() : gpsRawInt.eph / 100.0); - vdop()->setRawValue (gpsRawInt.epv == UINT16_MAX ? qQNaN() : gpsRawInt.epv / 100.0); - courseOverGround()->setRawValue (gpsRawInt.cog == UINT16_MAX ? qQNaN() : gpsRawInt.cog / 100.0); - lock()->setRawValue (gpsRawInt.fix_type); + lat()->setRawValue (gpsRawInt.lat * 1e-7); + lon()->setRawValue (gpsRawInt.lon * 1e-7); + mgrs()->setRawValue (QGCGeo::convertGeoToMGRS(QGeoCoordinate(gpsRawInt.lat * 1e-7, gpsRawInt.lon * 1e-7))); + count()->setRawValue (gpsRawInt.satellites_visible == 255 ? 0 : gpsRawInt.satellites_visible); + hdop()->setRawValue (gpsRawInt.eph == UINT16_MAX ? qQNaN() : gpsRawInt.eph / 100.0); + vdop()->setRawValue (gpsRawInt.epv == UINT16_MAX ? qQNaN() : gpsRawInt.epv / 100.0); + courseOverGround()->setRawValue (gpsRawInt.cog == UINT16_MAX ? qQNaN() : gpsRawInt.cog / 100.0); + lock()->setRawValue (gpsRawInt.fix_type); } void VehicleGPSFactGroup::_handleHighLatency(mavlink_message_t& message) @@ -104,3 +116,14 @@ void VehicleGPSFactGroup::_handleHighLatency2(mavlink_message_t& message) hdop()->setRawValue (highLatency2.eph == UINT8_MAX ? qQNaN() : highLatency2.eph / 10.0); vdop()->setRawValue (highLatency2.epv == UINT8_MAX ? qQNaN() : highLatency2.epv / 10.0); } + +void VehicleGPSFactGroup::_handleGnssIntegrity(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); +} diff --git a/src/Vehicle/FactGroups/VehicleGPSFactGroup.h b/src/Vehicle/FactGroups/VehicleGPSFactGroup.h index 868ed8d42c4..f7dc1b3b6c1 100644 --- a/src/Vehicle/FactGroups/VehicleGPSFactGroup.h +++ b/src/Vehicle/FactGroups/VehicleGPSFactGroup.h @@ -19,31 +19,40 @@ class VehicleGPSFactGroup : public FactGroup public: VehicleGPSFactGroup(QObject* parent = nullptr); - 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* 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) - Fact* lat () { return &_latFact; } - Fact* lon () { return &_lonFact; } - Fact* mgrs () { return &_mgrsFact; } - Fact* hdop () { return &_hdopFact; } - Fact* vdop () { return &_vdopFact; } - Fact* courseOverGround () { return &_courseOverGroundFact; } - Fact* count () { return &_countFact; } - Fact* lock () { return &_lockFact; } + Fact* lat () { return &_latFact; } + Fact* lon () { return &_lonFact; } + Fact* mgrs () { return &_mgrsFact; } + Fact* hdop () { return &_hdopFact; } + Fact* vdop () { return &_vdopFact; } + Fact* courseOverGround () { return &_courseOverGroundFact; } + Fact* count () { return &_countFact; } + Fact* lock () { return &_lockFact; } + Fact* systemErrors () { return &_systemErrorsFact; } + Fact* spoofingState () { return &_spoofingStateFact; } + Fact* jammingState () { return &_jammingStateFact; } + Fact* authenticationState () { return &_authenticationStateFact; } // Overrides from FactGroup virtual void handleMessage(Vehicle* vehicle, mavlink_message_t& message) override; protected: - void _handleGpsRawInt (mavlink_message_t& message); - void _handleHighLatency (mavlink_message_t& message); - void _handleHighLatency2(mavlink_message_t& message); + void _handleGpsRawInt (mavlink_message_t& message); + void _handleHighLatency (mavlink_message_t& message); + void _handleHighLatency2 (mavlink_message_t& message); + void _handleGnssIntegrity(mavlink_message_t& message); const QString _latFactName = QStringLiteral("lat"); const QString _lonFactName = QStringLiteral("lon"); @@ -53,6 +62,10 @@ class VehicleGPSFactGroup : public FactGroup const QString _courseOverGroundFactName = QStringLiteral("courseOverGround"); const QString _countFactName = QStringLiteral("count"); const QString _lockFactName = QStringLiteral("lock"); + const QString _systemErrorsFactName = QStringLiteral("systemErrors"); + const QString _spoofingStateFactName = QStringLiteral("spoofingState"); + const QString _jammingStateFactName = QStringLiteral("jammingState"); + const QString _authenticationStateFactName = QStringLiteral("authenticationState"); Fact _latFact; Fact _lonFact; @@ -62,4 +75,8 @@ class VehicleGPSFactGroup : public FactGroup Fact _courseOverGroundFact; Fact _countFact; Fact _lockFact; + Fact _systemErrorsFact; + Fact _spoofingStateFact; + Fact _jammingStateFact; + Fact _authenticationStateFact; }; diff --git a/src/ui/toolbar/CMakeLists.txt b/src/ui/toolbar/CMakeLists.txt new file mode 100644 index 00000000000..828ab07c513 --- /dev/null +++ b/src/ui/toolbar/CMakeLists.txt @@ -0,0 +1,26 @@ +find_package(Qt6 REQUIRED COMPONENTS Core Qml) + +add_custom_target(UiToolbarQml + SOURCES + ArmedIndicator.qml + BatteryIndicator.qml + FlightModeMenuIndicator.qml + GPSAuthenticationIndicator.qml + GPSInterferenceIndicator.qml + GPSIndicator.qml + GPSIndicatorPage.qml + GPSRTKIndicator.qml + JoystickIndicator.qml + LinkIndicator.qml + MainStatusIndicator.qml + MessageIndicator.qml + ModeIndicator.qml + MultiVehicleSelector.qml + RCRSSIIndicator.qml + RemoteIDIndicator.qml + RemoteIDIndicatorPage.qml + SignalStrength.qml + TelemetryRSSIIndicator.qml + FlyViewToolBar.qml + PlanViewToolBar.qml +) diff --git a/tools/setup/install-dependencies-debian.sh b/tools/setup/install-dependencies-debian.sh old mode 100755 new mode 100644