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.
392 lines
20 KiB
392 lines
20 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.2 |
|
import QtQuick.Controls 1.2 |
|
import QtQuick.Controls.Styles 1.2 |
|
import QtQuick.Dialogs 1.2 |
|
import QtQuick.Layouts 1.1 |
|
|
|
import QGroundControl.FactSystem 1.0 |
|
import QGroundControl.FactControls 1.0 |
|
import QGroundControl.Palette 1.0 |
|
import QGroundControl.Controls 1.0 |
|
import QGroundControl.Controllers 1.0 |
|
import QGroundControl.ScreenTools 1.0 |
|
|
|
/// PX4 Advanced Flight Mode configuration |
|
Item { |
|
id: root |
|
|
|
// The following properties must be pushed in from the Loader |
|
//property var qgcView - QGCView control |
|
//property var qgcViewPanel - QGCViewPanel control |
|
|
|
readonly property bool _shortText: ScreenTools.isTinyScreen |
|
|
|
// User visible strings |
|
|
|
readonly property string title: qsTr("FLIGHT MODES") |
|
|
|
property string topHelpText: ScreenTools.isTinyScreen ? |
|
qsTr("Assign Flight Modes to radio control channels and adjust the thresholds for triggering them.") : |
|
(qsTr("Assign Flight Modes to radio control channels and adjust the thresholds for triggering them. ") + |
|
qsTr("You can assign multiple flight modes to a single channel. ") + |
|
qsTr("Turn your radio control on to test switch settings. ") + |
|
qsTr("The following channels: ") + controller.reservedChannels + |
|
qsTr(" are not available for Flight Modes since they are already in use for other functions.")) |
|
|
|
readonly property string fwManualModeName: qsTr("Manual/Main") |
|
readonly property string mrManualModeName: qsTr("Stabilized/Main") |
|
readonly property string fwManualModeDescription: qsTr("The pilot has full control of the aircraft, no assistance is provided. ") + |
|
qsTr("The Main mode switch must always be assigned to a channel in order to fly") |
|
readonly property string mrManualModeDescription: qsTr("The pilot has full control of the aircraft, only attitude is stabilized. ") + |
|
qsTr("The Main mode switch must always be assigned to a channel in order to fly") |
|
|
|
readonly property string assistModeName: qsTr("Assist") |
|
readonly property string assistModeDescription: qsTr("If Position Control is placed on a seperate channel from the Main mode channel, an additional 'Assist' mode is added to the Main switch. ") + |
|
qsTr("In order for the Attitude Control/Position Control switch to be active, the Main switch must be in Assist mode.") |
|
|
|
readonly property string autoModeName: qsTr("Auto") |
|
readonly property string autoModeDescription: qsTr("If Loiter is placed on a seperate channel from the Main mode channel, an additional 'Auto' mode is added to the Main switch. ") + |
|
qsTr("In order for the Mission/Loiter switch to be active, the Main switch must be in Auto mode.") |
|
|
|
readonly property string fwAcroModeName: qsTr("Stabilized") |
|
readonly property string mrAcroModeName: qsTr("Acro") |
|
readonly property string fwAcroModeDescription: qsTr("The angular rates are controlled, but not the attitude. ") |
|
readonly property string mrAcroModeDescription: qsTr("The angular rates are controlled, but not the attitude. ") |
|
|
|
readonly property string altCtlModeName: qsTr("Altitude Control") |
|
readonly property string fwAltCtlModeDescription: qsTr("Roll stick controls banking, pitch stick altitude ") + |
|
qsTr("Throttle stick controls speed. ") + |
|
qsTr("With no stick inputs the plane holds heading, but drifts off in wind. ") |
|
readonly property string mrAltCtlModeDescription: qsTr("Same as Stablized mode except that Throttle controls climb/sink rate. Centered Throttle holds altitude steady. ") |
|
|
|
readonly property string posCtlModeName: qsTr("Position Control") |
|
readonly property string fwPosCtlModeDescription: qsTr("Roll stick controls banking, pitch stick controls altitude. ") + |
|
qsTr("Throttle stick controls speed.") + |
|
qsTr("With no stick inputs the plane flies a straight line, even in wind. ") |
|
readonly property string mrPosCtlModeDescription: qsTr("Roll and Pitch sticks control sideways and forward speed ") + |
|
qsTr("Throttle stick controls climb / sink rade. ") |
|
|
|
readonly property string missionModeName: qsTr("Auto Mission") |
|
readonly property string missionModeDescription: qsTr("The aircraft obeys the programmed mission sent by QGroundControl. ") |
|
|
|
readonly property string loiterModeName: qsTr("Auto Pause") |
|
readonly property string fwLoiterModeDescription: qsTr("The aircraft flies in a circle around the current position at the current altitude. ") |
|
readonly property string mrLoiterModeDescription: qsTr("The multirotor hovers at the current position and altitude. ") |
|
|
|
readonly property string returnModeName: qsTr("Return") |
|
readonly property string returnModeDescription: qsTr("The vehicle returns to the home position, loiters and then lands. ") |
|
|
|
readonly property string offboardModeName: qsTr("Offboard") |
|
readonly property string offboardModeDescription: qsTr("All flight control aspects are controlled by an offboard system.") |
|
|
|
readonly property real modeSpacing: ScreenTools.defaultFontPixelHeight / 3 |
|
|
|
QGCPalette { id: qgcPal; colorGroupEnabled: panel.enabled } |
|
|
|
PX4AdvancedFlightModesController { |
|
id: controller |
|
factPanel: qgcViewPanel |
|
|
|
onModeRowsChanged: recalcModePositions() |
|
} |
|
|
|
Timer { |
|
interval: 200 |
|
running: true |
|
|
|
onTriggered: { |
|
recalcModePositions() |
|
} |
|
} |
|
|
|
function recalcModePositions() { |
|
var spacing = ScreenTools.defaultFontPixelHeight / 2 |
|
var nextY = manualMode.y + manualMode.height + spacing |
|
|
|
for (var index = 0; index < 9; index++) { |
|
if (controller.assistModeRow == index) { |
|
if (controller.assistModeVisible) { |
|
assistMode.y = nextY |
|
assistMode.z = 9 - index |
|
nextY += assistMode.height + spacing |
|
} |
|
} else if (controller.autoModeRow == index) { |
|
if (controller.autoModeVisible) { |
|
autoMode.y = nextY |
|
autoMode.z = 9 - index |
|
nextY += autoMode.height + spacing |
|
} |
|
} else if (controller.acroModeRow == index) { |
|
acroMode.y = nextY |
|
acroMode.z = 9 - index |
|
nextY += acroMode.height + spacing |
|
} else if (controller.altCtlModeRow == index) { |
|
altCtlMode.y = nextY |
|
altCtlMode.z = 9 - index |
|
nextY += altCtlMode.height + spacing |
|
} else if (controller.posCtlModeRow == index) { |
|
posCtlMode.y = nextY |
|
posCtlMode.z = 9 - index |
|
nextY += posCtlMode.height + spacing |
|
} else if (controller.loiterModeRow == index) { |
|
loiterMode.y = nextY |
|
loiterMode.z = 9 - index |
|
nextY += loiterMode.height + spacing |
|
} else if (controller.missionModeRow == index) { |
|
missionMode.y = nextY |
|
missionMode.z = 9 - index |
|
nextY += missionMode.height + spacing |
|
} else if (controller.returnModeRow == index) { |
|
returnMode.y = nextY |
|
returnMode.z = 9 - index |
|
nextY += returnMode.height + spacing |
|
} else if (controller.offboardModeRow == index) { |
|
offboardMode.y = nextY |
|
offboardMode.z = 9 - index |
|
nextY += offboardMode.height + spacing |
|
} |
|
} |
|
|
|
scrollItem.height = nextY |
|
} |
|
|
|
Component { |
|
id: joystickEnabledDialogComponent |
|
|
|
QGCViewMessage { |
|
message: qsTr("Flight Mode Config is disabled since you have a Joystick enabled.") |
|
} |
|
} |
|
|
|
ScrollView { |
|
id: scroll |
|
anchors.fill: parent |
|
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff |
|
|
|
Item { |
|
id: scrollItem |
|
width: scroll.viewport.width |
|
|
|
Item { |
|
id: helpApplyRow |
|
width: parent.width |
|
height: Math.max(helpText.contentHeight, applyButton.y + applyButton.height) |
|
|
|
QGCLabel { |
|
id: helpText |
|
anchors.rightMargin: ScreenTools.defaultFontPixelWidth |
|
anchors.left: parent.left |
|
anchors.right: buttonColumn.left |
|
text: topHelpText |
|
font.pointSize: ScreenTools.defaultFontPointSize |
|
wrapMode: Text.WordWrap |
|
} |
|
|
|
Column { |
|
id: buttonColumn |
|
anchors.rightMargin: ScreenTools.defaultFontPixelWidth |
|
anchors.right: parent.right |
|
spacing: ScreenTools.defaultFontPixelHeight / 4 |
|
|
|
QGCButton { |
|
text: qsTr("Use Single Channel Mode Selection") |
|
visible: controller.parameterExists(-1, "RC_MAP_FLTMODE") |
|
onClicked: { |
|
controller.getParameterFact(-1, "RC_MAP_MODE_SW").value = 0 |
|
controller.getParameterFact(-1, "RC_MAP_FLTMODE").value = 5 |
|
} |
|
} |
|
|
|
QGCButton { |
|
id: applyButton |
|
text: qsTr("Generate Thresholds") |
|
onClicked: controller.generateThresholds() |
|
} |
|
} |
|
} |
|
|
|
Item { |
|
id: lastSpacer |
|
anchors.top: helpApplyRow.bottom |
|
height: ScreenTools.defaultFontPixelHeight |
|
width: 10 |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: manualMode |
|
anchors.top: lastSpacer.bottom |
|
flightModeName: controller.fixedWing ? fwManualModeName : mrManualModeName |
|
flightModeDescription: controller.fixedWing ? fwManualModeDescription : mrManualModeDescription |
|
rcValue: controller.manualModeRcValue |
|
modeChannelIndex: controller.manualModeChannelIndex |
|
modeChannelEnabled: true |
|
modeSelected: controller.manualModeSelected |
|
thresholdValue: controller.manualModeThreshold |
|
thresholdDragEnabled: false |
|
|
|
onModeChannelIndexSelected: controller.manualModeChannelIndex = index |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: assistMode |
|
visible: controller.assistModeVisible |
|
flightModeName: assistModeName |
|
flightModeDescription: assistModeDescription |
|
rcValue: controller.assistModeRcValue |
|
modeChannelIndex: controller.assistModeChannelIndex |
|
modeChannelEnabled: false |
|
modeSelected: controller.assistModeSelected |
|
thresholdValue: controller.assistModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onThresholdValueChanged: controller.assistModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: autoMode |
|
visible: controller.autoModeVisible |
|
flightModeName: autoModeName |
|
flightModeDescription: autoModeDescription |
|
rcValue: controller.autoModeRcValue |
|
modeChannelIndex: controller.autoModeChannelIndex |
|
modeChannelEnabled: false |
|
modeSelected: controller.autoModeSelected |
|
thresholdValue: controller.autoModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onThresholdValueChanged: controller.autoModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: acroMode |
|
flightModeName: controller.fixedWing ? fwAcroModeName : mrAcroModeName |
|
flightModeDescription: controller.fixedWing ? fwAcroModeDescription : mrAcroModeDescription |
|
rcValue: controller.acroModeRcValue |
|
modeChannelIndex: controller.acroModeChannelIndex |
|
modeChannelEnabled: true |
|
modeSelected: controller.acroModeSelected |
|
thresholdValue: controller.acroModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onModeChannelIndexSelected: controller.acroModeChannelIndex = index |
|
onThresholdValueChanged: controller.acroModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: altCtlMode |
|
flightModeName: altCtlModeName |
|
flightModeDescription: controller.fixedWing ? fwAltCtlModeDescription : mrAltCtlModeDescription |
|
rcValue: controller.altCtlModeRcValue |
|
modeChannelIndex: controller.altCtlModeChannelIndex |
|
modeChannelEnabled: false |
|
modeSelected: controller.altCtlModeSelected |
|
thresholdValue: controller.altCtlModeThreshold |
|
thresholdDragEnabled: !controller.assistModeVisible |
|
|
|
onThresholdValueChanged: controller.altCtlModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: posCtlMode |
|
flightModeName: posCtlModeName |
|
flightModeDescription: controller.fixedWing ? fwPosCtlModeDescription : mrPosCtlModeDescription |
|
rcValue: controller.posCtlModeRcValue |
|
modeChannelIndex: controller.posCtlModeChannelIndex |
|
modeChannelEnabled: true |
|
modeSelected: controller.posCtlModeSelected |
|
thresholdValue: controller.posCtlModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onModeChannelIndexSelected: controller.posCtlModeChannelIndex = index |
|
onThresholdValueChanged: controller.posCtlModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: missionMode |
|
flightModeName: missionModeName |
|
flightModeDescription: missionModeDescription |
|
rcValue: controller.missionModeRcValue |
|
modeChannelIndex: controller.missionModeChannelIndex |
|
modeChannelEnabled: false |
|
modeSelected: controller.missionModeSelected |
|
thresholdValue: controller.missionModeThreshold |
|
thresholdDragEnabled: !controller.autoModeVisible |
|
|
|
onThresholdValueChanged: controller.missionModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: loiterMode |
|
flightModeName: loiterModeName |
|
flightModeDescription: controller.fixedWing ? fwLoiterModeDescription : mrLoiterModeDescription |
|
rcValue: controller.loiterModeRcValue |
|
modeChannelIndex: controller.loiterModeChannelIndex |
|
modeChannelEnabled: true |
|
modeSelected: controller.loiterModeSelected |
|
thresholdValue: controller.loiterModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onModeChannelIndexSelected: controller.loiterModeChannelIndex = index |
|
onThresholdValueChanged: controller.loiterModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: returnMode |
|
flightModeName: returnModeName |
|
flightModeDescription: returnModeDescription |
|
rcValue: controller.returnModeRcValue |
|
modeChannelIndex: controller.returnModeChannelIndex |
|
modeChannelEnabled: true |
|
modeSelected: controller.returnModeSelected |
|
thresholdValue: controller.returnModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onModeChannelIndexSelected: controller.returnModeChannelIndex = index |
|
onThresholdValueChanged: controller.returnModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
|
|
ModeSwitchDisplay { |
|
id: offboardMode |
|
flightModeName: offboardModeName |
|
flightModeDescription: offboardModeDescription |
|
rcValue: controller.offboardModeRcValue |
|
modeChannelIndex: controller.offboardModeChannelIndex |
|
modeChannelEnabled: true |
|
modeSelected: controller.offboardModeSelected |
|
thresholdValue: controller.offboardModeThreshold |
|
thresholdDragEnabled: true |
|
|
|
onModeChannelIndexSelected: controller.offboardModeChannelIndex = index |
|
onThresholdValueChanged: controller.offboardModeThreshold = thresholdValue |
|
|
|
Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } |
|
} |
|
} // Item |
|
} // Scroll View |
|
} // Item
|
|
|