FlightDisplayViewWidgets.qml 19.3 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
Don Gagne's avatar
Don Gagne committed
221 222

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

        function actionConfirmed() {
            switch (confirmActionCode) {
            case confirmHome:
                _activeVehicle.guidedModeRTL()
                break;
            case confirmLand:
                _activeVehicle.guidedModeLand()
                break;
            case confirmTakeoff:
236 237 238
                var altitude1 = altitudeSlider.getValue()
                if (!isNaN(altitude1)) {
                    _activeVehicle.guidedModeTakeoff(altitude1)
Don Gagne's avatar
Don Gagne committed
239 240 241 242 243 244 245 246 247 248 249 250
                }
                break;
            case confirmArm:
                _activeVehicle.armed = true
                break;
            case confirmDisarm:
                _activeVehicle.armed = false
                break;
            case confirmEmergencyStop:
                _activeVehicle.emergencyStop()
                break;
            case confirmChangeAlt:
251 252 253
                var altitude2 = altitudeSlider.getValue()
                if (!isNaN(altitude2)) {
                    _activeVehicle.guidedModeChangeAltitude(altitude2)
Don Gagne's avatar
Don Gagne committed
254 255 256 257 258
                }
                break;
            case confirmGoTo:
                _activeVehicle.guidedModeGotoLocation(_flightMap._gotoHereCoordinate)
                break;
259 260 261
            case confirmRetask:
                _activeVehicle.setCurrentMissionSequence(_flightMap._retaskSequence)
                break;
262 263 264 265 266 267
            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;
Don Gagne's avatar
Don Gagne committed
268
            default:
269
                console.warn(qsTr("Internal error: unknown confirmActionCode"), confirmActionCode)
Don Gagne's avatar
Don Gagne committed
270 271 272
            }
        }

273 274
        function rejectGuidedModeConfirm() {
            guidedModeConfirm.visible = false
Don Gagne's avatar
Don Gagne committed
275
            _guidedModeBar.visible = true
276 277
            altitudeSlider.visible = false
            _flightMap._gotoHereCoordinate = QtPositioning.coordinate()
Don Gagne's avatar
Don Gagne committed
278
            guidedModeHideTimer.restart()
279 280
        }

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

Don Gagne's avatar
Don Gagne committed
324 325
        Column {
            id:                 guidedModeColumn
Don Gagne's avatar
Don Gagne committed
326 327 328 329 330
            anchors.margins:    _margins
            anchors.top:        parent.top
            anchors.left:       parent.left
            spacing:            _margins

331 332
            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
333
                color:      _isSatellite ? qgcPal.mapWidgetBorderDark : qgcPal.mapWidgetBorderLight
334
                text:       "Click in map to move vehicle"
335
                visible:    gotoEnabled
336 337
            }

Don Gagne's avatar
Don Gagne committed
338
            Row {
Don Gagne's avatar
Don Gagne committed
339
                spacing: _margins * 2
Don Gagne's avatar
Don Gagne committed
340 341

                QGCButton {
342
                    pointSize:  _guidedModeBar._fontPointSize
343
                    text:       (_activeVehicle && _activeVehicle.armed) ? (_activeVehicle.flying ? qsTr("Emergency Stop") : qsTr("Disarm")) :  qsTr("Arm")
Don Gagne's avatar
Don Gagne committed
344
                    visible:    _activeVehicle
Don Gagne's avatar
Don Gagne committed
345
                    onClicked:  _guidedModeBar.confirmAction(_activeVehicle.armed ? (_activeVehicle.flying ? _guidedModeBar.confirmEmergencyStop : _guidedModeBar.confirmDisarm) : _guidedModeBar.confirmArm)
346
                }
Don Gagne's avatar
Don Gagne committed
347

Don Gagne's avatar
Don Gagne committed
348
                QGCButton {
349
                    pointSize:  _guidedModeBar._fontPointSize
350
                    text:       qsTr("RTL")
351
                    visible:    (_activeVehicle && _activeVehicle.armed) && _activeVehicle.guidedModeSupported && _activeVehicle.flying
Don Gagne's avatar
Don Gagne committed
352
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmHome)
353
                }
Don Gagne's avatar
Don Gagne committed
354

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

Don Gagne's avatar
Don Gagne committed
362
                QGCButton {
363
                    pointSize:  _guidedModeBar._fontPointSize
364
                    text:       qsTr("Pause")
365
                    visible:    (_activeVehicle && _activeVehicle.armed) && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying
Don Gagne's avatar
Don Gagne committed
366 367
                    onClicked:  {
                        guidedModeHideTimer.restart()
368 369 370
                        _activeVehicle.pauseVehicle()
                    }
                }
Don Gagne's avatar
Don Gagne committed
371

Don Gagne's avatar
Don Gagne committed
372
                QGCButton {
373
                    pointSize:  _guidedModeBar._fontPointSize
374
                    text:       qsTr("Change Altitude")
375
                    visible:    (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed
Don Gagne's avatar
Don Gagne committed
376
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmChangeAlt)
377
                }
378 379 380 381

                QGCButton {
                    pointSize:  _guidedModeBar._fontPointSize
                    text:       qsTr("Orbit")
382
                    visible:    (_activeVehicle && _activeVehicle.flying) && _activeVehicle.orbitModeSupported && _activeVehicle.armed
383 384 385
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmOrbit)
                }

Don Gagne's avatar
Don Gagne committed
386 387
            } // Row
        } // Column
388 389
    } // Rectangle - Guided mode buttons

390
    MouseArea {
Don Gagne's avatar
Don Gagne committed
391 392 393
        anchors.fill:   parent
        enabled:        guidedModeConfirm.visible
        onClicked:      _guidedModeBar.rejectGuidedModeConfirm()
394 395
    }

396 397 398
    // Action confirmation control
    SliderSwitch {
        id:                         guidedModeConfirm
Don Gagne's avatar
Don Gagne committed
399 400
        anchors.bottomMargin:       _margins
        anchors.bottom:             parent.bottom
401 402 403
        anchors.horizontalCenter:   parent.horizontalCenter
        visible:                    false
        z:                          QGroundControl.zOrderWidgets
404
        fontPointSize:              _guidedModeBar._fontPointSize
405 406 407

        onAccept: {
            guidedModeConfirm.visible = false
Don Gagne's avatar
Don Gagne committed
408
            _guidedModeBar.visible = true
409 410
            _guidedModeBar.actionConfirmed()
            altitudeSlider.visible = false
Don Gagne's avatar
Don Gagne committed
411
            guidedModeHideTimer.restart()
Don Gagne's avatar
Don Gagne committed
412
        }
413

Don Gagne's avatar
Don Gagne committed
414
        onReject: _guidedModeBar.rejectGuidedModeConfirm()
415
    }
Don Gagne's avatar
Don Gagne committed
416 417 418 419 420 421 422 423 424 425 426 427 428

    //-- 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

429 430 431 432 433 434 435
        function setInitialValueMeters(meters) {
            altSlider.value = QGroundControl.metersToAppSettingsDistanceUnits(meters)
        }

        function setInitialValueAppSettingsDistanceUnits(height) {
            altSlider.value = height
        }
Don Gagne's avatar
Don Gagne committed
436 437 438

        /// Returns NaN for bad value
        function getValue() {
439 440 441 442 443 444
            var value =  parseFloat(altField.text)
            if (!isNaN(value)) {
                return QGroundControl.appSettingsDistanceUnitsToMeters(value);
            } else {
                return value;
            }
Don Gagne's avatar
Don Gagne committed
445 446 447 448 449 450 451 452 453 454 455
        }

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

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
456
                text: qsTr("Alt (rel)")
Don Gagne's avatar
Don Gagne committed
457 458 459 460
            }

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
461
                text: QGroundControl.appSettingsDistanceUnitsString
Don Gagne's avatar
Don Gagne committed
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479
            }

            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
480 481
            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
482 483
        }
    }
484
}