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
        heading:                _heading
        rollAngle:              _roll
        pitchAngle:             _pitch
Don Gagne's avatar
Don Gagne committed
87 88
        groundSpeedFact:        _groundSpeedFact
        airSpeedFact:           _airSpeedFact
89
        lightBorders:           _lightWidgetBorders
90
        z:                      QGroundControl.zOrderWidgets
91
        qgcView:                _root.qgcView
92
        maxHeight:              parent.height - (anchors.margins * 2)
dogmaphobic's avatar
dogmaphobic committed
93 94
    }

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

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

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

139 140
        property real _fontPointSize: ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize

Don Gagne's avatar
Don Gagne committed
141 142 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
        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
177 178 179 180 181
            onTriggered: {
                if (ScreenTools.isShortScreen) {
                    _guidedModeBar.state = "Hidden"
                }
            }
Don Gagne's avatar
Don Gagne committed
182
        }
Don Gagne's avatar
Don Gagne committed
183 184 185 186 187 188 189 190 191

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

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

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

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

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

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

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

Don Gagne's avatar
Don Gagne committed
311
            Row {
Don Gagne's avatar
Don Gagne committed
312
                spacing: _margins * 2
Don Gagne's avatar
Don Gagne committed
313 314

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            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
453 454
            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
455 456
        }
    }
457
}