SafetyComponent.qml 30.1 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


Don Gagne's avatar
Don Gagne committed
11 12 13 14 15
import QtQuick                  2.5
import QtQuick.Controls         1.2
import QtQuick.Controls.Styles  1.2
import QtQuick.Layouts          1.2
import QtGraphicalEffects       1.0
16

Don Gagne's avatar
Don Gagne committed
17 18 19 20 21
import QGroundControl.FactSystem    1.0
import QGroundControl.FactControls  1.0
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.ScreenTools   1.0
Don Gagne's avatar
Don Gagne committed
22

Don Gagne's avatar
Don Gagne committed
23

dogmaphobic's avatar
dogmaphobic committed
24
QGCView {
Don Gagne's avatar
Don Gagne committed
25 26 27
    id:             _safetyView
    viewPanel:      panel
    anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
28

dogmaphobic's avatar
dogmaphobic committed
29
    FactPanelController { id: controller; factPanel: panel }
Don Gagne's avatar
Don Gagne committed
30

dogmaphobic's avatar
dogmaphobic committed
31
    QGCPalette { id: palette; colorGroupEnabled: enabled }
Don Gagne's avatar
Don Gagne committed
32

33
    property real _margins:         ScreenTools.defaultFontPixelHeight
34 35
    property real _middleRowWidth:  ScreenTools.defaultFontPixelWidth * 20
    property real _editFieldWidth:  ScreenTools.defaultFontPixelWidth * 14
Don Gagne's avatar
Don Gagne committed
36

Don Gagne's avatar
Don Gagne committed
37 38 39 40
    property Fact _fenceAction:     controller.getParameterFact(-1, "GF_ACTION")
    property Fact _fenceRadius:     controller.getParameterFact(-1, "GF_MAX_HOR_DIST")
    property Fact _fenceAlt:        controller.getParameterFact(-1, "GF_MAX_VER_DIST")
    property Fact _rtlLandDelay:    controller.getParameterFact(-1, "RTL_LAND_DELAY")
41 42
    property Fact _lowBattAction:   controller.getParameterFact(-1, "COM_LOW_BAT_ACT")
    property Fact _rcLossAction:    controller.getParameterFact(-1, "NAV_RCL_ACT")
43
    property Fact _dlLossAction:    controller.getParameterFact(-1, "NAV_DLL_ACT")
44
    property Fact _disarmLandDelay: controller.getParameterFact(-1, "COM_DISARM_LAND")
45
    property Fact _landSpeedMC:     controller.getParameterFact(-1, "MPC_LAND_SPEED", false)
dogmaphobic's avatar
dogmaphobic committed
46

Don Gagne's avatar
Don Gagne committed
47 48
    property bool _showIcons: !ScreenTools.isTinyScreen

dogmaphobic's avatar
dogmaphobic committed
49 50 51
    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
Don Gagne's avatar
Don Gagne committed
52
        QGCFlickable {
53
            clip:                                       true
54
            anchors.fill:   parent
55 56
            contentHeight:                              mainCol.height
            flickableDirection:                         Flickable.VerticalFlick
57
            Column {
58 59
                id:                                     mainCol
                spacing:                                _margins
60
                anchors.horizontalCenter:               parent.horizontalCenter
61 62 63 64
                /*
                   **** Low Battery ****
                */
                Item { width: 1; height: _margins * 0.5; }
65
                QGCLabel {
66
                    text:                               qsTr("Low Battery Failsafe Trigger")
67
                    font.family:                        ScreenTools.demiboldFontFamily
68 69
                }
                Rectangle {
70 71 72
                    color:                              palette.windowShade
                    width:                              rtlSettings.width
                    height:                             lowBattRow.height + _margins * 2
73
                    Row {
74 75 76 77 78 79 80
                        id:                             lowBattRow
                        spacing:                        _margins
                        anchors.verticalCenter:         parent.verticalCenter
                        Item { width: _margins * 0.5; height: 1; }
                        Image {
                            height:                     ScreenTools.defaultFontPixelWidth * 6
                            width:                      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
81
                            sourceSize.width:           width
82 83 84 85
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/LowBatteryLight.svg" : "/qmlimages/LowBattery.svg"
                            anchors.verticalCenter:     parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
86 87 88 89 90 91
                            visible:                    _showIcons
                        }
                        Item {
                            width:      _margins * 0.5
                            height:     1
                            visible:    _showIcons
92
                        }
93 94 95 96 97 98 99
                        Column {
                            spacing:                    _margins * 0.5
                            anchors.verticalCenter:     parent.verticalCenter
                            Row {
                                QGCLabel {
                                    anchors.baseline:   lowBattCombo.baseline
                                    width:              _middleRowWidth
100
                                    text:               qsTr("Failsafe Action:")
101 102 103 104 105
                                }
                                FactComboBox {
                                    id:                 lowBattCombo
                                    width:              _editFieldWidth
                                    fact:               _lowBattAction
106
                                    indexModel:         false
107 108 109 110 111 112
                                }
                            }
                            Row {
                                QGCLabel {
                                    anchors.baseline:   batLowLevelField.baseline
                                    width:              _middleRowWidth
113
                                    text:               qsTr("Battery Warn Level:")
114 115 116
                                }
                                FactTextField {
                                    id:                 batLowLevelField
117
                                    fact:               controller.getParameterFact(-1, "BAT_LOW_THR")
118 119 120 121
                                    showUnits:          true
                                    width:              _editFieldWidth
                                }
                            }
122 123
                            Row {
                                QGCLabel {
dogmaphobic's avatar
dogmaphobic committed
124
                                    anchors.baseline:   batCritLevelField.baseline
125 126 127 128 129 130 131 132 133 134
                                    width:              _middleRowWidth
                                    text:               qsTr("Battery Failsafe Level:")
                                }
                                FactTextField {
                                    id:                 batCritLevelField
                                    fact:               controller.getParameterFact(-1, "BAT_CRIT_THR")
                                    showUnits:          true
                                    width:              _editFieldWidth
                                }
                            }
135
                        }
136 137 138 139 140 141
                    }
                }
                /*
                   **** RC Loss ****
                */
                QGCLabel {
142
                    text:                               qsTr("RC Loss Failsafe Trigger")
143
                    font.family:                        ScreenTools.demiboldFontFamily
144 145 146 147 148 149 150 151 152 153 154 155 156
                }
                Rectangle {
                    color:                              palette.windowShade
                    width:                              rtlSettings.width
                    height:                             rcLossRow.height + _margins * 2
                    Row {
                        id:                             rcLossRow
                        spacing:                        _margins
                        anchors.verticalCenter:         parent.verticalCenter
                        Item { width: _margins * 0.5; height: 1; }
                        Image {
                            height:                     ScreenTools.defaultFontPixelWidth * 6
                            width:                      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
157
                            sourceSize.width:           width
158 159 160 161
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/RCLossLight.svg" : "/qmlimages/RCLoss.svg"
                            anchors.verticalCenter:     parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
162 163 164 165 166 167
                            visible:                    _showIcons
                        }
                        Item {
                            width:      _margins * 0.5
                            height:     1
                            visible:    _showIcons
168 169
                        }
                        Column {
170 171 172 173 174 175
                            spacing:                    _margins * 0.5
                            anchors.verticalCenter:     parent.verticalCenter
                            Row {
                                QGCLabel {
                                    anchors.baseline:   rcLossCombo.baseline
                                    width:              _middleRowWidth
176
                                    text:               qsTr("Failsafe Action:")
177 178 179 180 181
                                }
                                FactComboBox {
                                    id:                 rcLossCombo
                                    width:              _editFieldWidth
                                    fact:               _rcLossAction
182
                                    indexModel:         false
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
                                }
                            }
                            Row {
                                QGCLabel {
                                    anchors.baseline:   rcLossField.baseline
                                    width:              _middleRowWidth
                                    text:               qsTr("RC Loss Timeout:")
                                }
                                FactTextField {
                                    id:                 rcLossField
                                    fact:               controller.getParameterFact(-1, "COM_RC_LOSS_T")
                                    showUnits:          true
                                    width:              _editFieldWidth
                                }
                            }
198 199 200 201 202 203 204
                        }
                    }
                }
                /*
                   **** Data Link Loss ****
                */
                QGCLabel {
205
                    text:                               qsTr("Data Link Loss Failsafe Trigger")
206
                    font.family:                        ScreenTools.demiboldFontFamily
207 208 209 210 211 212 213 214 215 216 217 218 219
                }
                Rectangle {
                    color:                              palette.windowShade
                    width:                              rtlSettings.width
                    height:                             dlLossRow.height + _margins * 2
                    Row {
                        id:                             dlLossRow
                        spacing:                        _margins
                        anchors.verticalCenter:         parent.verticalCenter
                        Item { width: _margins * 0.5; height: 1; }
                        Image {
                            height:                     ScreenTools.defaultFontPixelWidth * 6
                            width:                      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
220
                            sourceSize.width:           width
221 222 223 224
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/DatalinkLossLight.svg" : "/qmlimages/DatalinkLoss.svg"
                            anchors.verticalCenter:     parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
225 226 227 228 229 230
                            visible:                    _showIcons
                        }
                        Item {
                            width:      _margins * 0.5
                            height:     1
                            visible:    _showIcons
231 232 233 234
                        }
                        Column {
                            spacing:                    _margins * 0.5
                            anchors.verticalCenter:     parent.verticalCenter
235 236
                            Row {
                                QGCLabel {
237
                                    anchors.baseline:   dlLossCombo.baseline
238
                                    width:              _middleRowWidth
239
                                    text:               qsTr("Failsafe Action:")
240 241 242 243 244 245 246 247 248 249 250 251 252
                                }
                                FactComboBox {
                                    id:                 dlLossCombo
                                    width:              _editFieldWidth
                                    fact:               _dlLossAction
                                    indexModel:         false
                                }
                            }
                            Row {
                                QGCLabel {
                                    anchors.baseline:   dlLossField.baseline
                                    width:              _middleRowWidth
                                    text:               qsTr("Data Link Loss Timeout:")
253 254
                                }
                                FactTextField {
255 256
                                    id:                 dlLossField
                                    fact:               controller.getParameterFact(-1, "COM_DL_LOSS_T")
257
                                    showUnits:          true
258
                                    width:              _editFieldWidth
259 260 261 262 263 264 265 266 267
                                }
                            }
                        }
                    }
                }
                /*
                   **** Geofence ****
                */
                QGCLabel {
268
                    text:                               qsTr("Geofence Failsafe Trigger")
269
                    font.family:                        ScreenTools.demiboldFontFamily
270 271 272 273 274 275 276 277 278 279 280 281 282
                }
                Rectangle {
                    color:                              palette.windowShade
                    width:                              rtlSettings.width
                    height:                             geofenceRow.height + _margins * 2
                    Row {
                        id:                             geofenceRow
                        spacing:                        _margins
                        anchors.verticalCenter:         parent.verticalCenter
                        Item { width: _margins * 0.5; height: 1; }
                        Image {
                            height:                     ScreenTools.defaultFontPixelWidth * 8
                            width:                      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
283
                            sourceSize.width:           width
284 285 286 287
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     qgcPal.globalTheme === QGCPalette.Light ? "/qmlimages/GeoFenceLight.svg" : "/qmlimages/GeoFence.svg"
                            anchors.verticalCenter:     parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
288 289 290 291 292 293
                            visible:                    _showIcons
                        }
                        Item {
                            width:      _margins * 0.5
                            height:     1
                            visible:    _showIcons
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
                        }
                        Column {
                            spacing:                    _margins * 0.5
                            anchors.verticalCenter:     parent.verticalCenter
                            Row {
                                QGCLabel {
                                    id:                 fenceActionLabel
                                    anchors.baseline:   fenceActionCombo.baseline
                                    text:               qsTr("Action on breach:")
                                    width:              _middleRowWidth
                                }
                                FactComboBox {
                                    id:                 fenceActionCombo
                                    width:              _editFieldWidth
                                    fact:               _fenceAction
309
                                    indexModel:         false
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
                                }
                            }
                            Row {
                                QGCCheckBox {
                                    id:                 fenceRadiusCheckBox
                                    anchors.baseline:   fenceRadiusField.baseline
                                    text:               qsTr("Max radius:")
                                    checked:            _fenceRadius.value >= 0
                                    onClicked:          _fenceRadius.value = checked ? 100 : -1
                                    width:              _middleRowWidth
                                }
                                FactTextField {
                                    id:                 fenceRadiusField
                                    showUnits:          true
                                    fact:               _fenceRadius
                                    enabled:            fenceRadiusCheckBox.checked
                                    width:              _editFieldWidth
                                }
                            }
                            Row {
                                QGCCheckBox {
                                    id:                 fenceAltMaxCheckBox
                                    anchors.baseline:   fenceAltMaxField.baseline
                                    text:               qsTr("Max altitude:")
                                    checked:            _fenceAlt.value >= 0
                                    onClicked:          _fenceAlt.value = checked ? 100 : -1
                                    width:              _middleRowWidth
                                }
                                FactTextField {
                                    id:                 fenceAltMaxField
                                    showUnits:          true
                                    fact:               _fenceAlt
                                    enabled:            fenceAltMaxCheckBox.checked
                                    width:              _editFieldWidth
                                }
                            }
                        }
                    }
                }
                /*
                   **** Return Home Settings ****
                */
                QGCLabel {
                    id:                                 rtlLabel
                    text:                               qsTr("Return Home Settings")
355
                    font.family:                        ScreenTools.demiboldFontFamily
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
                }
                Rectangle {
                    id:                                 rtlSettings
                    color:                              palette.windowShade
                    width:                              rtlRow.width  + _margins * 2
                    height:                             rtlRow.height + _margins * 2
                    Row {
                        id:                             rtlRow
                        spacing:                        _margins
                        anchors.verticalCenter:         parent.verticalCenter
                        Item { width: _margins * 0.5; height: 1; }
                        QGCColoredImage {
                            id:                         icon
                            color:                      palette.text
                            height:                     ScreenTools.defaultFontPixelWidth * 10
                            width:                      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
372
                            sourceSize.width:           width
373 374
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
375
                            source:                     controller.vehicle.fixedWing ? "/qmlimages/ReturnToHomeAltitude.svg" : "/qmlimages/ReturnToHomeAltitudeCopter.svg"
376
                            anchors.verticalCenter:     parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
377 378 379 380 381 382
                            visible:                    _showIcons
                        }
                        Item {
                            width:      _margins * 0.5
                            height:     1
                            visible:    _showIcons
383 384 385
                        }
                        Column {
                            spacing:                    _margins * 0.5
386 387 388 389
                            Row {
                                QGCLabel {
                                    id:                 climbLabel
                                    anchors.baseline:   climbField.baseline
390
                                    width:              _middleRowWidth
391 392 393 394 395 396
                                    text:               qsTr("Climb to altitude of:")
                                }
                                FactTextField {
                                    id:                 climbField
                                    fact:               controller.getParameterFact(-1, "RTL_RETURN_ALT")
                                    showUnits:          true
397
                                    width:              _editFieldWidth
398 399
                                }
                            }
400
                            Item { width: 1; height: _margins * 0.5; }
401
                            QGCLabel {
402 403
                                id:                     returnHomeLabel
                                text:                   "Return home, then:"
404 405
                            }
                            Row {
406
                                Item { height: 1; width: _margins; }
407 408 409 410
                                Column {
                                    spacing:            _margins * 0.5
                                    ExclusiveGroup { id: homeLoiterGroup }
                                    QGCRadioButton {
411 412 413 414 415
                                        id:             homeLandRadio
                                        checked:        _rtlLandDelay.value === 0
                                        exclusiveGroup: homeLoiterGroup
                                        text:           "Land immediately"
                                        onClicked:      _rtlLandDelay.value = 0
416 417
                                    }
                                    QGCRadioButton {
418 419 420 421 422
                                        id:             homeLoiterNoLandRadio
                                        checked:        _rtlLandDelay.value < 0
                                        exclusiveGroup: homeLoiterGroup
                                        text:           "Loiter and do not land"
                                        onClicked:      _rtlLandDelay.value = -1
423 424
                                    }
                                    QGCRadioButton {
425 426 427 428 429
                                        id:             homeLoiterLandRadio
                                        checked:        _rtlLandDelay.value > 0
                                        exclusiveGroup: homeLoiterGroup
                                        text:           qsTr("Loiter and land after specified time")
                                        onClicked:      _rtlLandDelay.value = 60
430 431 432
                                    }
                                }
                            }
433
                            Item { width: 1; height: _margins * 0.5; }
434 435 436
                            Row {
                                QGCLabel {
                                    text:               qsTr("Loiter Time")
437
                                    width:              _middleRowWidth
438 439 440 441 442 443 444 445 446
                                    anchors.baseline:   landDelayField.baseline
                                    color:              palette.text
                                    enabled:            homeLoiterLandRadio.checked === true
                                }
                                FactTextField {
                                    id:                 landDelayField
                                    fact:               controller.getParameterFact(-1, "RTL_LAND_DELAY")
                                    showUnits:          true
                                    enabled:            homeLoiterLandRadio.checked === true
447
                                    width:              _editFieldWidth
448 449 450 451 452
                                }
                            }
                            Row {
                                QGCLabel {
                                    text:               qsTr("Loiter Altitude")
453
                                    width:              _middleRowWidth
454 455
                                    anchors.baseline:   descendField.baseline
                                    color:              palette.text
456
                                    enabled:            homeLoiterLandRadio.checked === true || homeLoiterNoLandRadio.checked === true
457 458 459 460
                                }
                                FactTextField {
                                    id:                 descendField
                                    fact:               controller.getParameterFact(-1, "RTL_DESCEND_ALT")
461
                                    enabled:            homeLoiterLandRadio.checked === true || homeLoiterNoLandRadio.checked === true
462
                                    showUnits:          true
463
                                    width:              _editFieldWidth
464 465 466 467 468
                                }
                            }
                        }
                    }
                }
469 470 471
                /*
                   **** Land Mode Settings ****
                */
472
                QGCLabel {
473
                    text:                               qsTr("Land Mode Settings")
474
                    font.family:                        ScreenTools.demiboldFontFamily
475 476
                }
                Rectangle {
477 478 479
                    color:                              palette.windowShade
                    width:                              rtlSettings.width
                    height:                             landModeRow.height + _margins * 2
480
                    Row {
481 482 483
                        id:                             landModeRow
                        spacing:                        _margins
                        anchors.verticalCenter:         parent.verticalCenter
484
                        Item {
485 486
                            width:                      _margins * 0.5
                            height:                     1
487 488
                        }
                        QGCColoredImage {
489
                            color:                      palette.text
dogmaphobic's avatar
dogmaphobic committed
490
                            height:                     ScreenTools.defaultFontPixelWidth * 13
491
                            width:                      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
492
                            sourceSize.width:           width
493 494
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
495
                            source:                     controller.vehicle.fixedWing ? "/qmlimages/LandMode.svg" : "/qmlimages/LandModeCopter.svg"
496
                            anchors.verticalCenter:     parent.verticalCenter
Don Gagne's avatar
Don Gagne committed
497
                            visible:                    _showIcons
498 499
                        }
                        Item {
Don Gagne's avatar
Don Gagne committed
500 501 502
                            width:      _margins * 0.5
                            height:     1
                            visible:    _showIcons
503 504 505 506 507
                        }
                        Column {
                            spacing:                    _margins * 0.5
                            anchors.verticalCenter:     parent.verticalCenter
                            Row {
508
                                visible:                !controller.vehicle.fixedWing && (_landSpeedMC !== -1)
509 510
                                QGCLabel {
                                    anchors.baseline:   landVelField.baseline
511 512
                                    width:              _middleRowWidth
                                    text:               qsTr("Landing Velocity:")
513 514 515
                                }
                                FactTextField {
                                    id:                 landVelField
Lorenz Meier's avatar
Lorenz Meier committed
516
                                    fact:               _landSpeedMC
517
                                    showUnits:          true
518
                                    width:              _editFieldWidth
519 520 521
                                }
                            }
                            Row {
522 523
                                QGCCheckBox {
                                    id:                 disarmDelayCheckBox
524 525
                                    anchors.baseline:   disarmField.baseline
                                    text:               qsTr("Disarm After:")
526 527 528
                                    checked:            _disarmLandDelay.value > 0
                                    onClicked:          _disarmLandDelay.value = checked ? 2 : 0
                                    width:              _middleRowWidth
529 530 531 532
                                }
                                FactTextField {
                                    id:                 disarmField
                                    showUnits:          true
533 534
                                    fact:               _disarmLandDelay
                                    enabled:            disarmDelayCheckBox.checked
535
                                    width:              _editFieldWidth
536 537 538 539 540
                                }
                            }
                        }
                    }
                }
541
                Item { width: 1; height: _margins * 0.5; }
Don Gagne's avatar
Don Gagne committed
542
            }
543 544 545
        }
    }
}
546