FlightDisplayViewWidgets.qml 20 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (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.
 *
 ****************************************************************************/
9 10 11 12 13 14 15 16 17


import QtQuick                  2.4
import QtQuick.Controls         1.3
import QtQuick.Controls.Styles  1.2
import QtQuick.Dialogs          1.2
import QtLocation               5.3
import QtPositioning            5.2

18 19 20 21 22 23
import QGroundControl                           1.0
import QGroundControl.ScreenTools               1.0
import QGroundControl.Controls                  1.0
import QGroundControl.Palette                   1.0
import QGroundControl.Vehicle                   1.0
import QGroundControl.FlightMap                 1.0
24 25

Item {
26
    id: _root
27

28 29
    property alias  guidedModeBar:          _guidedModeBar
    property bool   gotoEnabled:            _activeVehicle && _activeVehicle.guidedMode && _activeVehicle.flying
30 31
    property var    qgcView
    property bool   isBackgroundDark
Don Gagne's avatar
Don Gagne committed
32

33 34 35
    property var    _activeVehicle:         QGroundControl.multiVehicleManager.activeVehicle
    property bool   _isSatellite:           _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true
    property bool   _lightWidgetBorders:    _isSatellite
36

37
    readonly property real _margins:        ScreenTools.defaultFontPixelHeight * 0.5
dogmaphobic's avatar
dogmaphobic committed
38

39
    QGCMapPalette { id: mapPal; lightColors: isBackgroundDark }
40
    QGCPalette    { id: qgcPal }
41

42
    function getPreferredInstrumentWidth() {
43
        if(ScreenTools.isMobile) {
44
            return ScreenTools.isTinyScreen ? mainWindow.width * 0.2 : mainWindow.width * 0.15
45 46 47 48 49
        }
        var w = mainWindow.width * 0.15
        return Math.min(w, 200)
    }

50
    function _setInstrumentWidget() {
51 52 53 54 55 56 57 58 59 60 61 62 63 64
        if(QGroundControl.corePlugin.options.instrumentWidget.source.toString().length) {
            instrumentsLoader.source = QGroundControl.corePlugin.options.instrumentWidget.source
            switch(QGroundControl.corePlugin.options.instrumentWidget.widgetPosition) {
            case CustomInstrumentWidget.POS_TOP_RIGHT:
                instrumentsLoader.state  = "topMode"
                break;
            case CustomInstrumentWidget.POS_BOTTOM_RIGHT:
                instrumentsLoader.state  = "bottomMode"
                break;
            case CustomInstrumentWidget.POS_CENTER_RIGHT:
            default:
                instrumentsLoader.state  = "centerMode"
                break;
            }
65
        } else {
66 67 68 69 70 71 72 73
            var useAlternateInstruments = QGroundControl.virtualTabletJoystick || ScreenTools.isTinyScreen
            if(useAlternateInstruments) {
                instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidgetAlternate.qml"
                instrumentsLoader.state  = "topMode"
            } else {
                instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidget.qml"
                instrumentsLoader.state  = "centerMode"
            }
74 75 76 77 78 79 80 81 82 83 84 85 86 87
        }
    }

    Connections {
        target: QGroundControl
        onVirtualTabletJoystickChanged: {
            _setInstrumentWidget()
        }
    }

    Component.onCompleted: {
        _setInstrumentWidget()
    }

Don Gagne's avatar
Don Gagne committed
88
    //-- Map warnings
89
    Column {
Don Gagne's avatar
Don Gagne committed
90 91 92 93 94 95
        anchors.horizontalCenter:   parent.horizontalCenter
        anchors.verticalCenter:     parent.verticalCenter
        spacing:                    ScreenTools.defaultFontPixelHeight

        QGCLabel {
            anchors.horizontalCenter:   parent.horizontalCenter
96
            visible:                    _activeVehicle && !_activeVehicle.coordinateValid && _mainIsMap
Don Gagne's avatar
Don Gagne committed
97 98
            z:                          QGroundControl.zOrderTopMost
            color:                      mapPal.text
99
            font.pointSize:             ScreenTools.largeFontPointSize
100
            text:                       qsTr("No GPS Lock for Vehicle")
Don Gagne's avatar
Don Gagne committed
101 102 103 104
        }

        QGCLabel {
            anchors.horizontalCenter:   parent.horizontalCenter
105
            visible:                    _activeVehicle && _activeVehicle.prearmError
Don Gagne's avatar
Don Gagne committed
106 107
            z:                          QGroundControl.zOrderTopMost
            color:                      mapPal.text
108
            font.pointSize:             ScreenTools.largeFontPointSize
Don Gagne's avatar
Don Gagne committed
109
            text:                       _activeVehicle ? _activeVehicle.prearmError : ""
110 111 112
        }
    }

dogmaphobic's avatar
dogmaphobic committed
113
    //-- Instrument Panel
114 115
    Loader {
        id:                     instrumentsLoader
116
        anchors.margins:        ScreenTools.defaultFontPixelHeight / 2
Don Gagne's avatar
Don Gagne committed
117
        anchors.right:          altitudeSlider.visible ? altitudeSlider.left : parent.right
118
        z:                      QGroundControl.zOrderWidgets
119 120 121 122 123 124 125 126
        property var  qgcView:  _root.qgcView
        property real maxHeight:parent.height - (anchors.margins * 2)
        states: [
            State {
                name:   "topMode"
                AnchorChanges {
                    target:                 instrumentsLoader
                    anchors.verticalCenter: undefined
127
                    anchors.bottom:         undefined
128 129 130 131 132 133 134 135
                    anchors.top:            _root ? _root.top : undefined
                }
            },
            State {
                name:   "centerMode"
                AnchorChanges {
                    target:                 instrumentsLoader
                    anchors.top:            undefined
136
                    anchors.bottom:         undefined
137 138
                    anchors.verticalCenter: _root ? _root.verticalCenter : undefined
                }
139 140 141 142 143 144 145 146 147
            },
            State {
                name:   "bottomMode"
                AnchorChanges {
                    target:                 instrumentsLoader
                    anchors.top:            undefined
                    anchors.verticalCenter: undefined
                    anchors.bottom:         _root ? _root.bottom : undefined
                }
148 149
            }
        ]
150 151
    }

Don Gagne's avatar
Don Gagne committed
152 153 154
    //-- Guided mode buttons
    Rectangle {
        id:                         _guidedModeBar
Don Gagne's avatar
Don Gagne committed
155
        anchors.margins:            _barMargin
Don Gagne's avatar
Don Gagne committed
156 157
        anchors.bottom:             parent.bottom
        anchors.horizontalCenter:   parent.horizontalCenter
158
        width:                      guidedModeColumn.width  + (_margins * 2)
Don Gagne's avatar
Don Gagne committed
159
        height:                     guidedModeColumn.height + (_margins * 2)
160
        radius:                     ScreenTools.defaultFontPixelHeight * 0.25
161
        color:                      _isSatellite ? Qt.rgba(qgcPal.mapWidgetBorderLight.r, qgcPal.mapWidgetBorderLight.g, qgcPal.mapWidgetBorderLight.b, 0.8) : Qt.rgba(qgcPal.mapWidgetBorderDark.r, qgcPal.mapWidgetBorderDark.g, qgcPal.mapWidgetBorderDark.b, 0.75)
Don Gagne's avatar
Don Gagne committed
162 163
        visible:                    _activeVehicle
        z:                          QGroundControl.zOrderWidgets
Don Gagne's avatar
Don Gagne committed
164 165
        state:                      "Shown"

166 167
        property real _fontPointSize: ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize

Don Gagne's avatar
Don Gagne committed
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
        states: [
            State {
                name: "Shown"
                PropertyChanges { target: showAnimation; running: true  }
                PropertyChanges { target: guidedModeHideTimer; running: true }
            },
            State {
                name: "Hidden"
                PropertyChanges { target: hideAnimation; running: true  }
            }
        ]

        PropertyAnimation {
            id:             hideAnimation
            target:         _guidedModeBar
            property:       "_barMargin"
            duration:       1000
            easing.type:    Easing.InOutQuad
            from:           _guidedModeBar._showMargin
            to:             _guidedModeBar._hideMargin
        }

        PropertyAnimation {
            id:             showAnimation
            target:         _guidedModeBar
            property:       "_barMargin"
            duration:       250
            easing.type:    Easing.InOutQuad
            from:           _guidedModeBar._hideMargin
            to:             _guidedModeBar._showMargin
        }

        Timer {
            id:             guidedModeHideTimer
            interval:       7000
            running:        true
204 205 206 207 208
            onTriggered: {
                if (ScreenTools.isShortScreen) {
                    _guidedModeBar.state = "Hidden"
                }
            }
Don Gagne's avatar
Don Gagne committed
209
        }
Don Gagne's avatar
Don Gagne committed
210 211 212 213 214 215 216 217 218

        readonly property int confirmHome:          1
        readonly property int confirmLand:          2
        readonly property int confirmTakeoff:       3
        readonly property int confirmArm:           4
        readonly property int confirmDisarm:        5
        readonly property int confirmEmergencyStop: 6
        readonly property int confirmChangeAlt:     7
        readonly property int confirmGoTo:          8
219
        readonly property int confirmRetask:        9
220
        readonly property int confirmOrbit:         10
221
        readonly property int confirmAbort:         11
Don Gagne's avatar
Don Gagne committed
222 223

        property int    confirmActionCode
Don Gagne's avatar
Don Gagne committed
224 225 226
        property real   _showMargin:    _margins
        property real   _hideMargin:    _margins - _guidedModeBar.height
        property real   _barMargin:     _showMargin
Don Gagne's avatar
Don Gagne committed
227 228 229 230 231 232 233 234 235 236

        function actionConfirmed() {
            switch (confirmActionCode) {
            case confirmHome:
                _activeVehicle.guidedModeRTL()
                break;
            case confirmLand:
                _activeVehicle.guidedModeLand()
                break;
            case confirmTakeoff:
237 238 239
                var altitude1 = altitudeSlider.getValue()
                if (!isNaN(altitude1)) {
                    _activeVehicle.guidedModeTakeoff(altitude1)
Don Gagne's avatar
Don Gagne committed
240 241 242 243 244 245 246 247 248 249 250 251
                }
                break;
            case confirmArm:
                _activeVehicle.armed = true
                break;
            case confirmDisarm:
                _activeVehicle.armed = false
                break;
            case confirmEmergencyStop:
                _activeVehicle.emergencyStop()
                break;
            case confirmChangeAlt:
252 253 254
                var altitude2 = altitudeSlider.getValue()
                if (!isNaN(altitude2)) {
                    _activeVehicle.guidedModeChangeAltitude(altitude2)
Don Gagne's avatar
Don Gagne committed
255 256 257 258 259
                }
                break;
            case confirmGoTo:
                _activeVehicle.guidedModeGotoLocation(_flightMap._gotoHereCoordinate)
                break;
260 261 262
            case confirmRetask:
                _activeVehicle.setCurrentMissionSequence(_flightMap._retaskSequence)
                break;
263 264 265 266 267 268
            case confirmOrbit:
                //-- All parameters controlled by RC
                _activeVehicle.guidedModeOrbit()
                //-- Center on current flight map position and orbit with a 50m radius (velocity/direction controlled by the RC)
                //_activeVehicle.guidedModeOrbit(QGroundControl.flightMapPosition, 50.0)
                break;
269
            case confirmAbort:
270
                _activeVehicle.abortLanding(50)     // hardcoded value for climbOutAltitude that is currently ignored
271
                break;
Don Gagne's avatar
Don Gagne committed
272
            default:
273
                console.warn(qsTr("Internal error: unknown confirmActionCode"), confirmActionCode)
Don Gagne's avatar
Don Gagne committed
274 275 276
            }
        }

277 278
        function rejectGuidedModeConfirm() {
            guidedModeConfirm.visible = false
Don Gagne's avatar
Don Gagne committed
279
            _guidedModeBar.visible = true
280 281
            altitudeSlider.visible = false
            _flightMap._gotoHereCoordinate = QtPositioning.coordinate()
Don Gagne's avatar
Don Gagne committed
282
            guidedModeHideTimer.restart()
283 284
        }

Don Gagne's avatar
Don Gagne committed
285
        function confirmAction(actionCode) {
Don Gagne's avatar
Don Gagne committed
286
            guidedModeHideTimer.stop()
Don Gagne's avatar
Don Gagne committed
287 288 289
            confirmActionCode = actionCode
            switch (confirmActionCode) {
            case confirmArm:
290
                guidedModeConfirm.confirmText = qsTr("arm")
Don Gagne's avatar
Don Gagne committed
291 292
                break;
            case confirmDisarm:
293
                guidedModeConfirm.confirmText = qsTr("disarm")
Don Gagne's avatar
Don Gagne committed
294 295
                break;
            case confirmEmergencyStop:
296
                guidedModeConfirm.confirmText = qsTr("STOP ALL MOTORS!")
Don Gagne's avatar
Don Gagne committed
297 298 299
                break;
            case confirmTakeoff:
                altitudeSlider.visible = true
300
                altitudeSlider.setInitialValueMeters(3)
301
                guidedModeConfirm.confirmText = qsTr("takeoff")
Don Gagne's avatar
Don Gagne committed
302 303
                break;
            case confirmLand:
304
                guidedModeConfirm.confirmText = qsTr("land")
Don Gagne's avatar
Don Gagne committed
305
                break;
Don Gagne's avatar
Don Gagne committed
306
            case confirmHome:
307
                guidedModeConfirm.confirmText = qsTr("return to land")
Don Gagne's avatar
Don Gagne committed
308
                break;
Don Gagne's avatar
Don Gagne committed
309 310
            case confirmChangeAlt:
                altitudeSlider.visible = true
311
                altitudeSlider.setInitialValueAppSettingsDistanceUnits(_activeVehicle.altitudeRelative.value)
312
                guidedModeConfirm.confirmText = qsTr("change altitude")
Don Gagne's avatar
Don Gagne committed
313 314
                break;
            case confirmGoTo:
315
                guidedModeConfirm.confirmText = qsTr("move vehicle")
Don Gagne's avatar
Don Gagne committed
316
                break;
317
            case confirmRetask:
318
                guidedModeConfirm.confirmText = qsTr("active waypoint change")
319
                break;
320 321 322
            case confirmOrbit:
                guidedModeConfirm.confirmText = qsTr("enter orbit mode")
                break;
323 324 325
            case confirmAbort:
                guidedModeConfirm.confirmText = qsTr("abort landing")
                break;
Don Gagne's avatar
Don Gagne committed
326
            }
Don Gagne's avatar
Don Gagne committed
327
            _guidedModeBar.visible = false
Don Gagne's avatar
Don Gagne committed
328 329 330
            guidedModeConfirm.visible = true
        }

Don Gagne's avatar
Don Gagne committed
331 332
        Column {
            id:                 guidedModeColumn
Don Gagne's avatar
Don Gagne committed
333 334 335 336 337
            anchors.margins:    _margins
            anchors.top:        parent.top
            anchors.left:       parent.left
            spacing:            _margins

338 339
            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
340
                color:      _isSatellite ? qgcPal.mapWidgetBorderDark : qgcPal.mapWidgetBorderLight
341
                text:       "Click in map to move vehicle"
342
                visible:    gotoEnabled
343 344
            }

Don Gagne's avatar
Don Gagne committed
345
            Row {
Don Gagne's avatar
Don Gagne committed
346
                spacing: _margins * 2
Don Gagne's avatar
Don Gagne committed
347 348

                QGCButton {
349
                    pointSize:  _guidedModeBar._fontPointSize
350
                    text:       (_activeVehicle && _activeVehicle.armed) ? (_activeVehicle.flying ? qsTr("Emergency Stop") : qsTr("Disarm")) :  qsTr("Arm")
Don Gagne's avatar
Don Gagne committed
351
                    visible:    _activeVehicle
Don Gagne's avatar
Don Gagne committed
352
                    onClicked:  _guidedModeBar.confirmAction(_activeVehicle.armed ? (_activeVehicle.flying ? _guidedModeBar.confirmEmergencyStop : _guidedModeBar.confirmDisarm) : _guidedModeBar.confirmArm)
353
                }
Don Gagne's avatar
Don Gagne committed
354

Don Gagne's avatar
Don Gagne committed
355
                QGCButton {
356
                    pointSize:  _guidedModeBar._fontPointSize
357
                    text:       qsTr("RTL")
358
                    visible:    (_activeVehicle && _activeVehicle.armed) && _activeVehicle.guidedModeSupported && _activeVehicle.flying
Don Gagne's avatar
Don Gagne committed
359
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmHome)
360
                }
Don Gagne's avatar
Don Gagne committed
361

Don Gagne's avatar
Don Gagne committed
362
                QGCButton {
363
                    pointSize:  _guidedModeBar._fontPointSize
364
                    text:       (_activeVehicle && _activeVehicle.flying) ?  qsTr("Land"):  qsTr("Takeoff")
365
                    visible:    _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed
Don Gagne's avatar
Don Gagne committed
366
                    onClicked:  _guidedModeBar.confirmAction(_activeVehicle.flying ? _guidedModeBar.confirmLand : _guidedModeBar.confirmTakeoff)
367
                }
Don Gagne's avatar
Don Gagne committed
368

Don Gagne's avatar
Don Gagne committed
369
                QGCButton {
370
                    pointSize:  _guidedModeBar._fontPointSize
371
                    text:       qsTr("Pause")
372
                    visible:    (_activeVehicle && _activeVehicle.armed) && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying
Don Gagne's avatar
Don Gagne committed
373 374
                    onClicked:  {
                        guidedModeHideTimer.restart()
375 376 377
                        _activeVehicle.pauseVehicle()
                    }
                }
Don Gagne's avatar
Don Gagne committed
378

Don Gagne's avatar
Don Gagne committed
379
                QGCButton {
380
                    pointSize:  _guidedModeBar._fontPointSize
381
                    text:       qsTr("Change Altitude")
382
                    visible:    (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed
Don Gagne's avatar
Don Gagne committed
383
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmChangeAlt)
384
                }
385 386 387 388

                QGCButton {
                    pointSize:  _guidedModeBar._fontPointSize
                    text:       qsTr("Orbit")
389
                    visible:    (_activeVehicle && _activeVehicle.flying) && _activeVehicle.orbitModeSupported && _activeVehicle.armed
390 391 392
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmOrbit)
                }

393 394 395
                QGCButton {
                    pointSize:  _guidedModeBar._fontPointSize
                    text:       qsTr("Abort")
396
                    visible:    _activeVehicle && _activeVehicle.flying && _activeVehicle.fixedWing
397 398 399
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmAbort)
                }

Don Gagne's avatar
Don Gagne committed
400 401
            } // Row
        } // Column
402 403
    } // Rectangle - Guided mode buttons

404
    MouseArea {
Don Gagne's avatar
Don Gagne committed
405 406 407
        anchors.fill:   parent
        enabled:        guidedModeConfirm.visible
        onClicked:      _guidedModeBar.rejectGuidedModeConfirm()
408 409
    }

410 411 412
    // Action confirmation control
    SliderSwitch {
        id:                         guidedModeConfirm
Don Gagne's avatar
Don Gagne committed
413 414
        anchors.bottomMargin:       _margins
        anchors.bottom:             parent.bottom
415 416 417
        anchors.horizontalCenter:   parent.horizontalCenter
        visible:                    false
        z:                          QGroundControl.zOrderWidgets
418
        fontPointSize:              _guidedModeBar._fontPointSize
419 420 421

        onAccept: {
            guidedModeConfirm.visible = false
Don Gagne's avatar
Don Gagne committed
422
            _guidedModeBar.visible = true
423 424
            _guidedModeBar.actionConfirmed()
            altitudeSlider.visible = false
Don Gagne's avatar
Don Gagne committed
425
            guidedModeHideTimer.restart()
Don Gagne's avatar
Don Gagne committed
426
        }
427

Don Gagne's avatar
Don Gagne committed
428
        onReject: _guidedModeBar.rejectGuidedModeConfirm()
429
    }
Don Gagne's avatar
Don Gagne committed
430 431 432 433 434 435 436 437 438 439 440 441 442

    //-- Altitude slider
    Rectangle {
        id:                 altitudeSlider
        anchors.margins:    _margins
        anchors.right:      parent.right
        anchors.top:        parent.top
        anchors.bottom:     parent.bottom
        color:              qgcPal.window
        width:              ScreenTools.defaultFontPixelWidth * 10
        opacity:            0.8
        visible:            false

443 444 445 446 447 448 449
        function setInitialValueMeters(meters) {
            altSlider.value = QGroundControl.metersToAppSettingsDistanceUnits(meters)
        }

        function setInitialValueAppSettingsDistanceUnits(height) {
            altSlider.value = height
        }
Don Gagne's avatar
Don Gagne committed
450 451 452

        /// Returns NaN for bad value
        function getValue() {
453 454 455 456 457 458
            var value =  parseFloat(altField.text)
            if (!isNaN(value)) {
                return QGroundControl.appSettingsDistanceUnitsToMeters(value);
            } else {
                return value;
            }
Don Gagne's avatar
Don Gagne committed
459 460 461 462 463 464 465 466 467 468 469
        }

        Column {
            id:                 headerColumn
            anchors.margins:    _margins
            anchors.top:        parent.top
            anchors.left:       parent.left
            anchors.right:      parent.right

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
470
                text: qsTr("Alt (rel)")
Don Gagne's avatar
Don Gagne committed
471 472 473 474
            }

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
475
                text: QGroundControl.appSettingsDistanceUnitsString
Don Gagne's avatar
Don Gagne committed
476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
            }

            QGCTextField {
                id:             altField
                anchors.left:   parent.left
                anchors.right:  parent.right
                text:           altSlider.value.toFixed(1)
            }
        }

        Slider {
            id:                 altSlider
            anchors.margins:    _margins
            anchors.top:        headerColumn.bottom
            anchors.bottom:     parent.bottom
            anchors.left:       parent.left
            anchors.right:      parent.right
            orientation:        Qt.Vertical
494 495
            minimumValue:       QGroundControl.metersToAppSettingsDistanceUnits(0)
            maximumValue:       QGroundControl.metersToAppSettingsDistanceUnits((_activeVehicle && _activeVehicle.flying) ? Math.round((_activeVehicle.altitudeRelative.value + 100) / 100) * 100 : 10)
Don Gagne's avatar
Don Gagne committed
496 497
        }
    }
498
}