Commit 5a8b346d authored by Don Gagne's avatar Don Gagne

APM GeoFence and Failsafe Triggers

parent 58eeb933
...@@ -40,6 +40,19 @@ QGCView { ...@@ -40,6 +40,19 @@ QGCView {
QGCPalette { id: palette; colorGroupEnabled: enabled } QGCPalette { id: palette; colorGroupEnabled: enabled }
property Fact _failsafeBattEnabled: controller.getParameterFact(-1, "FS_BATT_ENABLE")
property Fact _failsafeBattMah: controller.getParameterFact(-1, "FS_BATT_MAH")
property Fact _failsafeBattVoltage: controller.getParameterFact(-1, "FS_BATT_VOLTAGE")
property Fact _failsafeThrEnable: controller.getParameterFact(-1, "FS_THR_ENABLE")
property Fact _failsafeThrValue: controller.getParameterFact(-1, "FS_THR_VALUE")
property Fact _fenceAction: controller.getParameterFact(-1, "FENCE_ACTION")
property Fact _fenceAltMax: controller.getParameterFact(-1, "FENCE_ALT_MAX")
property Fact _fenceEnable: controller.getParameterFact(-1, "FENCE_ENABLE")
property Fact _fenceMargin: controller.getParameterFact(-1, "FENCE_MARGIN")
property Fact _fenceRadius: controller.getParameterFact(-1, "FENCE_RADIUS")
property Fact _fenceType: controller.getParameterFact(-1, "FENCE_TYPE")
property Fact _landSpeedFact: controller.getParameterFact(-1, "LAND_SPEED") property Fact _landSpeedFact: controller.getParameterFact(-1, "LAND_SPEED")
property Fact _rtlAltFact: controller.getParameterFact(-1, "RTL_ALT") property Fact _rtlAltFact: controller.getParameterFact(-1, "RTL_ALT")
property Fact _rtlLoitTimeFact: controller.getParameterFact(-1, "RTL_LOIT_TIME") property Fact _rtlLoitTimeFact: controller.getParameterFact(-1, "RTL_LOIT_TIME")
...@@ -47,6 +60,7 @@ QGCView { ...@@ -47,6 +60,7 @@ QGCView {
property real _margins: ScreenTools.defaultFontPixelHeight property real _margins: ScreenTools.defaultFontPixelHeight
ExclusiveGroup { id: fenceActionRadioGroup }
ExclusiveGroup { id: landLoiterRadioGroup } ExclusiveGroup { id: landLoiterRadioGroup }
ExclusiveGroup { id: returnAltRadioGroup } ExclusiveGroup { id: returnAltRadioGroup }
...@@ -61,11 +75,254 @@ QGCView { ...@@ -61,11 +75,254 @@ QGCView {
flickableDirection: Flickable.VerticalFlick flickableDirection: Flickable.VerticalFlick
QGCLabel { QGCLabel {
id: rtlLabel id: failsafeLabel
text: "Return Home Settings" text: "Failsafe Triggers"
font.weight: Font.DemiBold
}
Rectangle {
id: failsafeSettings
anchors.topMargin: _margins / 2
anchors.left: parent.left
anchors.right: parent.right
anchors.top: failsafeLabel.bottom
height: fenceAltMaxField.y + fenceAltMaxField.height + _margins
color: palette.windowShade
QGCLabel {
id: throttleEnableLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: throttleEnableCombo.baseline
text: "Throttle failsafe:"
}
QGCComboBox {
id: throttleEnableCombo
anchors.topMargin: _margins
anchors.left: voltageField.left
anchors.top: parent.top
width: voltageField.width
model: ["Disabled", "Always RTL", "Continue with Mission in Auto Mode", "Always Land"]
currentIndex: _failsafeThrEnable.value
onActivated: _failsafeThrEnable.value = index
}
QGCLabel {
id: throttlePWMLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: throttlePWMField.baseline
text: "PWM threshold:"
}
FactTextField {
id: throttlePWMField
anchors.topMargin: _margins / 2
anchors.left: voltageField.left
anchors.top: throttleEnableCombo.bottom
fact: _failsafeThrValue
showUnits: true
}
QGCLabel {
id: batteryEnableLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: batteryEnableCombo.baseline
text: "Battery failsafe:"
}
QGCComboBox {
id: batteryEnableCombo
anchors.topMargin: _margins
anchors.left: voltageField.left
anchors.top: throttlePWMField.bottom
width: voltageField.width
model: ["Disabled", "Land", "Return to Launch"]
currentIndex: _failsafeBattEnabled.value
onActivated: _failsafeBattEnabled.value = index
}
QGCCheckBox {
id: voltageLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: voltageField.baseline
text: "Voltage threshold:"
checked: _failsafeBattVoltage.value != 0
onClicked: _failsafeBattVoltage.value = checked ? 10.5 : 0
}
FactTextField {
id: voltageField
anchors.topMargin: _margins / 2
anchors.leftMargin: _margins
anchors.left: voltageLabel.right
anchors.top: batteryEnableCombo.bottom
fact: _failsafeBattVoltage
showUnits: true
}
QGCCheckBox {
id: mahLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: mahField.baseline
text: "MAH threshold:"
checked: _failsafeBattMah.value != 0
onClicked: _failsafeBattMah.value = checked ? 600 : 0
}
FactTextField {
id: mahField
anchors.topMargin: _margins / 2
anchors.left: voltageField.left
anchors.top: voltageField.bottom
fact: _failsafeBattMah
showUnits: true
}
} // Rectangle - Failsafe Settings
QGCLabel {
id: geoFenceLabel
anchors.topMargin: _margins
anchors.left: parent.left
anchors.right: parent.right
anchors.top: failsafeSettings.bottom
text: "GeoFence"
font.weight: Font.DemiBold font.weight: Font.DemiBold
} }
Rectangle {
id: geoFenceSettings
anchors.topMargin: _margins / 2
anchors.left: parent.left
anchors.right: parent.right
anchors.top: geoFenceLabel.bottom
height: fenceAltMaxField.y + fenceAltMaxField.height + _margins
color: palette.windowShade
QGCCheckBox {
id: circleGeo
anchors.margins: _margins
anchors.left: parent.left
anchors.top: parent.top
text: "Circle GeoFence enabled"
checked: _fenceEnable.value != 0 && _fenceType.value & 2
onClicked: {
if (checked) {
if (_fenceEnable.value == 1) {
_fenceType.value |= 2
} else {
_fenceEnable.value = 1
_fenceType.value = 2
}
} else if (altitudeGeo.checked) {
_fenceType.value &= ~2
} else {
_fenceEnable.value = 0
_fenceType.value = 0
}
}
}
QGCCheckBox {
id: altitudeGeo
anchors.topMargin: _margins / 2
anchors.left: circleGeo.left
anchors.top: circleGeo.bottom
text: "Altitude GeoFence enabled"
checked: _fenceEnable.value != 0 && _fenceType.value & 1
onClicked: {
if (checked) {
if (_fenceEnable.value == 1) {
_fenceType.value |= 1
} else {
_fenceEnable.value = 1
_fenceType.value = 1
}
} else if (circleGeo.checked) {
_fenceType.value &= ~1
} else {
_fenceEnable.value = 0
_fenceType.value = 0
}
}
}
QGCRadioButton {
id: geoReportRadio
anchors.margins: _margins
anchors.left: parent.left
anchors.top: altitudeGeo.bottom
text: "Report only"
exclusiveGroup: fenceActionRadioGroup
checked: _fenceAction.value == 0
onClicked: _fenceAction.value = 0
}
QGCRadioButton {
id: geoRTLRadio
anchors.topMargin: _margins / 2
anchors.left: circleGeo.left
anchors.top: geoReportRadio.bottom
text: "RTL or Land"
exclusiveGroup: fenceActionRadioGroup
checked: _fenceAction.value == 1
onClicked: _fenceAction.value = 1
}
QGCLabel {
id: fenceRadiusLabel
anchors.left: circleGeo.left
anchors.baseline: fenceRadiusField.baseline
text: "Max radius:"
}
FactTextField {
id: fenceRadiusField
anchors.topMargin: _margins
anchors.left: fenceAltMaxField.left
anchors.top: geoRTLRadio.bottom
fact: _fenceRadius
showUnits: true
}
QGCLabel {
id: fenceAltMaxLabel
anchors.left: circleGeo.left
anchors.baseline: fenceAltMaxField.baseline
text: "Max altitude:"
}
FactTextField {
id: fenceAltMaxField
anchors.topMargin: _margins / 2
anchors.leftMargin: _margin
anchors.left: fenceAltMaxLabel.right
anchors.top: fenceRadiusField.bottom
fact: _fenceAltMax
showUnits: true
}
} // Rectangle - GeoFence Settings
QGCLabel {
id: rtlLabel
anchors.topMargin: _margins
anchors.top: geoFenceSettings.bottom
text: "Return to Launch"
font.weight: Font.DemiBold
}
Rectangle { Rectangle {
anchors.topMargin: _margins / 2 anchors.topMargin: _margins / 2
anchors.left: parent.left anchors.left: parent.left
...@@ -134,7 +391,7 @@ QGCView { ...@@ -134,7 +391,7 @@ QGCView {
checked: _rtlLoitTimeFact.value > 0 checked: _rtlLoitTimeFact.value > 0
text: "Loiter above Home for:" text: "Loiter above Home for:"
onClicked: _rtlLoitTimeFact.value = checked ? 60 : 0 onClicked: _rtlLoitTimeFact.value = (checked ? 60 : 0)
} }
FactTextField { FactTextField {
......
...@@ -14,6 +14,10 @@ FactPanel { ...@@ -14,6 +14,10 @@ FactPanel {
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
FactPanelController { id: controller; factPanel: panel } FactPanelController { id: controller; factPanel: panel }
property Fact _fenceAction: controller.getParameterFact(-1, "FENCE_ACTION")
property Fact _fenceEnable: controller.getParameterFact(-1, "FENCE_ENABLE")
property Fact _fenceType: controller.getParameterFact(-1, "FENCE_TYPE")
property Fact _rtlAltFact: controller.getParameterFact(-1, "RTL_ALT") property Fact _rtlAltFact: controller.getParameterFact(-1, "RTL_ALT")
property Fact _rtlLoitTimeFact: controller.getParameterFact(-1, "RTL_LOIT_TIME") property Fact _rtlLoitTimeFact: controller.getParameterFact(-1, "RTL_LOIT_TIME")
property Fact _rtlAltFinalFact: controller.getParameterFact(-1, "RTL_ALT_FINAL") property Fact _rtlAltFinalFact: controller.getParameterFact(-1, "RTL_ALT_FINAL")
...@@ -23,6 +27,22 @@ FactPanel { ...@@ -23,6 +27,22 @@ FactPanel {
anchors.fill: parent anchors.fill: parent
anchors.margins: 8 anchors.margins: 8
VehicleSummaryRow {
labelText: "GeoFence:"
valueText: _fenceEnable.value == 0 || _fenceType == 0 ?
"Disabled" :
(_fenceType.value == 1 ?
"Altitude" :
(_fenceType.value == 2 ? "Circle" : "Altitude,Circle"))
}
VehicleSummaryRow {
labelText: "GeoFence:"
valueText: _fenceAction.value == 0 ?
"Report only" :
(_fenceAction.value == 1 ? "RTL or Land" : "Unknown")
}
VehicleSummaryRow { VehicleSummaryRow {
labelText: "RTL min alt:" labelText: "RTL min alt:"
valueText: _rtlAltFact.value == 0 ? "current" : _rtlAltFact.valueString valueText: _rtlAltFact.value == 0 ? "current" : _rtlAltFact.valueString
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment