7 changed files with 12999 additions and 4631 deletions
@ -0,0 +1,778 @@
@@ -0,0 +1,778 @@
|
||||
/**************************************************************************** |
||||
* |
||||
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
||||
* |
||||
* QGroundControl is licensed according to the terms in the file |
||||
* COPYING.md in the root of the source code directory. |
||||
* |
||||
****************************************************************************/ |
||||
|
||||
import QtQuick 2.3 |
||||
import QtQuick.Controls 1.2 |
||||
import QtGraphicalEffects 1.0 |
||||
import QtQuick.Layouts 1.2 |
||||
|
||||
import QGroundControl.FactSystem 1.0 |
||||
import QGroundControl.FactControls 1.0 |
||||
import QGroundControl.Palette 1.0 |
||||
import QGroundControl.Controls 1.0 |
||||
import QGroundControl.ScreenTools 1.0 |
||||
|
||||
SetupPage { |
||||
id: safetyPage |
||||
pageComponent: safetyPageComponent |
||||
|
||||
Component { |
||||
id: safetyPageComponent |
||||
|
||||
Flow { |
||||
id: flowLayout |
||||
width: availableWidth |
||||
spacing: _margins |
||||
|
||||
FactPanelController { id: controller; factPanel: safetyPage.viewPanel } |
||||
|
||||
QGCPalette { id: ggcPal; colorGroupEnabled: true } |
||||
|
||||
property Fact _batt1Monitor: controller.getParameterFact(-1, "BATT_MONITOR") |
||||
property Fact _batt2Monitor: controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */) |
||||
property bool _batt2MonitorAvailable: controller.parameterExists(-1, "BATT2_MONITOR") |
||||
property bool _batt1MonitorEnabled: _batt1Monitor.rawValue !== 0 |
||||
property bool _batt2MonitorEnabled: _batt2MonitorAvailable ? _batt2Monitor.rawValue !== 0 : false |
||||
property bool _batt1ParamsAvailable: controller.parameterExists(-1, "BATT_CAPACITY") |
||||
property bool _batt2ParamsAvailable: controller.parameterExists(-1, "BATT2_CAPACITY") |
||||
|
||||
property Fact _failsafeBatt1LowAct: controller.getParameterFact(-1, "BATT_FS_LOW_ACT", false /* reportMissing */) |
||||
property Fact _failsafeBatt2LowAct: controller.getParameterFact(-1, "BATT2_FS_LOW_ACT", false /* reportMissing */) |
||||
property Fact _failsafeBatt1CritAct: controller.getParameterFact(-1, "BATT_FS_CRT_ACT", false /* reportMissing */) |
||||
property Fact _failsafeBatt2CritAct: controller.getParameterFact(-1, "BATT2_FS_CRT_ACT", false /* reportMissing */) |
||||
property Fact _failsafeBatt1Mah: controller.getParameterFact(-1, "BATT_LOW_MAH", false /* reportMissing */) |
||||
property Fact _failsafeBatt2Mah: controller.getParameterFact(-1, "BATT2_LOW_MAH", false /* reportMissing */) |
||||
property Fact _failsafeBatt1Voltage: controller.getParameterFact(-1, "BATT_LOW_VOLT", false /* reportMissing */) |
||||
property Fact _failsafeBatt2Voltage: controller.getParameterFact(-1, "BATT2_LOW_VOLT", false /* reportMissing */) |
||||
|
||||
property Fact _armingCheck: controller.getParameterFact(-1, "ARMING_CHECK") |
||||
|
||||
property real _margins: ScreenTools.defaultFontPixelHeight |
||||
property bool _showIcon: !ScreenTools.isTinyScreen |
||||
|
||||
ExclusiveGroup { id: fenceActionRadioGroup } |
||||
ExclusiveGroup { id: landLoiterRadioGroup } |
||||
ExclusiveGroup { id: returnAltRadioGroup } |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
visible: _batt1MonitorEnabled && _batt1ParamsAvailable |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Battery1 Failsafe Triggers") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
width: batteryFailsafeColumn.x + batteryFailsafeColumn.width + _margins |
||||
height: batteryFailsafeColumn.y + batteryFailsafeColumn.height + _margins |
||||
color: ggcPal.windowShade |
||||
|
||||
Column { |
||||
id: batteryFailsafeColumn |
||||
anchors.margins: _margins |
||||
anchors.top: parent.top |
||||
anchors.left: parent.left |
||||
spacing: _margins |
||||
|
||||
GridLayout { |
||||
id: gridLayout |
||||
columnSpacing: _margins |
||||
rowSpacing: _margins |
||||
columns: 2 |
||||
QGCLabel { text: qsTr("Battery low action:") } |
||||
FactComboBox { |
||||
fact: _failsafeBatt1LowAct |
||||
indexModel: false |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Battery critical action:") |
||||
} |
||||
FactComboBox { |
||||
fact: _failsafeBatt1CritAct |
||||
indexModel: false |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCCheckBox { |
||||
text: qsTr("Voltage threshold:") |
||||
checked: _failsafeBatt1Voltage.value != 0 |
||||
onClicked: _failsafeBatt1Voltage.value = checked ? 10.5 : 0 |
||||
} |
||||
FactTextField { |
||||
fact: _failsafeBatt1Voltage |
||||
showUnits: true |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCCheckBox { |
||||
text: qsTr("MAH threshold:") |
||||
checked: _failsafeBatt1Mah.value != 0 |
||||
onClicked: _failsafeBatt1Mah.value = checked ? 600 : 0 |
||||
} |
||||
FactTextField { |
||||
fact: _failsafeBatt1Mah |
||||
showUnits: true |
||||
Layout.fillWidth: true |
||||
} |
||||
} // GridLayout |
||||
} // Column |
||||
} // Rectangle |
||||
} // Column - Battery Failsafe Settings |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
visible: _batt2MonitorEnabled && _batt2ParamsAvailable |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Battery2 Failsafe Triggers") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
id: failsafeSettings |
||||
width: battery2FailsafeColumn.x + battery2FailsafeColumn.width + _margins |
||||
height: battery2FailsafeColumn.y + battery2FailsafeColumn.height + _margins |
||||
color: ggcPal.windowShade |
||||
|
||||
Column { |
||||
id: battery2FailsafeColumn |
||||
anchors.margins: _margins |
||||
anchors.top: parent.top |
||||
anchors.left: parent.left |
||||
spacing: _margins |
||||
|
||||
GridLayout { |
||||
columnSpacing: _margins |
||||
rowSpacing: _margins |
||||
columns: 2 |
||||
visible: _batt2MonitorEnabled && _failsafeBatt2LowActAvailable |
||||
|
||||
QGCLabel { text: qsTr("Battery low action:") } |
||||
FactComboBox { |
||||
fact: _failsafeBatt2LowAct |
||||
indexModel: false |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Battery critical action:") |
||||
} |
||||
FactComboBox { |
||||
fact: _failsafeBatt2CritAct |
||||
indexModel: false |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCCheckBox { |
||||
text: qsTr("Voltage threshold:") |
||||
checked: _failsafeBatt2Voltage.value != 0 |
||||
onClicked: _failsafeBatt2Voltage.value = checked ? 10.5 : 0 |
||||
} |
||||
FactTextField { |
||||
fact: _failsafeBatt2Voltage |
||||
showUnits: true |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCCheckBox { |
||||
text: qsTr("MAH threshold:") |
||||
checked: _failsafeBatt2Mah.value != 0 |
||||
onClicked: _failsafeBatt2Mah.value = checked ? 600 : 0 |
||||
} |
||||
FactTextField { |
||||
fact: _failsafeBatt2Mah |
||||
showUnits: true |
||||
Layout.fillWidth: true |
||||
} |
||||
} // GridLayout |
||||
} // Column |
||||
} // Rectangle |
||||
} // Column - Battery2 Failsafe Settings |
||||
|
||||
Component { |
||||
id: planeGeneralFS |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
property Fact _failsafeThrEnable: controller.getParameterFact(-1, "THR_FAILSAFE") |
||||
property Fact _failsafeThrValue: controller.getParameterFact(-1, "THR_FS_VALUE") |
||||
property Fact _failsafeGCSEnable: controller.getParameterFact(-1, "FS_GCS_ENABL") |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Failsafe Triggers") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
width: fsColumn.x + fsColumn.width + _margins |
||||
height: fsColumn.y + fsColumn.height + _margins |
||||
color: qgcPal.windowShade |
||||
|
||||
ColumnLayout { |
||||
id: fsColumn |
||||
anchors.margins: _margins |
||||
anchors.left: parent.left |
||||
anchors.top: parent.top |
||||
|
||||
RowLayout { |
||||
QGCCheckBox { |
||||
id: throttleEnableCheckBox |
||||
text: qsTr("Throttle PWM threshold:") |
||||
checked: _failsafeThrEnable.value === 1 |
||||
|
||||
onClicked: _failsafeThrEnable.value = (checked ? 1 : 0) |
||||
} |
||||
|
||||
FactTextField { |
||||
fact: _failsafeThrValue |
||||
showUnits: true |
||||
enabled: throttleEnableCheckBox.checked |
||||
} |
||||
} |
||||
|
||||
QGCCheckBox { |
||||
text: qsTr("GCS failsafe") |
||||
checked: _failsafeGCSEnable.value != 0 |
||||
onClicked: _failsafeGCSEnable.value = checked ? 1 : 0 |
||||
} |
||||
} |
||||
} // Rectangle - Failsafe trigger settings |
||||
} // Column - Failsafe trigger settings |
||||
} |
||||
|
||||
Loader { |
||||
sourceComponent: controller.vehicle.fixedWing ? planeGeneralFS : undefined |
||||
} |
||||
|
||||
Component { |
||||
id: roverGeneralFS |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
property Fact _failsafeGCSEnable: controller.getParameterFact(-1, "FS_GCS_ENABLE") |
||||
property Fact _failsafeThrEnable: controller.getParameterFact(-1, "FS_THR_ENABLE") |
||||
property Fact _failsafeThrValue: controller.getParameterFact(-1, "FS_THR_VALUE") |
||||
property Fact _failsafeAction: controller.getParameterFact(-1, "FS_ACTION") |
||||
property Fact _failsafeCrashCheck: controller.getParameterFact(-1, "FS_CRASH_CHECK") |
||||
|
||||
QGCLabel { |
||||
id: failsafeLabel |
||||
text: qsTr("Failsafe Triggers") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
id: failsafeSettings |
||||
width: fsGrid.x + fsGrid.width + _margins |
||||
height: fsGrid.y + fsGrid.height + _margins |
||||
color: ggcPal.windowShade |
||||
|
||||
GridLayout { |
||||
id: fsGrid |
||||
anchors.margins: _margins |
||||
anchors.left: parent.left |
||||
anchors.top: parent.top |
||||
columns: 2 |
||||
|
||||
QGCLabel { text: qsTr("Ground Station failsafe:") } |
||||
FactComboBox { |
||||
Layout.fillWidth: true |
||||
fact: _failsafeGCSEnable |
||||
indexModel: false |
||||
} |
||||
|
||||
QGCLabel { text: qsTr("Throttle failsafe:") } |
||||
FactComboBox { |
||||
Layout.fillWidth: true |
||||
fact: _failsafeThrEnable |
||||
indexModel: false |
||||
} |
||||
|
||||
QGCLabel { text: qsTr("PWM threshold:") } |
||||
FactTextField { |
||||
Layout.fillWidth: true |
||||
fact: _failsafeThrValue |
||||
} |
||||
|
||||
QGCLabel { text: qsTr("Failsafe Crash Check:") } |
||||
FactComboBox { |
||||
Layout.fillWidth: true |
||||
fact: _failsafeCrashCheck |
||||
indexModel: false |
||||
} |
||||
} |
||||
} // Rectangle - Failsafe Settings |
||||
} // Column - Failsafe Settings |
||||
} |
||||
|
||||
Loader { |
||||
sourceComponent: controller.vehicle.rover ? roverGeneralFS : undefined |
||||
} |
||||
|
||||
Component { |
||||
id: copterGeneralFS |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
property Fact _failsafeGCSEnable: controller.getParameterFact(-1, "FS_GCS_ENABLE") |
||||
property Fact _failsafeBattLowAct: controller.getParameterFact(-1, "r.BATT_FS_LOW_ACT", false /* reportMissing */) |
||||
property Fact _failsafeBattMah: controller.getParameterFact(-1, "r.BATT_LOW_MAH", false /* reportMissing */) |
||||
property Fact _failsafeBattVoltage: controller.getParameterFact(-1, "r.BATT_LOW_VOLT", false /* reportMissing */) |
||||
property Fact _failsafeThrEnable: controller.getParameterFact(-1, "FS_THR_ENABLE") |
||||
property Fact _failsafeThrValue: controller.getParameterFact(-1, "FS_THR_VALUE") |
||||
|
||||
QGCLabel { |
||||
text: qsTr("General Failsafe Triggers") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
width: generalFailsafeColumn.x + generalFailsafeColumn.width + _margins |
||||
height: generalFailsafeColumn.y + generalFailsafeColumn.height + _margins |
||||
color: ggcPal.windowShade |
||||
|
||||
Column { |
||||
id: generalFailsafeColumn |
||||
anchors.margins: _margins |
||||
anchors.top: parent.top |
||||
anchors.left: parent.left |
||||
spacing: _margins |
||||
|
||||
GridLayout { |
||||
columnSpacing: _margins |
||||
rowSpacing: _margins |
||||
columns: 2 |
||||
|
||||
QGCLabel { text: qsTr("Ground Station failsafe:") } |
||||
FactComboBox { |
||||
fact: _failsafeGCSEnable |
||||
indexModel: false |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
QGCLabel { text: qsTr("Throttle failsafe:") } |
||||
QGCComboBox { |
||||
model: [qsTr("Disabled"), qsTr("Always RTL"), |
||||
qsTr("Continue with Mission in Auto Mode"), qsTr("Always Land")] |
||||
currentIndex: _failsafeThrEnable.value |
||||
Layout.fillWidth: true |
||||
|
||||
onActivated: _failsafeThrEnable.value = index |
||||
} |
||||
|
||||
QGCLabel { text: qsTr("PWM threshold:") } |
||||
FactTextField { |
||||
fact: _failsafeThrValue |
||||
showUnits: true |
||||
Layout.fillWidth: true |
||||
} |
||||
} // GridLayout |
||||
} // Column |
||||
} // Rectangle - Failsafe Settings |
||||
} // Column - General Failsafe Settings |
||||
} |
||||
|
||||
Loader { |
||||
sourceComponent: controller.vehicle.multiRotor ? copterGeneralFS : undefined |
||||
} |
||||
|
||||
Component { |
||||
id: copterGeoFence |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
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") |
||||
|
||||
QGCLabel { |
||||
id: geoFenceLabel |
||||
text: qsTr("GeoFence") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
id: geoFenceSettings |
||||
width: fenceAltMaxField.x + fenceAltMaxField.width + _margins |
||||
height: fenceAltMaxField.y + fenceAltMaxField.height + _margins |
||||
color: ggcPal.windowShade |
||||
|
||||
QGCCheckBox { |
||||
id: circleGeo |
||||
anchors.margins: _margins |
||||
anchors.left: parent.left |
||||
anchors.top: parent.top |
||||
text: qsTr("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: qsTr("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: qsTr("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: qsTr("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: qsTr("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: qsTr("Max altitude:") |
||||
} |
||||
|
||||
FactTextField { |
||||
id: fenceAltMaxField |
||||
anchors.topMargin: _margins / 2 |
||||
anchors.leftMargin: _margins |
||||
anchors.left: fenceAltMaxLabel.right |
||||
anchors.top: fenceRadiusField.bottom |
||||
fact: _fenceAltMax |
||||
showUnits: true |
||||
} |
||||
} // Rectangle - GeoFence Settings |
||||
} // Column - GeoFence Settings |
||||
} |
||||
|
||||
Loader { |
||||
sourceComponent: controller.vehicle.multiRotor ? copterGeoFence : undefined |
||||
} |
||||
|
||||
Component { |
||||
id: copterRTL |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
property Fact _landSpeedFact: controller.getParameterFact(-1, "LAND_SPEED") |
||||
property Fact _rtlAltFact: controller.getParameterFact(-1, "RTL_ALT") |
||||
property Fact _rtlLoitTimeFact: controller.getParameterFact(-1, "RTL_LOIT_TIME") |
||||
property Fact _rtlAltFinalFact: controller.getParameterFact(-1, "RTL_ALT_FINAL") |
||||
|
||||
QGCLabel { |
||||
id: rtlLabel |
||||
text: qsTr("Return to Launch") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
id: rtlSettings |
||||
width: rltAltFinalField.x + rltAltFinalField.width + _margins |
||||
height: rltAltFinalField.y + rltAltFinalField.height + _margins |
||||
color: ggcPal.windowShade |
||||
|
||||
Image { |
||||
id: icon |
||||
anchors.margins: _margins |
||||
anchors.left: parent.left |
||||
anchors.top: parent.top |
||||
height: ScreenTools.defaultFontPixelWidth * 20 |
||||
width: ScreenTools.defaultFontPixelWidth * 20 |
||||
sourceSize.width: width |
||||
mipmap: true |
||||
fillMode: Image.PreserveAspectFit |
||||
visible: false |
||||
source: "/qmlimages/ReturnToHomeAltitude.svg" |
||||
} |
||||
|
||||
ColorOverlay { |
||||
anchors.fill: icon |
||||
source: icon |
||||
color: ggcPal.text |
||||
visible: _showIcon |
||||
} |
||||
|
||||
QGCRadioButton { |
||||
id: returnAtCurrentRadio |
||||
anchors.margins: _margins |
||||
anchors.left: _showIcon ? icon.right : parent.left |
||||
anchors.top: parent.top |
||||
text: qsTr("Return at current altitude") |
||||
checked: _rtlAltFact.value == 0 |
||||
exclusiveGroup: returnAltRadioGroup |
||||
|
||||
onClicked: _rtlAltFact.value = 0 |
||||
} |
||||
|
||||
QGCRadioButton { |
||||
id: returnAltRadio |
||||
anchors.topMargin: _margins |
||||
anchors.left: returnAtCurrentRadio.left |
||||
anchors.top: returnAtCurrentRadio.bottom |
||||
text: qsTr("Return at specified altitude:") |
||||
exclusiveGroup: returnAltRadioGroup |
||||
checked: _rtlAltFact.value != 0 |
||||
|
||||
onClicked: _rtlAltFact.value = 1500 |
||||
} |
||||
|
||||
FactTextField { |
||||
id: rltAltField |
||||
anchors.leftMargin: _margins |
||||
anchors.left: returnAltRadio.right |
||||
anchors.baseline: returnAltRadio.baseline |
||||
fact: _rtlAltFact |
||||
showUnits: true |
||||
enabled: returnAltRadio.checked |
||||
} |
||||
|
||||
QGCCheckBox { |
||||
id: homeLoiterCheckbox |
||||
anchors.left: returnAtCurrentRadio.left |
||||
anchors.baseline: landDelayField.baseline |
||||
checked: _rtlLoitTimeFact.value > 0 |
||||
text: qsTr("Loiter above Home for:") |
||||
|
||||
onClicked: _rtlLoitTimeFact.value = (checked ? 60 : 0) |
||||
} |
||||
|
||||
FactTextField { |
||||
id: landDelayField |
||||
anchors.topMargin: _margins * 1.5 |
||||
anchors.left: rltAltField.left |
||||
anchors.top: rltAltField.bottom |
||||
fact: _rtlLoitTimeFact |
||||
showUnits: true |
||||
enabled: homeLoiterCheckbox.checked === true |
||||
} |
||||
|
||||
QGCRadioButton { |
||||
id: landRadio |
||||
anchors.left: returnAtCurrentRadio.left |
||||
anchors.baseline: landSpeedField.baseline |
||||
text: qsTr("Land with descent speed:") |
||||
checked: _rtlAltFinalFact.value == 0 |
||||
exclusiveGroup: landLoiterRadioGroup |
||||
|
||||
onClicked: _rtlAltFinalFact.value = 0 |
||||
} |
||||
|
||||
FactTextField { |
||||
id: landSpeedField |
||||
anchors.topMargin: _margins * 1.5 |
||||
anchors.top: landDelayField.bottom |
||||
anchors.left: rltAltField.left |
||||
fact: _landSpeedFact |
||||
showUnits: true |
||||
enabled: landRadio.checked |
||||
} |
||||
|
||||
QGCRadioButton { |
||||
id: finalLoiterRadio |
||||
anchors.left: returnAtCurrentRadio.left |
||||
anchors.baseline: rltAltFinalField.baseline |
||||
text: qsTr("Final loiter altitude:") |
||||
exclusiveGroup: landLoiterRadioGroup |
||||
|
||||
onClicked: _rtlAltFinalFact.value = _rtlAltFact.value |
||||
} |
||||
|
||||
FactTextField { |
||||
id: rltAltFinalField |
||||
anchors.topMargin: _margins / 2 |
||||
anchors.left: rltAltField.left |
||||
anchors.top: landSpeedField.bottom |
||||
fact: _rtlAltFinalFact |
||||
enabled: finalLoiterRadio.checked |
||||
showUnits: true |
||||
} |
||||
} // Rectangle - RTL Settings |
||||
} // Column - RTL Settings |
||||
} |
||||
|
||||
Loader { |
||||
sourceComponent: controller.vehicle.multiRotor ? copterRTL : undefined |
||||
} |
||||
|
||||
Component { |
||||
id: planeRTL |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
property Fact _rtlAltFact: controller.getParameterFact(-1, "ALT_HOLD_RTL") |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Return to Launch") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
width: rltAltField.x + rltAltField.width + _margins |
||||
height: rltAltField.y + rltAltField.height + _margins |
||||
color: qgcPal.windowShade |
||||
|
||||
QGCRadioButton { |
||||
id: returnAtCurrentRadio |
||||
anchors.margins: _margins |
||||
anchors.left: parent.left |
||||
anchors.top: parent.top |
||||
text: qsTr("Return at current altitude") |
||||
checked: _rtlAltFact.value < 0 |
||||
exclusiveGroup: returnAltRadioGroup |
||||
|
||||
onClicked: _rtlAltFact.value = -1 |
||||
} |
||||
|
||||
QGCRadioButton { |
||||
id: returnAltRadio |
||||
anchors.topMargin: _margins / 2 |
||||
anchors.left: returnAtCurrentRadio.left |
||||
anchors.top: returnAtCurrentRadio.bottom |
||||
text: qsTr("Return at specified altitude:") |
||||
exclusiveGroup: returnAltRadioGroup |
||||
checked: _rtlAltFact.value >= 0 |
||||
|
||||
onClicked: _rtlAltFact.value = 10000 |
||||
} |
||||
|
||||
FactTextField { |
||||
id: rltAltField |
||||
anchors.leftMargin: _margins |
||||
anchors.left: returnAltRadio.right |
||||
anchors.baseline: returnAltRadio.baseline |
||||
fact: _rtlAltFact |
||||
showUnits: true |
||||
enabled: returnAltRadio.checked |
||||
} |
||||
} // Rectangle - RTL Settings |
||||
} // Column - RTL Settings |
||||
} |
||||
|
||||
Loader { |
||||
sourceComponent: controller.vehicle.fixedWing ? planeRTL : undefined |
||||
} |
||||
|
||||
Column { |
||||
spacing: _margins / 2 |
||||
|
||||
QGCLabel { |
||||
text: qsTr("Arming Checks") |
||||
font.family: ScreenTools.demiboldFontFamily |
||||
} |
||||
|
||||
Rectangle { |
||||
width: flowLayout.width |
||||
height: armingCheckInnerColumn.height + (_margins * 2) |
||||
color: ggcPal.windowShade |
||||
|
||||
Column { |
||||
id: armingCheckInnerColumn |
||||
anchors.margins: _margins |
||||
anchors.top: parent.top |
||||
anchors.left: parent.left |
||||
anchors.right: parent.right |
||||
spacing: _margins |
||||
|
||||
FactBitmask { |
||||
id: armingCheckBitmask |
||||
anchors.left: parent.left |
||||
anchors.right: parent.right |
||||
firstEntryIsAll: true |
||||
fact: _armingCheck |
||||
} |
||||
|
||||
QGCLabel { |
||||
id: armingCheckWarning |
||||
anchors.left: parent.left |
||||
anchors.right: parent.right |
||||
wrapMode: Text.WordWrap |
||||
color: qgcPal.warningText |
||||
text: qsTr("Warning: Turning off arming checks can lead to loss of Vehicle control.") |
||||
visible: _armingCheck.value != 1 |
||||
} |
||||
} |
||||
} // Rectangle - Arming checks |
||||
} // Column - Arming Checks |
||||
} // Flow |
||||
} // Component - safetyPageComponent |
||||
} // SetupView |
@ -0,0 +1,142 @@
@@ -0,0 +1,142 @@
|
||||
import QtQuick 2.3 |
||||
import QtQuick.Controls 1.2 |
||||
|
||||
import QGroundControl.FactSystem 1.0 |
||||
import QGroundControl.FactControls 1.0 |
||||
import QGroundControl.Controls 1.0 |
||||
import QGroundControl.Palette 1.0 |
||||
|
||||
FactPanel { |
||||
id: panel |
||||
anchors.fill: parent |
||||
color: qgcPal.windowShadeDark |
||||
|
||||
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } |
||||
FactPanelController { id: controller; factPanel: panel } |
||||
|
||||
|
||||
property Fact _copterFenceAction: controller.getParameterFact(-1, "FENCE_ACTION", false /* reportMissing */) |
||||
property Fact _copterFenceEnable: controller.getParameterFact(-1, "FENCE_ENABLE", false /* reportMissing */) |
||||
property Fact _copterFenceType: controller.getParameterFact(-1, "FENCE_TYPE", false /* reportMissing */) |
||||
|
||||
property Fact _batt1Monitor: controller.getParameterFact(-1, "BATT_MONITOR") |
||||
property Fact _batt2Monitor: controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */) |
||||
property bool _batt2MonitorAvailable: controller.parameterExists(-1, "BATT2_MONITOR") |
||||
property bool _batt1MonitorEnabled: _batt1Monitor.rawValue !== 0 |
||||
property bool _batt2MonitorEnabled: _batt2MonitorAvailable && _batt2Monitor.rawValue !== 0 |
||||
|
||||
property Fact _batt1FSLowAct: controller.getParameterFact(-1, "r.BATT_FS_LOW_ACT", false /* reportMissing */) |
||||
property Fact _batt1FSCritAct: controller.getParameterFact(-1, "BATT_FS_CRT_ACT", false /* reportMissing */) |
||||
property Fact _batt2FSLowAct: controller.getParameterFact(-1, "BATT2_FS_LOW_ACT", false /* reportMissing */) |
||||
property Fact _batt2FSCritAct: controller.getParameterFact(-1, "BATT2_FS_CRT_ACT", false /* reportMissing */) |
||||
property bool _batt1FSCritActAvailable: controller.parameterExists(-1, "BATT_FS_CRT_ACT") |
||||
|
||||
Column { |
||||
anchors.fill: parent |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Arming Checks:") |
||||
valueText: fact.value & 1 ? qsTr("Enabled") : qsTr("Some disabled") |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "ARMING_CHECK") |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Throttle failsafe:") |
||||
valueText: Fact.enumStringValue |
||||
visible: controller.vehicle.multiRotor |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "FS_THR_ENABLE", false /* reportMissing */) |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Throttle failsafe:") |
||||
valueText: fact.enumStringValue |
||||
visible: controller.vehicle.fixedWing |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "THR_FAILSAFE", false /* reportMissing */) |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Throttle failsafe:") |
||||
valueText: fact.enumStringValue |
||||
visible: controller.vehicle.rover |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "FS_THR_ENABLE", false /* reportMissing */) |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Failsafe Action:") |
||||
valueText: fact.enumStringValue |
||||
visible: controller.vehicle.rover |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "FS_ACTION", false /* reportMissing */) |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Failsafe Crash Check:") |
||||
valueText: fact.enumStringValue |
||||
visible: controller.vehicle.rover |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "FS_CRASH_CHECK", false /* reportMissing */) |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Batt1 low failsafe:") |
||||
valueText: _batt1MonitorEnabled ? _batt1FSLowAct.enumStringValue : "" |
||||
visible: _batt1MonitorEnabled |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Batt1 critical failsafe:") |
||||
valueText: _batt1FSCritActAvailable ? _batt1FSCritAct.enumStringValue : "" |
||||
visible: _batt1FSCritActAvailable |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Batt2 low failsafe:") |
||||
valueText: _batt2MonitorEnabled ? _batt2FSLowAct.enumStringValue : "" |
||||
visible: _batt2MonitorEnabled |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Batt2 critical failsafe:") |
||||
valueText: _batt2MonitorEnabled ? _batt2FSCritAct.enumStringValue : "" |
||||
visible: _batt2MonitorEnabled |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("GeoFence:") |
||||
valueText: _copterFenceEnable.value == 0 || _copterFenceType == 0 ? |
||||
qsTr("Disabled") : |
||||
(_copterFenceType.value == 1 ? |
||||
qsTr("Altitude") : |
||||
(_copterFenceType.value == 2 ? qsTr("Circle") : qsTr("Altitude,Circle"))) |
||||
visible: controller.vehicle.multiRotor |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("GeoFence:") |
||||
valueText: _copterFenceAction.value == 0 ? |
||||
qsTr("Report only") : |
||||
(_copterFenceAction.value == 1 ? qsTr("RTL or Land") : qsTr("Unknown")) |
||||
visible: controller.vehicle.multiRotor && _copterFenceEnable.value !== 0 |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("RTL min alt:") |
||||
valueText: fact.value == 0 ? qsTr("current") : fact.valueString + " " + fact.units |
||||
visible: controller.vehicle.multiRotor |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "RTL_ALT", false /* reportMissing */) |
||||
} |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("RTL min alt:") |
||||
valueText: fact.value < 0 ? qsTr("current") : fact.valueString + " " + fact.units |
||||
visible: controller.vehicle.fixedWing |
||||
|
||||
property Fact fact: controller.getParameterFact(-1, "ALT_HOLD_RTL", false /* reportMissing */) |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue