FlightDisplayViewWidgets.qml 20.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
import QtQuick                  2.3
import QtQuick.Controls         1.2
13
import QtQuick.Controls.Styles  1.4
14
import QtQuick.Dialogs          1.2
15 16
import QtLocation               5.3
import QtPositioning            5.3
17

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
            var useAlternateInstruments = QGroundControl.settingsManager.appSettings.virtualJoystick.value || ScreenTools.isTinyScreen
67 68 69 70 71
            if(useAlternateInstruments) {
                instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidgetAlternate.qml"
                instrumentsLoader.state  = "topMode"
            } else {
                instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidget.qml"
72
                instrumentsLoader.state  = QGroundControl.settingsManager.appSettings.showLargeCompass.value == 1 ? "centerMode" : "topMode"
73
            }
74 75 76 77
        }
    }

    Connections {
78 79
        target:         QGroundControl.settingsManager.appSettings.virtualJoystick
        onValueChanged: _setInstrumentWidget()
80 81
    }

82 83 84 85 86
    Connections {
        target:         QGroundControl.settingsManager.appSettings.showLargeCompass
        onValueChanged: _setInstrumentWidget()
    }

87 88 89 90
    Component.onCompleted: {
        _setInstrumentWidget()
    }

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

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

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

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

Don Gagne's avatar
Don Gagne committed
155 156 157
    //-- Guided mode buttons
    Rectangle {
        id:                         _guidedModeBar
Don Gagne's avatar
Don Gagne committed
158
        anchors.margins:            _barMargin
Don Gagne's avatar
Don Gagne committed
159 160
        anchors.bottom:             parent.bottom
        anchors.horizontalCenter:   parent.horizontalCenter
161
        width:                      guidedModeColumn.width  + (_margins * 2)
Don Gagne's avatar
Don Gagne committed
162
        height:                     guidedModeColumn.height + (_margins * 2)
163
        radius:                     ScreenTools.defaultFontPixelHeight * 0.25
164
        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
165 166
        visible:                    _activeVehicle
        z:                          QGroundControl.zOrderWidgets
Don Gagne's avatar
Don Gagne committed
167 168
        state:                      "Shown"

169 170
        property real _fontPointSize: ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize

Don Gagne's avatar
Don Gagne committed
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 204 205 206
        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
207
            onTriggered: {
Don Gagne's avatar
Don Gagne committed
208
                if (ScreenTools.isTinyScreen) {
209 210 211
                    _guidedModeBar.state = "Hidden"
                }
            }
Don Gagne's avatar
Don Gagne committed
212
        }
Don Gagne's avatar
Don Gagne committed
213 214 215 216 217 218 219 220 221

        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
222
        readonly property int confirmRetask:        9
223
        readonly property int confirmOrbit:         10
224
        readonly property int confirmAbort:         11
Don Gagne's avatar
Don Gagne committed
225 226

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

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

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

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

Don Gagne's avatar
Don Gagne committed
334 335
        Column {
            id:                 guidedModeColumn
Don Gagne's avatar
Don Gagne committed
336 337 338 339 340
            anchors.margins:    _margins
            anchors.top:        parent.top
            anchors.left:       parent.left
            spacing:            _margins

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

Don Gagne's avatar
Don Gagne committed
348
            Row {
Don Gagne's avatar
Don Gagne committed
349
                spacing: _margins * 2
Don Gagne's avatar
Don Gagne committed
350 351

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

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

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

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

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

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

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

Don Gagne's avatar
Don Gagne committed
403 404
            } // Row
        } // Column
405 406
    } // Rectangle - Guided mode buttons

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

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

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

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

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

446 447 448 449 450 451 452
        function setInitialValueMeters(meters) {
            altSlider.value = QGroundControl.metersToAppSettingsDistanceUnits(meters)
        }

        function setInitialValueAppSettingsDistanceUnits(height) {
            altSlider.value = height
        }
Don Gagne's avatar
Don Gagne committed
453 454 455

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

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

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
473
                text: qsTr("Alt (rel)")
Don Gagne's avatar
Don Gagne committed
474 475 476 477
            }

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

            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
497 498
            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
499 500
        }
    }
501
}