diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 5a9a2a37e3a81eb4ccf3236464164bd3c9fb4732..68ba7f0cd7a0c714f865b2008021db7617f7b422 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -149,9 +149,11 @@ src/AutoPilotPlugins/APM/APMSafetyComponentCopter.qml src/AutoPilotPlugins/APM/APMSafetyComponentPlane.qml src/AutoPilotPlugins/APM/APMSafetyComponentRover.qml + src/AutoPilotPlugins/APM/APMSafetyComponentSub.qml src/AutoPilotPlugins/APM/APMSafetyComponentSummaryCopter.qml src/AutoPilotPlugins/APM/APMSafetyComponentSummaryPlane.qml src/AutoPilotPlugins/APM/APMSafetyComponentSummaryRover.qml + src/AutoPilotPlugins/APM/APMSafetyComponentSummarySub.qml src/AutoPilotPlugins/APM/APMTuningComponentCopter.qml src/AutoPilotPlugins/PX4/CameraComponent.qml src/AutoPilotPlugins/PX4/CameraComponentSummary.qml diff --git a/src/AutoPilotPlugins/APM/APMSafetyComponent.cc b/src/AutoPilotPlugins/APM/APMSafetyComponent.cc index d97d522c47cd30f74e2b2420e4baa7b57cd29880..39caad79c316ea367a8824bd1d54bae915f85d1d 100644 --- a/src/AutoPilotPlugins/APM/APMSafetyComponent.cc +++ b/src/AutoPilotPlugins/APM/APMSafetyComponent.cc @@ -69,6 +69,9 @@ QUrl APMSafetyComponent::setupSource(void) const case MAV_TYPE_TRICOPTER: qmlFile = QStringLiteral("qrc:/qml/APMSafetyComponentCopter.qml"); break; + case MAV_TYPE_SUBMARINE: + qmlFile = QStringLiteral("qrc:/qml/APMSafetyComponentSub.qml"); + break; case MAV_TYPE_GROUND_ROVER: qmlFile = QStringLiteral("qrc:/qml/APMSafetyComponentRover.qml"); break; @@ -96,6 +99,9 @@ QUrl APMSafetyComponent::summaryQmlSource(void) const case MAV_TYPE_TRICOPTER: qmlFile = QStringLiteral("qrc:/qml/APMSafetyComponentSummaryCopter.qml"); break; + case MAV_TYPE_SUBMARINE: + qmlFile = QStringLiteral("qrc:/qml/APMSafetyComponentSummarySub.qml"); + break; case MAV_TYPE_GROUND_ROVER: qmlFile = QStringLiteral("qrc:/qml/APMSafetyComponentSummaryRover.qml"); break; diff --git a/src/AutoPilotPlugins/APM/APMSafetyComponentSub.qml b/src/AutoPilotPlugins/APM/APMSafetyComponentSub.qml new file mode 100644 index 0000000000000000000000000000000000000000..6582c5d3e1be9a386e1a3b968f01b5ff0b7fa507 --- /dev/null +++ b/src/AutoPilotPlugins/APM/APMSafetyComponentSub.qml @@ -0,0 +1,385 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +import QtQuick 2.5 +import QtQuick.Controls 1.2 +import QtGraphicalEffects 1.0 + +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 + +QGCView { + id: _safetyView + viewPanel: panel + anchors.fill: parent + + FactPanelController { id: controller; factPanel: panel } + + QGCPalette { id: ggcPal; colorGroupEnabled: enabled } + + property Fact _failsafeGCSEnable: controller.getParameterFact(-1, "FS_GCS_ENABLE") + property Fact _failsafeBattEnable: 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 _fenceType: controller.getParameterFact(-1, "FENCE_TYPE") + + property Fact _leakPin: controller.getParameterFact(-1, "WD_1_PIN") + property Fact _leakLogic: controller.getParameterFact(-1, "WD_1_DEFAULT") + + property Fact _armingCheck: controller.getParameterFact(-1, "ARMING_CHECK") + + property real _margins: ScreenTools.defaultFontPixelHeight + property bool _showIcon: !ScreenTools.isTinyScreen + + ExclusiveGroup { id: fenceActionRadioGroup } + + QGCViewPanel { + id: panel + anchors.fill: parent + + QGCFlickable { + clip: true + anchors.fill: parent + contentHeight: flowLayout.height + contentWidth: flowLayout.width + + Flow { + id: flowLayout + width: panel.width // parent.width doesn't work for some reason + spacing: _margins + + Column { + spacing: _margins / 2 + + QGCLabel { + id: failsafeLabel + text: qsTr("Failsafe Triggers") + font.family: ScreenTools.demiboldFontFamily + } + + Rectangle { + id: failsafeSettings + width: throttleEnableCombo.x + throttleEnableCombo.width + _margins + height: mahField.y + mahField.height + _margins + color: ggcPal.windowShade + + QGCLabel { + id: gcsEnableLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.baseline: gcsEnableCombo.baseline + text: qsTr("Ground Station failsafe:") + } + + FactComboBox { + id: gcsEnableCombo + anchors.topMargin: _margins + anchors.leftMargin: _margins + anchors.left: gcsEnableLabel.right + anchors.top: parent.top + width: voltageField.width + fact: _failsafeGCSEnable + indexModel: false + } + + QGCLabel { + id: throttleEnableLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.baseline: throttleEnableCombo.baseline + text: qsTr("Throttle failsafe:") + } + + QGCComboBox { + id: throttleEnableCombo + anchors.topMargin: _margins + anchors.left: gcsEnableCombo.left + anchors.top: gcsEnableCombo.bottom + width: voltageField.width + model: [qsTr("Disabled"), qsTr("Always RTL"), + qsTr("Continue with Mission in Auto Mode"), qsTr("Always Land")] + currentIndex: _failsafeThrEnable.value + + onActivated: _failsafeThrEnable.value = index + } + + QGCLabel { + id: throttlePWMLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.baseline: throttlePWMField.baseline + text: qsTr("PWM threshold:") + } + + FactTextField { + id: throttlePWMField + anchors.topMargin: _margins / 2 + anchors.left: gcsEnableCombo.left + anchors.top: throttleEnableCombo.bottom + fact: _failsafeThrValue + showUnits: true + } + + QGCLabel { + id: batteryEnableLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.baseline: batteryEnableCombo.baseline + text: qsTr("Battery failsafe:") + } + + QGCComboBox { + id: batteryEnableCombo + anchors.topMargin: _margins + anchors.left: gcsEnableCombo.left + anchors.top: throttlePWMField.bottom + width: voltageField.width + model: [qsTr("Disabled"), qsTr("Land"), qsTr("Return to Launch")] + currentIndex: _failsafeBattEnable.value + + onActivated: _failsafeBattEnable.value = index + } + + QGCCheckBox { + id: voltageLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.baseline: voltageField.baseline + text: qsTr("Voltage threshold:") + checked: _failsafeBattVoltage.value != 0 + + onClicked: _failsafeBattVoltage.value = checked ? 10.5 : 0 + } + + FactTextField { + id: voltageField + anchors.topMargin: _margins / 2 + anchors.left: gcsEnableCombo.left + anchors.top: batteryEnableCombo.bottom + fact: _failsafeBattVoltage + showUnits: true + } + + QGCCheckBox { + id: mahLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.baseline: mahField.baseline + text: qsTr("MAH threshold:") + checked: _failsafeBattMah.value != 0 + + onClicked: _failsafeBattMah.value = checked ? 600 : 0 + } + + FactTextField { + id: mahField + anchors.topMargin: _margins / 2 + anchors.left: gcsEnableCombo.left + anchors.top: voltageField.bottom + fact: _failsafeBattMah + showUnits: true + } + } // Rectangle - Failsafe Settings + } // Column - Failsafe Settings + + Column { + spacing: _margins / 2 + + 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: altitudeGeo + enabled: false + anchors.margins: _margins + anchors.left: parent.left + anchors.top: parent.top + text: qsTr("Depth 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 { + _fenceEnable.value = 0 + _fenceType.value = 0 + } + } + } + + QGCRadioButton { + id: geoReportRadio + enabled: false + 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 + enabled: false + anchors.topMargin: _margins / 2 + anchors.left: altitudeGeo.left + anchors.top: geoReportRadio.bottom + text: qsTr("RTL or Land") + exclusiveGroup: fenceActionRadioGroup + checked: _fenceAction.value == 1 + + onClicked: _fenceAction.value = 1 + } + + QGCLabel { + id: fenceAltMaxLabel + enabled: false + anchors.left: altitudeGeo.left + anchors.baseline: fenceAltMaxField.baseline + text: qsTr("Max depth:") + } + + FactTextField { + id: fenceAltMaxField + enabled: false + anchors.topMargin: _margins / 2 + anchors.leftMargin: _margins + anchors.left: fenceAltMaxLabel.right + anchors.top: geoRTLRadio.bottom + fact: _fenceAltMax + showUnits: true + } + } // Rectangle - GeoFence Settings + } // Column - GeoFence Settings + + Column { + spacing: _margins / 2 + + QGCLabel { + id: leakDetectorLabel + text: qsTr("Leak Detector") + font.family: ScreenTools.demiboldFontFamily + } + + Rectangle { + id: leakDetectorSettings + width: leakLogicCombo.x + leakLogicCombo.width + _margins + height: leakLogicCombo.y + leakLogicCombo.height + _margins + color: ggcPal.windowShade + + QGCLabel { + id: leakPinLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.top: parent.top + text: qsTr("Pin:") + } + + FactComboBox { + id: leakPinCombo + anchors.margins: _margins + anchors.left: leakLogicLabel.right + anchors.baseline: leakPinLabel.baseline + width: voltageField.width + fact: _leakPin + indexModel: false + } + + QGCLabel { + id: leakLogicLabel + anchors.margins: _margins + anchors.left: parent.left + anchors.top: leakPinLabel.bottom + text: qsTr("Logic:") + } + + FactComboBox { + id: leakLogicCombo + anchors.margins: _margins + anchors.left: leakLogicLabel.right + anchors.baseline: leakLogicLabel.baseline + width: voltageField.width + fact: _leakLogic + indexModel: false + } + } // Rectangle - Leak Detector Settings + } // Column - Leak Detector Settings + + 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 + } // QGCFlickable + } // QGCViewPanel +} // QGCView diff --git a/src/AutoPilotPlugins/APM/APMSafetyComponentSummarySub.qml b/src/AutoPilotPlugins/APM/APMSafetyComponentSummarySub.qml new file mode 100644 index 0000000000000000000000000000000000000000..d97e032c750b7146fc14019f3a5c2cb6a9d94314 --- /dev/null +++ b/src/AutoPilotPlugins/APM/APMSafetyComponentSummarySub.qml @@ -0,0 +1,123 @@ +import QtQuick 2.2 +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 _failsafeBattEnable: controller.getParameterFact(-1, "FS_BATT_ENABLE") + property Fact _failsafeThrEnable: controller.getParameterFact(-1, "FS_THR_ENABLE") + + 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 _leakPin: controller.getParameterFact(-1, "WD_1_PIN") + + property Fact _armingCheck: controller.getParameterFact(-1, "ARMING_CHECK") + + property string _failsafeBattEnableText + property string _failsafeThrEnableText + + Component.onCompleted: { + setFailsafeBattEnableText() + setFailsafeThrEnableText() + } + + Connections { + target: _failsafeBattEnable + + onValueChanged: setFailsafeBattEnableText() + } + + Connections { + target: _failsafeThrEnable + + onValueChanged: setFailsafeThrEnableText() + } + + function setFailsafeThrEnableText() { + switch (_failsafeThrEnable.value) { + case 0: + _failsafeThrEnableText = qsTr("Disabled") + break + case 1: + _failsafeThrEnableText = qsTr("Always RTL") + break + case 2: + _failsafeThrEnableText = qsTr("Continue with Mission in Auto Mode") + break + case 3: + _failsafeThrEnableText = qsTr("Always Land") + break + default: + _failsafeThrEnableText = qsTr("Unknown") + } + } + + function setFailsafeBattEnableText() { + switch (_failsafeBattEnable.value) { + case 0: + _failsafeBattEnableText = qsTr("Disabled") + break + case 1: + _failsafeBattEnableText = qsTr("Land") + break + case 2: + _failsafeBattEnableText = qsTr("Return to Launch") + break + default: + _failsafeThrEnableText = qsTr("Unknown") + } + } + + Column { + anchors.fill: parent + + VehicleSummaryRow { + labelText: qsTr("Arming Checks:") + valueText: _armingCheck.value & 1 ? qsTr("Enabled") : qsTr("Some disabled") + } + + VehicleSummaryRow { + labelText: qsTr("Throttle failsafe:") + valueText: _failsafeThrEnableText + } + + VehicleSummaryRow { + labelText: qsTr("Battery failsafe:") + valueText: _failsafeBattEnableText + } + + VehicleSummaryRow { + labelText: qsTr("Leak Detector:") + valueText: _leakPin.value > 0 ? qsTr("Enabled") : qsTr("Disabled") + } + + VehicleSummaryRow { + labelText: qsTr("GeoFence:") + valueText: _fenceEnable.value == 0 || _fenceType == 0 ? + qsTr("Disabled") : + (_fenceType.value == 1 ? + qsTr("Altitude") : + (_fenceType.value == 2 ? qsTr("Circle") : qsTr("Altitude,Circle"))) + } + + VehicleSummaryRow { + labelText: qsTr("GeoFence:") + valueText: _fenceAction.value == 0 ? + qsTr("Report only") : + (_fenceAction.value == 1 ? qsTr("RTL or Land") : qsTr("Unknown")) + visible: _fenceEnable.value != 0 + } + } +}