地面站终端 App
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

/****************************************************************************
*
* (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
}
}
}
}
}
}
}
}