Skip to content

Commit 1a190a4

Browse files
committed
Vehicle: Add Terrain Altitude Warning
1 parent 10dc9f4 commit 1a190a4

File tree

7 files changed

+89
-5
lines changed

7 files changed

+89
-5
lines changed

src/FlightDisplay/VehicleWarnings.qml

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,28 @@ import QtQuick
1212
import QGroundControl
1313
import QGroundControl.ScreenTools
1414
import QGroundControl.Controls
15+
import QGroundControl.FactSystem
1516

1617
Rectangle {
1718
anchors.margins: -ScreenTools.defaultFontPixelHeight
1819
height: warningsCol.height
1920
width: warningsCol.width
2021
color: Qt.rgba(1, 1, 1, 0.5)
2122
radius: ScreenTools.defaultFontPixelWidth / 2
22-
visible: _noGPSLockVisible || _prearmErrorVisible
23+
visible: _noGPSLockVisible || _prearmErrorVisible || (_altitudeWarnThresholdEnabled.value && (_vehicleAltitudeBelowMin || _vehicleAltitudeAboveMax || !_terrainDataAvailable.value))
2324

2425
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
2526
property bool _noGPSLockVisible: _activeVehicle && _activeVehicle.requiresGpsFix && !_activeVehicle.coordinate.isValid
26-
property bool _prearmErrorVisible: _activeVehicle && !_activeVehicle.armed && _activeVehicle.prearmError && !_activeVehicle.healthAndArmingCheckReport.supported
27+
property bool _prearmErrorVisible: _activeVehicle && !_activeVehicle.armed && _activeVehicle.prearmError
28+
29+
property Fact _altitudeWarnThresholdEnabled: QGroundControl.settingsManager.appSettings.altitudeWarnThresholdEnabled
30+
property Fact _altitudeWarnMinAGL: QGroundControl.settingsManager.appSettings.altitudeWarnMinAGL
31+
property Fact _altitudeWarnMaxAGL: QGroundControl.settingsManager.appSettings.altitudeWarnMaxAGL
32+
property Fact _altitudeAboveTerrain: _activeVehicle ? _activeVehicle.altitudeAboveTerr : null
33+
property Fact _terrainDataAvailable: _activeVehicle ? _activeVehicle.terrainDataAvailable : null
34+
property bool _vehicleAltitudeBelowMin: _activeVehicle && _activeVehicle.altitudeAboveTerr.value < _altitudeWarnMinAGL.value
35+
property bool _vehicleAltitudeAboveMax: _activeVehicle && _activeVehicle.altitudeAboveTerr.value > _altitudeWarnMaxAGL.value
36+
property bool _showAltitudeWarning: _activeVehicle && _activeVehicle.flying && !_activeVehicle.landing
2737

2838
Column {
2939
id: warningsCol
@@ -45,6 +55,30 @@ Rectangle {
4555
text: _activeVehicle ? _activeVehicle.prearmError : ""
4656
}
4757

58+
QGCLabel {
59+
anchors.horizontalCenter: parent.horizontalCenter
60+
visible: _vehicleAltitudeBelowMin && _altitudeWarnThresholdEnabled.value && _showAltitudeWarning && _terrainDataAvailable.value
61+
color: "black"
62+
font.pointSize: ScreenTools.largeFontPointSize
63+
text: qsTr("Altitude below minimum threshold of %1 %2 above terrain: (%3 %4)").arg(_altitudeWarnMinAGL.value).arg(_altitudeWarnMinAGL.units).arg(_altitudeAboveTerrain.value.toFixed(2)).arg(_altitudeAboveTerrain.units)
64+
}
65+
66+
QGCLabel {
67+
anchors.horizontalCenter: parent.horizontalCenter
68+
visible: _vehicleAltitudeAboveMax && _altitudeWarnThresholdEnabled.value && _showAltitudeWarning && _terrainDataAvailable.value
69+
color: "black"
70+
font.pointSize: ScreenTools.largeFontPointSize
71+
text: qsTr("Altitude above maximum threshold of %1 %2 above terrain: (%3 %4)").arg(_altitudeWarnMaxAGL.value).arg(_altitudeWarnMaxAGL.units).arg(_altitudeAboveTerrain.value.toFixed(2)).arg(_altitudeAboveTerrain.units)
72+
}
73+
74+
QGCLabel {
75+
anchors.horizontalCenter: parent.horizontalCenter
76+
visible: !_terrainDataAvailable.value && _altitudeWarnThresholdEnabled.value && _showAltitudeWarning
77+
color: "black"
78+
font.pointSize: ScreenTools.largeFontPointSize
79+
text: qsTr("Terrain data not available at vehicle pos, altitude warning thresholds are disabled")
80+
}
81+
4882
QGCLabel {
4983
anchors.horizontalCenter: parent.horizontalCenter
5084
visible: _prearmErrorVisible

src/Settings/AppSettings.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ DECLARE_SETTINGSFACT(AppSettings, disableAllPersistence)
169169
DECLARE_SETTINGSFACT(AppSettings, firstRunPromptIdsShown)
170170
DECLARE_SETTINGSFACT(AppSettings, loginAirLink)
171171
DECLARE_SETTINGSFACT(AppSettings, passAirLink)
172+
DECLARE_SETTINGSFACT(AppSettings, altitudeWarnThresholdEnabled)
173+
DECLARE_SETTINGSFACT(AppSettings, altitudeWarnMinAGL)
174+
DECLARE_SETTINGSFACT(AppSettings, altitudeWarnMaxAGL)
172175

173176
DECLARE_SETTINGSFACT_NO_FUNC(AppSettings, indoorPalette)
174177
{

src/Settings/AppSettings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class AppSettings : public SettingsGroup
5656
DEFINE_SETTINGFACT(firstRunPromptIdsShown)
5757
DEFINE_SETTINGFACT(loginAirLink)
5858
DEFINE_SETTINGFACT(passAirLink)
59+
DEFINE_SETTINGFACT(altitudeWarnThresholdEnabled)
60+
DEFINE_SETTINGFACT(altitudeWarnMinAGL)
61+
DEFINE_SETTINGFACT(altitudeWarnMaxAGL)
5962

6063
Q_PROPERTY(QString missionSavePath READ missionSavePath NOTIFY savePathsChanged)
6164
Q_PROPERTY(QString parameterSavePath READ parameterSavePath NOTIFY savePathsChanged)

src/UI/AppSettings/FlyViewSettings.qml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,35 @@ SettingsPage {
114114
}
115115
}
116116

117+
SettingsGroupLayout {
118+
Layout.fillWidth: true
119+
heading: qsTr("Altitude above ground level warning threshold")
120+
121+
FactCheckBoxSlider {
122+
Layout.fillWidth: true
123+
text: qsTr("Altitude warning enabled")
124+
visible: _virtualJoystickAutoCenterThrottle.visible
125+
enabled: _virtualJoystick.rawValue
126+
fact: QGroundControl.settingsManager.appSettings.altitudeWarnThresholdEnabled
127+
}
128+
129+
LabelledFactTextField {
130+
Layout.fillWidth: true
131+
label: qsTr("Minimum Altitude")
132+
fact: _settingsManager.appSettings.altitudeWarnMinAGL
133+
visible: fact.visible
134+
enabled: QGroundControl.settingsManager.appSettings.altitudeWarnThresholdEnabled.value
135+
}
136+
137+
LabelledFactTextField {
138+
Layout.fillWidth: true
139+
label: qsTr("Maximum Altitude")
140+
fact: _settingsManager.appSettings.altitudeWarnMaxAGL
141+
visible: fact.visible
142+
enabled: QGroundControl.settingsManager.appSettings.altitudeWarnThresholdEnabled.value
143+
}
144+
}
145+
117146
SettingsGroupLayout {
118147
Layout.fillWidth: true
119148
heading: qsTr("Guided Commands")

src/Vehicle/FactGroups/VehicleFact.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@
8787
"decimalPlaces": 1,
8888
"units": "m"
8989
},
90+
{
91+
"name": "terrainDataAvailable",
92+
"shortDesc": "Terrain Data Available",
93+
"type": "bool",
94+
"defaultValue": false
95+
},
9096
{
9197
"name": "flightDistance",
9298
"shortDesc": "Flight Distance",

src/Vehicle/FactGroups/VehicleFactGroup.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class VehicleFactGroup : public FactGroup
105105
Fact _altitudeRelativeFact = Fact(0, QStringLiteral("altitudeRelative"), FactMetaData::valueTypeDouble);
106106
Fact _altitudeAMSLFact = Fact(0, QStringLiteral("altitudeAMSL"), FactMetaData::valueTypeDouble);
107107
Fact _altitudeAboveTerrFact = Fact(0, QStringLiteral("altitudeAboveTerr"), FactMetaData::valueTypeDouble);
108+
Fact _terrainDataAvailableFact = Fact(0, QStringLiteral("terrainDataAvailable"), FactMetaData::valueTypeBool);
108109
Fact _altitudeTuningFact = Fact(0, QStringLiteral("altitudeTuning"), FactMetaData::valueTypeDouble);
109110
Fact _altitudeTuningSetpointFact = Fact(0, QStringLiteral("altitudeTuningSetpoint"), FactMetaData::valueTypeDouble);
110111
Fact _xTrackErrorFact = Fact(0, QStringLiteral("xTrackError"), FactMetaData::valueTypeDouble);

src/Vehicle/Vehicle.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3766,11 +3766,19 @@ void Vehicle::_updateAltAboveTerrain()
37663766
void Vehicle::_altitudeAboveTerrainReceived(bool success, QList<double> heights)
37673767
{
37683768
if (!success) {
3769-
qCDebug(VehicleLog) << "_altitudeAboveTerrainReceived: terrain data not available for vehicle coordinate";
3769+
qCDebug(VehicleLog) << "terrain data not available for vehicle coordinate";
3770+
if (_coordinate.isValid() &&
3771+
SettingsManager::instance()->altitudeWarnThresholdEnabled()->rawValue().toBool() && _flying) {
3772+
_terrainDataAvailableFact.setRawValue(false);
3773+
}
3774+
_altitudeAboveTerrFact.setRawValue(qQNaN()); // Reset the altitude above terrain fact to NaN
37703775
} else {
3776+
if (!_terrainDataAvailableFact.rawValue().toBool()) {
3777+
_terrainDataAvailableFact.setRawValue(true);
3778+
}
37713779
// Query was succesful, save the data.
3772-
double terrainAltitude = heights[0];
3773-
double altitudeAboveTerrain = altitudeAMSL()->rawValue().toDouble() - terrainAltitude;
3780+
const double terrainAltitude = heights[0];
3781+
const double altitudeAboveTerrain = altitudeAMSL()->rawValue().toDouble() - terrainAltitude;
37743782
_altitudeAboveTerrFact.setRawValue(altitudeAboveTerrain);
37753783
}
37763784
// Clean up

0 commit comments

Comments
 (0)