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

664 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
6 years ago
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
6 years ago
currentIndex: _collisionPrevention ? (_collisionPrevention.rawValue > 0 ? 1 : 0) : 0
onActivated: {
if(_collisionPrevention) {
_collisionPrevention.value = index > 0 ? 5 : -1
6 years ago
console.log('Collision prevention enabled: ' + _collisionPrevention.value)
}
}
}
QGCLabel {
text: qsTr("Obstacle Avoidance:")
Layout.fillWidth: true
}
QGCComboBox {
model: [qsTr("Disabled"), qsTr("Enabled")]
6 years ago
enabled: _objectAvoidance && _collisionPrevention.rawValue > 0
Layout.minimumWidth:_editFieldWidth
Layout.fillWidth: true
6 years ago
currentIndex: _objectAvoidance ? (_objectAvoidance.value === 0 ? 0 : 1) : 0
onActivated: {
if(_objectAvoidance) {
_objectAvoidance.value = index > 0 ? 1 : 0
}
}
}
QGCLabel {
6 years ago
text: qsTr("Minimum Distance: (") + QGroundControl.appSettingsDistanceUnitsString + ")"
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
QGCSlider {
width: _editFieldWidth
6 years ago
enabled: _collisionPrevention && _collisionPrevention.rawValue > 0
Layout.minimumWidth:_editFieldWidth
Layout.minimumHeight: ScreenTools.defaultFontPixelHeight * 2
Layout.fillWidth: true
Layout.fillHeight: true
6 years ago
maximumValue: QGroundControl.metersToAppSettingsDistanceUnits(15)
minimumValue: QGroundControl.metersToAppSettingsDistanceUnits(1)
stepSize: 1
displayValue: true
updateValueWhileDragging: false
Layout.alignment: Qt.AlignVCenter
6 years ago
value: {
if (_collisionPrevention && _collisionPrevention.rawValue > 0) {
return QGroundControl.metersToAppSettingsDistanceUnits(_collisionPrevention.rawValue)
} else {
return 1;
}
}
onValueChanged: {
if(_collisionPrevention) {
6 years ago
//-- Negative means disabled
if(_collisionPrevention.rawValue >= 0) {
6 years ago
_collisionPrevention.rawValue = QGroundControl.appSettingsDistanceUnitsToMeters(value)
6 years ago
}
}
}
}
}
}
}
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
}
}
}
}
}
}
}
}