You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
663 lines
34 KiB
663 lines
34 KiB
/**************************************************************************** |
|
* |
|
* (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 QtQuick.Controls.Styles 1.4 |
|
import QtQuick.Layouts 1.2 |
|
import QtGraphicalEffects 1.0 |
|
|
|
import QGroundControl 1.0 |
|
import QGroundControl.FactSystem 1.0 |
|
import QGroundControl.FactControls 1.0 |
|
import QGroundControl.Controls 1.0 |
|
import QGroundControl.ScreenTools 1.0 |
|
import QGroundControl.Palette 1.0 |
|
|
|
SetupPage { |
|
id: safetyPage |
|
pageComponent: pageComponent |
|
Component { |
|
id: pageComponent |
|
|
|
Item { |
|
width: Math.max(availableWidth, outerColumn.width) |
|
height: outerColumn.height |
|
|
|
FactPanelController { |
|
id: controller |
|
} |
|
|
|
readonly property string hitlParam: "SYS_HITL" |
|
|
|
property real _margins: ScreenTools.defaultFontPixelHeight |
|
property real _labelWidth: ScreenTools.defaultFontPixelWidth * 30 |
|
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 24 |
|
property real _imageHeight: ScreenTools.defaultFontPixelHeight * 3 |
|
property real _imageWidth: _imageHeight * 2 |
|
|
|
property Fact _enableLogging: controller.getParameterFact(-1, "SDLOG_MODE") |
|
property Fact _fenceAction: controller.getParameterFact(-1, "GF_ACTION") |
|
property Fact _fenceRadius: controller.getParameterFact(-1, "GF_MAX_HOR_DIST") |
|
property Fact _fenceAlt: controller.getParameterFact(-1, "GF_MAX_VER_DIST") |
|
property Fact _rtlLandDelay: controller.getParameterFact(-1, "RTL_LAND_DELAY") |
|
property Fact _lowBattAction: controller.getParameterFact(-1, "COM_LOW_BAT_ACT") |
|
property Fact _rcLossAction: controller.getParameterFact(-1, "NAV_RCL_ACT") |
|
property Fact _dlLossAction: controller.getParameterFact(-1, "NAV_DLL_ACT") |
|
property Fact _disarmLandDelay: controller.getParameterFact(-1, "COM_DISARM_LAND") |
|
property Fact _collisionPrevention: controller.getParameterFact(-1, "CP_DIST") |
|
property Fact _objectAvoidance: controller.getParameterFact(-1, "COM_OBS_AVOID") |
|
property Fact _landSpeedMC: controller.getParameterFact(-1, "MPC_LAND_SPEED", false) |
|
property bool _hitlAvailable: controller.parameterExists(-1, hitlParam) |
|
property Fact _hitlEnabled: controller.getParameterFact(-1, hitlParam, false) |
|
|
|
ColumnLayout { |
|
id: outerColumn |
|
spacing: _margins |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Low Battery Failsafe Trigger") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: mainRow.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: mainRow |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
Image { |
|
mipmap: true |
|
fillMode: Image.PreserveAspectFit |
|
source: qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/LowBatteryLight.svg" : "/qmlimages/LowBattery.svg" |
|
height: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Failsafe Action:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactComboBox { |
|
fact: _lowBattAction |
|
indexModel: false |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Battery Warn Level:") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "BAT_LOW_THR") |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Battery Failsafe Level:") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "BAT_CRIT_THR") |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Battery Emergency Level:") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "BAT_EMERGEN_THR") |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Object Detection") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: odRow.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: odRow |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
QGCColoredImage { |
|
color: qgcPal.text |
|
source: "/qmlimages/ObjectAvoidance.svg" |
|
height: _imageHeight |
|
width: _imageHeight * 2 |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Collision Prevention:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
QGCComboBox { |
|
model: [qsTr("Disabled"), qsTr("Enabled")] |
|
enabled: _collisionPrevention |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
currentIndex: _collisionPrevention ? (_collisionPrevention.rawValue > 0 ? 1 : 0) : 0 |
|
onActivated: { |
|
if(_collisionPrevention) { |
|
_collisionPrevention.value = index > 0 ? 5 : -1 |
|
console.log('Collision prevention enabled: ' + _collisionPrevention.value) |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Obstacle Avoidance:") |
|
Layout.fillWidth: true |
|
} |
|
QGCComboBox { |
|
model: [qsTr("Disabled"), qsTr("Enabled")] |
|
enabled: _objectAvoidance && _collisionPrevention.rawValue > 0 |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
currentIndex: _objectAvoidance ? (_objectAvoidance.value === 0 ? 0 : 1) : 0 |
|
onActivated: { |
|
if(_objectAvoidance) { |
|
_objectAvoidance.value = index > 0 ? 1 : 0 |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Minimum Distance: (") + QGroundControl.appSettingsDistanceUnitsString + ")" |
|
Layout.fillWidth: true |
|
Layout.alignment: Qt.AlignVCenter |
|
} |
|
QGCSlider { |
|
width: _editFieldWidth |
|
enabled: _collisionPrevention && _collisionPrevention.rawValue > 0 |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.minimumHeight: ScreenTools.defaultFontPixelHeight * 2 |
|
Layout.fillWidth: true |
|
Layout.fillHeight: true |
|
maximumValue: QGroundControl.metersToAppSettingsDistanceUnits(15) |
|
minimumValue: QGroundControl.metersToAppSettingsDistanceUnits(1) |
|
stepSize: 1 |
|
displayValue: true |
|
updateValueWhileDragging: false |
|
Layout.alignment: Qt.AlignVCenter |
|
value: { |
|
if (_collisionPrevention && _collisionPrevention.rawValue > 0) { |
|
return QGroundControl.metersToAppSettingsDistanceUnits(_collisionPrevention.rawValue) |
|
} else { |
|
return 1; |
|
} |
|
} |
|
onValueChanged: { |
|
if(_collisionPrevention) { |
|
//-- Negative means disabled |
|
if(_collisionPrevention.rawValue >= 0) { |
|
_collisionPrevention.rawValue = QGroundControl.appSettingsDistanceUnitsToMeters(value) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("RC Loss Failsafe Trigger") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: rcLossGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: rcLossGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
Image { |
|
mipmap: true |
|
fillMode: Image.PreserveAspectFit |
|
source: qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/RCLossLight.svg" : "/qmlimages/RCLoss.svg" |
|
height: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Failsafe Action:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactComboBox { |
|
fact: _rcLossAction |
|
indexModel: false |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("RC Loss Timeout:") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "COM_RC_LOSS_T") |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Data Link Loss Failsafe Trigger") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: dataLinkLossGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: dataLinkLossGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
Image { |
|
mipmap: true |
|
fillMode: Image.PreserveAspectFit |
|
source: qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/DatalinkLossLight.svg" : "/qmlimages/DatalinkLoss.svg" |
|
height: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Failsafe Action:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactComboBox { |
|
fact: _dlLossAction |
|
indexModel: false |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Data Link Loss Timeout:") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "COM_DL_LOSS_T") |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Geofence Failsafe Trigger") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: geoFenceGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: geoFenceGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
Image { |
|
mipmap: true |
|
fillMode: Image.PreserveAspectFit |
|
source: qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/GeoFenceLight.svg" : "/qmlimages/GeoFence.svg" |
|
height: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
|
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Action on breach:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactComboBox { |
|
fact: _fenceAction |
|
indexModel: false |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCCheckBox { |
|
id: fenceRadiusCheckBox |
|
text: qsTr("Max Radius:") |
|
checked: _fenceRadius.value > 0 |
|
onClicked: _fenceRadius.value = checked ? 100 : 0 |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: _fenceRadius |
|
enabled: fenceRadiusCheckBox.checked |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCCheckBox { |
|
id: fenceAltMaxCheckBox |
|
text: qsTr("Max Altitude:") |
|
checked: _fenceAlt ? _fenceAlt.value > 0 : false |
|
onClicked: _fenceAlt.value = checked ? 100 : 0 |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: _fenceAlt |
|
enabled: fenceAltMaxCheckBox.checked |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Return To Launch Settings") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: returnHomeGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: returnHomeGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
QGCColoredImage { |
|
color: qgcPal.text |
|
source: controller.vehicle.fixedWing ? "/qmlimages/ReturnToHomeAltitude.svg" : "/qmlimages/ReturnToHomeAltitudeCopter.svg" |
|
height: _imageHeight |
|
width: _imageHeight * 2 |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
text: qsTr("Climb to altitude of:") |
|
Layout.minimumWidth: _labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "RTL_RETURN_ALT") |
|
Layout.minimumWidth: _editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Return to launch, then:") |
|
Layout.columnSpan: 2 |
|
} |
|
Row { |
|
Layout.columnSpan: 2 |
|
Item { width: ScreenTools.defaultFontPixelWidth; height: 1 } |
|
QGCRadioButton { |
|
id: homeLandRadio |
|
checked: _rtlLandDelay ? _rtlLandDelay.value === 0 : false |
|
text: qsTr("Land immediately") |
|
onClicked: _rtlLandDelay.value = 0 |
|
} |
|
} |
|
Row { |
|
Layout.columnSpan: 2 |
|
Item { width: ScreenTools.defaultFontPixelWidth; height: 1 } |
|
QGCRadioButton { |
|
id: homeLoiterNoLandRadio |
|
checked: _rtlLandDelay ? _rtlLandDelay.value < 0 : false |
|
text: qsTr("Loiter and do not land") |
|
onClicked: _rtlLandDelay.value = -1 |
|
} |
|
} |
|
Row { |
|
Layout.columnSpan: 2 |
|
Item { width: ScreenTools.defaultFontPixelWidth; height: 1 } |
|
QGCRadioButton { |
|
id: homeLoiterLandRadio |
|
checked: _rtlLandDelay ? _rtlLandDelay.value > 0 : false |
|
text: qsTr("Loiter and land after specified time") |
|
onClicked: _rtlLandDelay.value = 60 |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Loiter Time") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "RTL_LAND_DELAY") |
|
enabled: homeLoiterLandRadio.checked === true |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Loiter Altitude") |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: controller.getParameterFact(-1, "RTL_DESCEND_ALT") |
|
enabled: homeLoiterLandRadio.checked === true || homeLoiterNoLandRadio.checked === true |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Land Mode Settings") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: landModeGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: landModeGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
QGCColoredImage { |
|
color: qgcPal.text |
|
source: controller.vehicle.fixedWing ? "/qmlimages/LandMode.svg" : "/qmlimages/LandModeCopter.svg" |
|
height: _imageHeight |
|
width: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
|
|
QGCLabel { |
|
id: landVelocityLabel |
|
text: qsTr("Landing Descent Rate:") |
|
visible: controller.vehicle && !controller.vehicle.fixedWing |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: _landSpeedMC |
|
visible: controller.vehicle && !controller.vehicle.fixedWing |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
|
|
QGCCheckBox { |
|
id: disarmDelayCheckBox |
|
text: qsTr("Disarm After:") |
|
checked: _disarmLandDelay.value > 0 |
|
onClicked: _disarmLandDelay.value = checked ? 2 : 0 |
|
Layout.fillWidth: true |
|
} |
|
FactTextField { |
|
fact: _disarmLandDelay |
|
enabled: disarmDelayCheckBox.checked |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Vehicle Telemetry Logging") |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: loggingGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
Row { |
|
id: loggingGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
Image { |
|
mipmap: true |
|
fillMode: Image.PreserveAspectFit |
|
source: qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/no-logging-light.svg" : "/qmlimages/no-logging.svg" |
|
height: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
QGCLabel { |
|
text: qsTr("Telemetry logging to vehicle storage:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
QGCComboBox { |
|
model: [qsTr("Disabled"), qsTr("Enabled")] |
|
enabled: _enableLogging |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
Component.onCompleted: { |
|
currentIndex = _enableLogging ? (_enableLogging.value >= 0 ? 1 : 0) : 0 |
|
} |
|
onActivated: { |
|
if(_enableLogging) { |
|
_enableLogging.value = index > 0 ? 0 : -1 |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
QGCLabel { |
|
text: qsTr("Hardware in the Loop Simulation") |
|
visible: _hitlAvailable |
|
} |
|
|
|
Rectangle { |
|
width: mainRow.width + (_margins * 2) |
|
height: hitlGrid.height + (_margins * 2) |
|
color: qgcPal.windowShade |
|
visible: _hitlAvailable |
|
Row { |
|
id: hitlGrid |
|
spacing: _margins |
|
anchors.centerIn: parent |
|
Item { |
|
width: _imageWidth |
|
height: _imageHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
QGCColoredImage { |
|
color: qgcPal.text |
|
source: "/qmlimages/HITL.svg" |
|
height: _imageHeight |
|
width: _imageHeight |
|
anchors.centerIn: parent |
|
} |
|
} |
|
GridLayout { |
|
columns: 2 |
|
anchors.verticalCenter: parent.verticalCenter |
|
QGCLabel { |
|
text: qsTr("HITL Enabled:") |
|
Layout.minimumWidth:_labelWidth |
|
Layout.fillWidth: true |
|
} |
|
FactComboBox { |
|
fact: _hitlEnabled |
|
indexModel: false |
|
Layout.minimumWidth:_editFieldWidth |
|
Layout.fillWidth: true |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|