FlightDisplayViewWidgets.qml 18.8 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 18 19 20 21 22 23 24 25


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

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

Item {
26
    id: _root
27

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

33 34
    property var    _activeVehicle:             QGroundControl.multiVehicleManager.activeVehicle
    property bool   _isSatellite:               _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true
35
    property bool   _lightWidgetBorders:        _isSatellite
36 37
    property bool   _useAlternateInstruments:   QGroundControl.virtualTabletJoystick || ScreenTools.isTinyScreen

38
    readonly property real _margins:                ScreenTools.defaultFontPixelHeight / 2
dogmaphobic's avatar
dogmaphobic committed
39

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

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

Don Gagne's avatar
Don Gagne committed
51
    //-- Map warnings
52
    Column {
Don Gagne's avatar
Don Gagne committed
53 54 55 56 57 58
        anchors.horizontalCenter:   parent.horizontalCenter
        anchors.verticalCenter:     parent.verticalCenter
        spacing:                    ScreenTools.defaultFontPixelHeight

        QGCLabel {
            anchors.horizontalCenter:   parent.horizontalCenter
59
            visible:                    _activeVehicle && !_activeVehicle.coordinateValid && _mainIsMap
Don Gagne's avatar
Don Gagne committed
60 61
            z:                          QGroundControl.zOrderTopMost
            color:                      mapPal.text
62
            font.pointSize:             ScreenTools.largeFontPointSize
63
            text:                       qsTr("No GPS Lock for Vehicle")
Don Gagne's avatar
Don Gagne committed
64 65 66 67
        }

        QGCLabel {
            anchors.horizontalCenter:   parent.horizontalCenter
68
            visible:                    _activeVehicle && _activeVehicle.prearmError
Don Gagne's avatar
Don Gagne committed
69 70
            z:                          QGroundControl.zOrderTopMost
            color:                      mapPal.text
71
            font.pointSize:             ScreenTools.largeFontPointSize
Don Gagne's avatar
Don Gagne committed
72
            text:                       _activeVehicle ? _activeVehicle.prearmError : ""
73 74 75
        }
    }

dogmaphobic's avatar
dogmaphobic committed
76
    //-- Instrument Panel
77
    QGCInstrumentWidget {
78
        id:                     instrumentGadget
79
        anchors.margins:        ScreenTools.defaultFontPixelHeight / 2
Don Gagne's avatar
Don Gagne committed
80
        anchors.right:          altitudeSlider.visible ? altitudeSlider.left : parent.right
81
        anchors.verticalCenter: parent.verticalCenter
82
        visible:                !_useAlternateInstruments
83
        size:                   getGadgetWidth()
84 85 86 87
        active:                 _activeVehicle != null
        heading:                _heading
        rollAngle:              _roll
        pitchAngle:             _pitch
Don Gagne's avatar
Don Gagne committed
88 89
        groundSpeedFact:        _groundSpeedFact
        airSpeedFact:           _airSpeedFact
90
        lightBorders:           _lightWidgetBorders
91
        z:                      QGroundControl.zOrderWidgets
92
        qgcView:                _root.qgcView
93
        maxHeight:              parent.height - (anchors.margins * 2)
dogmaphobic's avatar
dogmaphobic committed
94 95
    }

96 97
    QGCInstrumentWidgetAlternate {
        id:                     instrumentGadgetAlternate
98
        anchors.margins:        ScreenTools.defaultFontPixelHeight / 2
99
        anchors.top:            parent.top
Don Gagne's avatar
Don Gagne committed
100
        anchors.right:          altitudeSlider.visible ? altitudeSlider.left : parent.right
101 102
        visible:                _useAlternateInstruments
        width:                  ScreenTools.isTinyScreen ? getGadgetWidth() * 1.5 : getGadgetWidth()
103 104 105 106 107 108
        active:                 _activeVehicle != null
        heading:                _heading
        rollAngle:              _roll
        pitchAngle:             _pitch
        groundSpeedFact:        _groundSpeedFact
        airSpeedFact:           _airSpeedFact
Don Gagne's avatar
Don Gagne committed
109 110 111
        lightBorders:           _lightWidgetBorders
        qgcView:                _root.qgcView
        maxHeight:              parent.height - (anchors.margins * 2)
112 113 114
        z:                      QGroundControl.zOrderWidgets
    }

Don Gagne's avatar
Don Gagne committed
115
    /*
116
    ValuesWidget {
117 118 119 120
        anchors.topMargin:          ScreenTools.defaultFontPixelHeight
        anchors.top:                instrumentGadgetAlternate.bottom
        anchors.horizontalCenter:   instrumentGadgetAlternate.horizontalCenter
        width:                      getGadgetWidth()
121
        qgcView:                    _root.qgcView
122 123 124
        textColor:                  _isSatellite ? "white" : "black"
        visible:                    _useAlternateInstruments
        maxHeight:                  virtualJoystickMultiTouch.visible ? virtualJoystickMultiTouch.y - y : parent.height - anchors.margins - y
Don Gagne's avatar
Don Gagne committed
125
    }*/
dogmaphobic's avatar
dogmaphobic committed
126

Don Gagne's avatar
Don Gagne committed
127 128 129
    //-- Guided mode buttons
    Rectangle {
        id:                         _guidedModeBar
Don Gagne's avatar
Don Gagne committed
130
        anchors.margins:            _barMargin
Don Gagne's avatar
Don Gagne committed
131 132
        anchors.bottom:             parent.bottom
        anchors.horizontalCenter:   parent.horizontalCenter
133
        width:                      guidedModeColumn.width  + (_margins * 2)
Don Gagne's avatar
Don Gagne committed
134
        height:                     guidedModeColumn.height + (_margins * 2)
135 136
        radius:                     ScreenTools.defaultFontPixelHeight * 0.25
        color:                      _lightWidgetBorders ? 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
137 138
        visible:                    _activeVehicle
        z:                          QGroundControl.zOrderWidgets
Don Gagne's avatar
Don Gagne committed
139 140
        state:                      "Shown"

141 142
        property real _fontPointSize: ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize

Don Gagne's avatar
Don Gagne committed
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
        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
179 180 181 182 183
            onTriggered: {
                if (ScreenTools.isShortScreen) {
                    _guidedModeBar.state = "Hidden"
                }
            }
Don Gagne's avatar
Don Gagne committed
184
        }
Don Gagne's avatar
Don Gagne committed
185 186 187 188 189 190 191 192 193

        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
194
        readonly property int confirmRetask:        9
195
        readonly property int confirmOrbit:         10
Don Gagne's avatar
Don Gagne committed
196 197

        property int    confirmActionCode
Don Gagne's avatar
Don Gagne committed
198 199 200
        property real   _showMargin:    _margins
        property real   _hideMargin:    _margins - _guidedModeBar.height
        property real   _barMargin:     _showMargin
Don Gagne's avatar
Don Gagne committed
201 202 203 204 205 206 207 208 209 210

        function actionConfirmed() {
            switch (confirmActionCode) {
            case confirmHome:
                _activeVehicle.guidedModeRTL()
                break;
            case confirmLand:
                _activeVehicle.guidedModeLand()
                break;
            case confirmTakeoff:
211 212 213
                var altitude1 = altitudeSlider.getValue()
                if (!isNaN(altitude1)) {
                    _activeVehicle.guidedModeTakeoff(altitude1)
Don Gagne's avatar
Don Gagne committed
214 215 216 217 218 219 220 221 222 223 224 225
                }
                break;
            case confirmArm:
                _activeVehicle.armed = true
                break;
            case confirmDisarm:
                _activeVehicle.armed = false
                break;
            case confirmEmergencyStop:
                _activeVehicle.emergencyStop()
                break;
            case confirmChangeAlt:
226 227 228
                var altitude2 = altitudeSlider.getValue()
                if (!isNaN(altitude2)) {
                    _activeVehicle.guidedModeChangeAltitude(altitude2)
Don Gagne's avatar
Don Gagne committed
229 230 231 232 233
                }
                break;
            case confirmGoTo:
                _activeVehicle.guidedModeGotoLocation(_flightMap._gotoHereCoordinate)
                break;
234 235 236
            case confirmRetask:
                _activeVehicle.setCurrentMissionSequence(_flightMap._retaskSequence)
                break;
237 238 239 240 241 242
            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
243
            default:
244
                console.warn(qsTr("Internal error: unknown confirmActionCode"), confirmActionCode)
Don Gagne's avatar
Don Gagne committed
245 246 247
            }
        }

248 249
        function rejectGuidedModeConfirm() {
            guidedModeConfirm.visible = false
Don Gagne's avatar
Don Gagne committed
250
            _guidedModeBar.visible = true
251 252
            altitudeSlider.visible = false
            _flightMap._gotoHereCoordinate = QtPositioning.coordinate()
Don Gagne's avatar
Don Gagne committed
253
            guidedModeHideTimer.restart()
254 255
        }

Don Gagne's avatar
Don Gagne committed
256
        function confirmAction(actionCode) {
Don Gagne's avatar
Don Gagne committed
257
            guidedModeHideTimer.stop()
Don Gagne's avatar
Don Gagne committed
258 259 260
            confirmActionCode = actionCode
            switch (confirmActionCode) {
            case confirmArm:
261
                guidedModeConfirm.confirmText = qsTr("arm")
Don Gagne's avatar
Don Gagne committed
262 263
                break;
            case confirmDisarm:
264
                guidedModeConfirm.confirmText = qsTr("disarm")
Don Gagne's avatar
Don Gagne committed
265 266
                break;
            case confirmEmergencyStop:
267
                guidedModeConfirm.confirmText = qsTr("STOP ALL MOTORS!")
Don Gagne's avatar
Don Gagne committed
268 269 270
                break;
            case confirmTakeoff:
                altitudeSlider.visible = true
271
                altitudeSlider.setInitialValueMeters(3)
272
                guidedModeConfirm.confirmText = qsTr("takeoff")
Don Gagne's avatar
Don Gagne committed
273 274
                break;
            case confirmLand:
275
                guidedModeConfirm.confirmText = qsTr("land")
Don Gagne's avatar
Don Gagne committed
276
                break;
Don Gagne's avatar
Don Gagne committed
277
            case confirmHome:
278
                guidedModeConfirm.confirmText = qsTr("return to land")
Don Gagne's avatar
Don Gagne committed
279
                break;
Don Gagne's avatar
Don Gagne committed
280 281
            case confirmChangeAlt:
                altitudeSlider.visible = true
282
                altitudeSlider.setInitialValueAppSettingsDistanceUnits(_activeVehicle.altitudeRelative.value)
283
                guidedModeConfirm.confirmText = qsTr("change altitude")
Don Gagne's avatar
Don Gagne committed
284 285
                break;
            case confirmGoTo:
286
                guidedModeConfirm.confirmText = qsTr("move vehicle")
Don Gagne's avatar
Don Gagne committed
287
                break;
288
            case confirmRetask:
289
                guidedModeConfirm.confirmText = qsTr("active waypoint change")
290
                break;
291 292 293
            case confirmOrbit:
                guidedModeConfirm.confirmText = qsTr("enter orbit mode")
                break;
Don Gagne's avatar
Don Gagne committed
294
            }
Don Gagne's avatar
Don Gagne committed
295
            _guidedModeBar.visible = false
Don Gagne's avatar
Don Gagne committed
296 297 298
            guidedModeConfirm.visible = true
        }

Don Gagne's avatar
Don Gagne committed
299 300
        Column {
            id:                 guidedModeColumn
Don Gagne's avatar
Don Gagne committed
301 302 303 304 305
            anchors.margins:    _margins
            anchors.top:        parent.top
            anchors.left:       parent.left
            spacing:            _margins

306 307
            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
Don Gagne's avatar
Don Gagne committed
308
                color:      _lightWidgetBorders ? qgcPal.mapWidgetBorderDark : qgcPal.mapWidgetBorderLight
309
                text:       "Click in map to move vehicle"
310
                visible:    gotoEnabled
311 312
            }

Don Gagne's avatar
Don Gagne committed
313
            Row {
Don Gagne's avatar
Don Gagne committed
314
                spacing: _margins * 2
Don Gagne's avatar
Don Gagne committed
315 316

                QGCButton {
317
                    pointSize:  _guidedModeBar._fontPointSize
318
                    text:       (_activeVehicle && _activeVehicle.armed) ? (_activeVehicle.flying ? qsTr("Emergency Stop") : qsTr("Disarm")) :  qsTr("Arm")
Don Gagne's avatar
Don Gagne committed
319
                    visible:    _activeVehicle
Don Gagne's avatar
Don Gagne committed
320
                    onClicked:  _guidedModeBar.confirmAction(_activeVehicle.armed ? (_activeVehicle.flying ? _guidedModeBar.confirmEmergencyStop : _guidedModeBar.confirmDisarm) : _guidedModeBar.confirmArm)
321
                }
Don Gagne's avatar
Don Gagne committed
322

Don Gagne's avatar
Don Gagne committed
323
                QGCButton {
324
                    pointSize:  _guidedModeBar._fontPointSize
325
                    text:       qsTr("RTL")
326
                    visible:    (_activeVehicle && _activeVehicle.armed) && _activeVehicle.guidedModeSupported && _activeVehicle.flying
Don Gagne's avatar
Don Gagne committed
327
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmHome)
328
                }
Don Gagne's avatar
Don Gagne committed
329

Don Gagne's avatar
Don Gagne committed
330
                QGCButton {
331
                    pointSize:  _guidedModeBar._fontPointSize
332
                    text:       (_activeVehicle && _activeVehicle.flying) ?  qsTr("Land"):  qsTr("Takeoff")
333
                    visible:    _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed
Don Gagne's avatar
Don Gagne committed
334
                    onClicked:  _guidedModeBar.confirmAction(_activeVehicle.flying ? _guidedModeBar.confirmLand : _guidedModeBar.confirmTakeoff)
335
                }
Don Gagne's avatar
Don Gagne committed
336

Don Gagne's avatar
Don Gagne committed
337
                QGCButton {
338
                    pointSize:  _guidedModeBar._fontPointSize
339
                    text:       qsTr("Pause")
340
                    visible:    (_activeVehicle && _activeVehicle.armed) && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying
Don Gagne's avatar
Don Gagne committed
341 342
                    onClicked:  {
                        guidedModeHideTimer.restart()
343 344 345
                        _activeVehicle.pauseVehicle()
                    }
                }
Don Gagne's avatar
Don Gagne committed
346

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

                QGCButton {
                    pointSize:  _guidedModeBar._fontPointSize
                    text:       qsTr("Orbit")
357
                    visible:    (_activeVehicle && _activeVehicle.flying) && _activeVehicle.orbitModeSupported && _activeVehicle.armed
358 359 360
                    onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmOrbit)
                }

Don Gagne's avatar
Don Gagne committed
361 362
            } // Row
        } // Column
363 364
    } // Rectangle - Guided mode buttons

365
    MouseArea {
Don Gagne's avatar
Don Gagne committed
366 367 368
        anchors.fill:   parent
        enabled:        guidedModeConfirm.visible
        onClicked:      _guidedModeBar.rejectGuidedModeConfirm()
369 370
    }

371 372 373
    // Action confirmation control
    SliderSwitch {
        id:                         guidedModeConfirm
Don Gagne's avatar
Don Gagne committed
374 375
        anchors.bottomMargin:       _margins
        anchors.bottom:             parent.bottom
376 377 378
        anchors.horizontalCenter:   parent.horizontalCenter
        visible:                    false
        z:                          QGroundControl.zOrderWidgets
379
        fontPointSize:              _guidedModeBar._fontPointSize
380 381 382

        onAccept: {
            guidedModeConfirm.visible = false
Don Gagne's avatar
Don Gagne committed
383
            _guidedModeBar.visible = true
384 385
            _guidedModeBar.actionConfirmed()
            altitudeSlider.visible = false
Don Gagne's avatar
Don Gagne committed
386
            guidedModeHideTimer.restart()
Don Gagne's avatar
Don Gagne committed
387
        }
388

Don Gagne's avatar
Don Gagne committed
389
        onReject: _guidedModeBar.rejectGuidedModeConfirm()
390
    }
Don Gagne's avatar
Don Gagne committed
391 392 393 394 395 396 397 398 399 400 401 402 403

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

404 405 406 407 408 409 410
        function setInitialValueMeters(meters) {
            altSlider.value = QGroundControl.metersToAppSettingsDistanceUnits(meters)
        }

        function setInitialValueAppSettingsDistanceUnits(height) {
            altSlider.value = height
        }
Don Gagne's avatar
Don Gagne committed
411 412 413

        /// Returns NaN for bad value
        function getValue() {
414 415 416 417 418 419
            var value =  parseFloat(altField.text)
            if (!isNaN(value)) {
                return QGroundControl.appSettingsDistanceUnitsToMeters(value);
            } else {
                return value;
            }
Don Gagne's avatar
Don Gagne committed
420 421 422 423 424 425 426 427 428 429 430
        }

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

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
431
                text: qsTr("Alt (rel)")
Don Gagne's avatar
Don Gagne committed
432 433 434 435
            }

            QGCLabel {
                anchors.horizontalCenter: parent.horizontalCenter
436
                text: QGroundControl.appSettingsDistanceUnitsString
Don Gagne's avatar
Don Gagne committed
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
            }

            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
Don Gagne's avatar
Don Gagne committed
455 456
            minimumValue:       QGroundControl.metersToAppSettingsDistanceUnits(2)
            maximumValue:       QGroundControl.metersToAppSettingsDistanceUnits((_activeVehicle && _activeVehicle.flying) ? 100 : 10)
Don Gagne's avatar
Don Gagne committed
457 458
        }
    }
459
}