PX4AdvancedFlightModes.qml 22.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*=====================================================================

 QGroundControl Open Source Ground Control Station

 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

 This file is part of the QGROUNDCONTROL project

 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

 ======================================================================*/

Don Gagne's avatar
Don Gagne committed
24 25 26 27 28 29 30 31 32 33 34 35 36
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

Don Gagne's avatar
Don Gagne committed
37 38 39 40 41 42 43
/// 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
Don Gagne's avatar
Don Gagne committed
44 45 46 47 48

    readonly property int monitorThresholdCharWidth: 8  // Character width of Monitor and Threshold labels

    // User visible strings

Don Gagne's avatar
Don Gagne committed
49
    readonly property string title:                     "FLIGHT MODES"
50 51


52
    property string topHelpText:                        "Assign Flight Modes to radio control channels and adjust the thresholds for triggering them. " +
Don Gagne's avatar
Don Gagne committed
53
                                                        "You can assign multiple flight modes to a single channel. " +
54 55 56
                                                        "Turn your radio control on to test switch settings. " +
                                                        "The following channels: " + controller.reservedChannels +
                                                        " are not available for Flight Modes since they are already in use for other functions."
Don Gagne's avatar
Don Gagne committed
57 58 59 60 61 62


    readonly property string fwManualModeName:          "Manual/Main"
    readonly property string mrManualModeName:          "Stabilized/Main"
    readonly property string fwManualModeDescription:   "The pilot has full control of the aircraft, no assistance is provided. " +
                                                        "The Main mode switch must always be assigned to a channel in order to fly"
63 64 65
    readonly property string mrManualModeDescription:   "Roll and Pitch control angle of multi-rotor in respective direction. " +
                                                        "Centering Roll/Pitch will return multirotor to level attitude. " +
                                                        "Position is not automatically held, multi-rotor will continue drifting in the direction it was previously travelling. " +
Don Gagne's avatar
Don Gagne committed
66 67 68 69 70 71 72 73 74 75 76 77 78
                                                        "Altitude is controlled fully by pilot using the Throttle stick. " +
                                                        "The Main mode switch must always be assigned to a channel in order to fly"

    readonly property string assistModeName:            "Assist"
    readonly property string assistModeDescription:     "If Position Control is placed on a seperate channel from the Main mode channel, an additional 'Assist' mode is added to the Main switch. " +
                                                        "In order for the Attitude Control/Position Control switch to be active, the Main switch must be in Assist mode."

    readonly property string autoModeName:              "Auto"
    readonly property string autoModeDescription:       "If Loiter is placed on a seperate channel from the Main mode channel, an additional 'Auto' mode is added to the Main switch. " +
                                                        "In order for the Mission/Loiter switch to be active, the Main switch must be in Auto mode."

    readonly property string fwAcroModeName:            "Stabilized"
    readonly property string mrAcroModeName:            "Acro"
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    readonly property string fwAcroModeDescription:     "Roll and Pitch control angle of aircraft in respective direction. " +
                                                        "Centering Roll/Pitch will return the aircraft to a level attitude. " +
                                                        "Neither altitude nor direction is automatically controlled. " +
                                                        "Both Throttle and Yaw and in full control of pilot."
    readonly property string mrAcroModeDescription:     "Roll and Pitch control angular rate of change of multi-rotor in respective direction. " +
                                                        "This allows for multi-rotor to rotate through a full 360 degrees in roll and/or pitch. " +
                                                        "Centering Roll/Pitch will return the multirotor to a level attitude. " +
                                                        "Position is not automatically held, multi-rotor will continue drifting in the direction it was previously travelling. " +
                                                        "Altitude is under manual control of pilot using the Throttle stick."

    readonly property string altCtlModeName:            "Altitude Control"
    readonly property string fwAltCtlModeDescription:   "Current Altitude is maintained automatically when Pitch is centered. " +
                                                        "Roll and Pitch centered gives level flight, but does not maintain straight line direction against wind. " +
                                                        "Throttle controls speed, Pitch controls climb/sink rate, Roll controls turn rate. " +
                                                        "Position Control and Attitude Control must always be on the same channel."
    readonly property string mrAltCtlModeDescription:   "Same as Stablized mode except that Throttle controls climb/sink rate. Centered Throttle holds altitude steady."
Don Gagne's avatar
Don Gagne committed
95 96

    readonly property string posCtlModeName:            "Position Control"
97 98 99
    readonly property string fwPosCtlModeDescription:   "Current Altitude is maintained automatically when Pitch is centered. " +
                                                        "Roll and Pitch centered gives level flight in a straight line compensating against wind. " +
                                                        "Throttle controls speed, Pitch controls climb/sink rate, Roll controls turn rate. " +
Don Gagne's avatar
Don Gagne committed
100 101
                                                        "Position Control and Attitude Control must always be on the same channel."
    readonly property string mrPosCtlModeDescription:   "Roll and Pitch control left-right and front-back speed over ground respectively. " +
102
                                                        "Centering Roll/Pitch will level and hold position. " +
Don Gagne's avatar
Don Gagne committed
103
                                                        "Yaw controls yaw rate as in Stablized mode. " +
104 105
                                                        "Centered throttle holds current altitude. " +
                                                        "Throttle above/below center controls climb/sink rate. " +
Don Gagne's avatar
Don Gagne committed
106 107 108 109
                                                        "Position Control and Attitude Control must always be on the same channel."

    readonly property string missionModeName:           "Mission"
    readonly property string missionModeDescription:    "The aircraft obeys the programmed mission sent by QGroundControl. " +
110
                                                        "If no mission was sent, aircraft will Loiter at current position instead."
Don Gagne's avatar
Don Gagne committed
111 112 113 114

    readonly property string loiterModeName:            "Loiter"
    readonly property string fwLoiterModeDescription:   "The aircraft flies in a circle around the current position at the current altitude. " +
                                                        "Loiter and Mission must always be on the same channel."
115
    readonly property string mrLoiterModeDescription:   "The multirotor hovers at the current position and altitude. " +
Don Gagne's avatar
Don Gagne committed
116 117 118
                                                        "Loiter and Mission must always be on the same channel."

    readonly property string returnModeName:            "Return"
119
    readonly property string returnModeDescription:     "The vehicle returns to the home position, loiters and then lands. " +
Don Gagne's avatar
Don Gagne committed
120 121 122
                                                        "The settings which control this sequence can be found under Setup - Safety."

    readonly property string offboardModeName:          "Offboard"
123
    readonly property string offboardModeDescription:   "All flight control aspects are controlled by an offboard system."
Don Gagne's avatar
Don Gagne committed
124 125 126 127 128

    readonly property real modeSpacing: ScreenTools.defaultFontPixelHeight / 3

    QGCPalette { id: qgcPal; colorGroupEnabled: panel.enabled }

Don Gagne's avatar
Don Gagne committed
129
    PX4AdvancedFlightModesController {
Don Gagne's avatar
Don Gagne committed
130
        id:         controller
Don Gagne's avatar
Don Gagne committed
131
        factPanel:  qgcViewPanel
Don Gagne's avatar
Don Gagne committed
132 133

        onModeRowsChanged: recalcModePositions()
Don Gagne's avatar
Don Gagne committed
134 135
    }

Don Gagne's avatar
Don Gagne committed
136 137 138
    Timer {
        interval:   200
        running:    true
Don Gagne's avatar
Don Gagne committed
139

140
        onTriggered: {
141
            recalcModePositions()
142
        }
Don Gagne's avatar
Don Gagne committed
143
    }
Don Gagne's avatar
Don Gagne committed
144

Don Gagne's avatar
Don Gagne committed
145 146 147
    function recalcModePositions() {
        var spacing = ScreenTools.defaultFontPixelHeight / 2
        var nextY = manualMode.y + manualMode.height + spacing
Don Gagne's avatar
Don Gagne committed
148

Don Gagne's avatar
Don Gagne committed
149 150 151 152 153 154
        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
Don Gagne's avatar
Don Gagne committed
155
                }
Don Gagne's avatar
Don Gagne committed
156 157 158 159 160
            } else if (controller.autoModeRow == index) {
                if (controller.autoModeVisible) {
                    autoMode.y = nextY
                    autoMode.z = 9 - index
                    nextY += autoMode.height  + spacing
Don Gagne's avatar
Don Gagne committed
161
                }
Don Gagne's avatar
Don Gagne committed
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
            } 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
Don Gagne's avatar
Don Gagne committed
190
            }
Don Gagne's avatar
Don Gagne committed
191
        }
Don Gagne's avatar
Don Gagne committed
192

Don Gagne's avatar
Don Gagne committed
193 194
        scrollItem.height = nextY
    }
Don Gagne's avatar
Don Gagne committed
195

Don Gagne's avatar
Don Gagne committed
196 197
    Component {
        id: joystickEnabledDialogComponent
Don Gagne's avatar
Don Gagne committed
198

Don Gagne's avatar
Don Gagne committed
199 200
        QGCViewMessage {
            message: "Flight Mode Config is disabled since you have a Joystick enabled."
201
        }
Don Gagne's avatar
Don Gagne committed
202 203 204 205 206 207
    }

    ScrollView {
        id:                         scroll
        anchors.fill:               parent
        horizontalScrollBarPolicy:  Qt.ScrollBarAlwaysOff
208

Don Gagne's avatar
Don Gagne committed
209 210 211
        Item {
            id:     scrollItem
            width:  scroll.viewport.width
Don Gagne's avatar
Don Gagne committed
212

Don Gagne's avatar
Don Gagne committed
213
            Item {
Don Gagne's avatar
Don Gagne committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
                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.pixelSize:         ScreenTools.defaultFontPixelSize
                    wrapMode:               Text.WordWrap
                }

                Column {
                    id:                     buttonColumn
                    anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                    anchors.right:          parent.right
                    spacing:                ScreenTools.defaultFontPixelHeight / 4

                    QGCButton {
                        text: "Use Simple Flight Modes"
                        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
                        }
241 242 243 244 245 246 247
                    }

                    QGCButton {
                        id:                     applyButton
                        text:                   "Generate Thresholds"
                        onClicked: controller.generateThresholds()
                    }
Don Gagne's avatar
Don Gagne committed
248
                }
Don Gagne's avatar
Don Gagne committed
249
            }
Don Gagne's avatar
Don Gagne committed
250

Don Gagne's avatar
Don Gagne committed
251 252 253 254 255 256
            Item {
                id:             lastSpacer
                anchors.top:    helpApplyRow.bottom
                height:         ScreenTools.defaultFontPixelHeight
                width:          10
            }
Don Gagne's avatar
Don Gagne committed
257

Don Gagne's avatar
Don Gagne committed
258 259 260 261 262 263 264 265 266 267 268 269 270 271
            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
            }
Don Gagne's avatar
Don Gagne committed
272

Don Gagne's avatar
Don Gagne committed
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
            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 } }
            }
Don Gagne's avatar
Don Gagne committed
289

Don Gagne's avatar
Don Gagne committed
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
            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 } }
            }
Don Gagne's avatar
Don Gagne committed
306

Don Gagne's avatar
Don Gagne committed
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
            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 } }
            }
Don Gagne's avatar
Don Gagne committed
323

Don Gagne's avatar
Don Gagne committed
324 325 326 327 328 329 330 331 332 333
            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
Don Gagne's avatar
Don Gagne committed
334

Don Gagne's avatar
Don Gagne committed
335
                onThresholdValueChanged:    controller.altCtlModeThreshold = thresholdValue
Don Gagne's avatar
Don Gagne committed
336

Don Gagne's avatar
Don Gagne committed
337 338
                Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } }
            }
Don Gagne's avatar
Don Gagne committed
339

Don Gagne's avatar
Don Gagne committed
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
            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 } }
            }
Don Gagne's avatar
Don Gagne committed
356

Don Gagne's avatar
Don Gagne committed
357 358 359 360 361 362 363 364 365 366
            ModeSwitchDisplay {
                id:                     missionMode
                flightModeName:         missionModeName
                flightModeDescription:  missionModeDescription
                rcValue:                controller.missionModeRcValue
                modeChannelIndex:       controller.missionModeChannelIndex
                modeChannelEnabled:     false
                modeSelected:           controller.missionModeSelected
                thresholdValue:         controller.missionModeThreshold
                thresholdDragEnabled:   !controller.autoModeVisible
Don Gagne's avatar
Don Gagne committed
367

Don Gagne's avatar
Don Gagne committed
368
                onThresholdValueChanged: controller.missionModeThreshold = thresholdValue
Don Gagne's avatar
Don Gagne committed
369

Don Gagne's avatar
Don Gagne committed
370 371
                Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } }
            }
Don Gagne's avatar
Don Gagne committed
372

Don Gagne's avatar
Don Gagne committed
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
            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 } }
            }
Don Gagne's avatar
Don Gagne committed
389

Don Gagne's avatar
Don Gagne committed
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
            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 } }
            }
Don Gagne's avatar
Don Gagne committed
406

Don Gagne's avatar
Don Gagne committed
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
            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