APMSafetyComponentCopter.qml 20.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.
 *
 ****************************************************************************/
Don Gagne's avatar
Don Gagne committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29


import QtQuick              2.5
import QtQuick.Controls     1.2
import QtGraphicalEffects   1.0

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

QGCView {
    id:                 _safetyView
    viewPanel:          panel
    anchors.fill:       parent

    FactPanelController { id: controller; factPanel: panel }

    QGCPalette { id: palette; colorGroupEnabled: enabled }

Don Gagne's avatar
Don Gagne committed
30
    property Fact _failsafeGCSEnable:   controller.getParameterFact(-1, "FS_GCS_ENABLE")
31
    property Fact _failsafeBattEnable:  controller.getParameterFact(-1, "FS_BATT_ENABLE")
32 33 34 35 36 37 38 39 40 41 42 43
    property Fact _failsafeBattMah:     controller.getParameterFact(-1, "FS_BATT_MAH")
    property Fact _failsafeBattVoltage: controller.getParameterFact(-1, "FS_BATT_VOLTAGE")
    property Fact _failsafeThrEnable:   controller.getParameterFact(-1, "FS_THR_ENABLE")
    property Fact _failsafeThrValue:    controller.getParameterFact(-1, "FS_THR_VALUE")

    property Fact _fenceAction: controller.getParameterFact(-1, "FENCE_ACTION")
    property Fact _fenceAltMax: controller.getParameterFact(-1, "FENCE_ALT_MAX")
    property Fact _fenceEnable: controller.getParameterFact(-1, "FENCE_ENABLE")
    property Fact _fenceMargin: controller.getParameterFact(-1, "FENCE_MARGIN")
    property Fact _fenceRadius: controller.getParameterFact(-1, "FENCE_RADIUS")
    property Fact _fenceType:   controller.getParameterFact(-1, "FENCE_TYPE")

Don Gagne's avatar
Don Gagne committed
44 45 46 47 48
    property Fact _landSpeedFact:   controller.getParameterFact(-1, "LAND_SPEED")
    property Fact _rtlAltFact:      controller.getParameterFact(-1, "RTL_ALT")
    property Fact _rtlLoitTimeFact: controller.getParameterFact(-1, "RTL_LOIT_TIME")
    property Fact _rtlAltFinalFact: controller.getParameterFact(-1, "RTL_ALT_FINAL")

Don Gagne's avatar
Don Gagne committed
49 50
    property Fact _armingCheck: controller.getParameterFact(-1, "ARMING_CHECK")

Don Gagne's avatar
Don Gagne committed
51 52
    property real _margins: ScreenTools.defaultFontPixelHeight

53
    ExclusiveGroup { id: fenceActionRadioGroup }
Don Gagne's avatar
Don Gagne committed
54 55 56 57 58 59 60
    ExclusiveGroup { id: landLoiterRadioGroup }
    ExclusiveGroup { id: returnAltRadioGroup }

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent

Don Gagne's avatar
Don Gagne committed
61
        QGCFlickable {
Don Gagne's avatar
Don Gagne committed
62 63
            clip:               true
            anchors.fill:       parent
Don Gagne's avatar
Don Gagne committed
64 65
            contentHeight:      armingCheckSettings.y + armingCheckSettings.height
            contentWidth:       armingCheckSettings.x + armingCheckSettings.width
Don Gagne's avatar
Don Gagne committed
66 67

            QGCLabel {
68
                id:         failsafeLabel
69
                text:       qsTr("Failsafe Triggers")
70
                font.family: ScreenTools.demiboldFontFamily
Don Gagne's avatar
Don Gagne committed
71 72
            }

73
            Rectangle {
74 75 76 77 78
                id:                     failsafeSettings
                anchors.topMargin:      _margins / 2
                anchors.rightMargin:    _margins
                anchors.left:           parent.left
                anchors.top:            failsafeLabel.bottom
Don Gagne's avatar
Don Gagne committed
79
                width:                  throttleEnableCombo.x + throttleEnableCombo.width + _margins
80 81
                height:                 mahField.y + mahField.height + _margins
                color:                  palette.windowShade
82

Don Gagne's avatar
Don Gagne committed
83 84 85 86 87
                QGCLabel {
                    id:                 gcsEnableLabel
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.baseline:   gcsEnableCombo.baseline
88
                    text:               qsTr("Ground Station failsafe:")
Don Gagne's avatar
Don Gagne committed
89 90 91 92 93 94 95 96 97 98 99 100 101
                }

                FactComboBox {
                    id:                 gcsEnableCombo
                    anchors.topMargin:  _margins
                    anchors.leftMargin: _margins
                    anchors.left:       gcsEnableLabel.right
                    anchors.top:        parent.top
                    width:              voltageField.width
                    fact:               _failsafeGCSEnable
                    indexModel:         false
                }

102 103 104 105 106
                QGCLabel {
                    id:                 throttleEnableLabel
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.baseline:   throttleEnableCombo.baseline
107
                    text:               qsTr("Throttle failsafe:")
108 109 110 111 112
                }

                QGCComboBox {
                    id:                 throttleEnableCombo
                    anchors.topMargin:  _margins
Don Gagne's avatar
Don Gagne committed
113 114
                    anchors.left:       gcsEnableCombo.left
                    anchors.top:        gcsEnableCombo.bottom
115
                    width:              voltageField.width
116 117
                    model:              [qsTr("Disabled"), qsTr("Always RTL"),
                        qsTr("Continue with Mission in Auto Mode"), qsTr("Always Land")]
118 119 120 121 122 123 124 125 126 127
                    currentIndex:       _failsafeThrEnable.value

                    onActivated: _failsafeThrEnable.value = index
                }

                QGCLabel {
                    id:                 throttlePWMLabel
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.baseline:   throttlePWMField.baseline
128
                    text:               qsTr("PWM threshold:")
129 130 131 132 133
                }

                FactTextField {
                    id:                 throttlePWMField
                    anchors.topMargin:  _margins / 2
Don Gagne's avatar
Don Gagne committed
134
                    anchors.left:       gcsEnableCombo.left
135 136 137 138 139 140 141 142 143 144
                    anchors.top:        throttleEnableCombo.bottom
                    fact:               _failsafeThrValue
                    showUnits:          true
                }

                QGCLabel {
                    id:                 batteryEnableLabel
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.baseline:   batteryEnableCombo.baseline
145
                    text:               qsTr("Battery failsafe:")
146 147 148 149 150
                }

                QGCComboBox {
                    id:                 batteryEnableCombo
                    anchors.topMargin:  _margins
Don Gagne's avatar
Don Gagne committed
151
                    anchors.left:       gcsEnableCombo.left
152 153
                    anchors.top:        throttlePWMField.bottom
                    width:              voltageField.width
154
                    model:              [qsTr("Disabled"), qsTr("Land"), qsTr("Return to Launch")]
155
                    currentIndex:       _failsafeBattEnable.value
156

157
                    onActivated: _failsafeBattEnable.value = index
158 159 160 161 162 163 164
                }

                QGCCheckBox {
                    id:                 voltageLabel
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.baseline:   voltageField.baseline
165
                    text:               qsTr("Voltage threshold:")
166 167 168 169 170 171 172 173
                    checked:            _failsafeBattVoltage.value != 0

                    onClicked: _failsafeBattVoltage.value = checked ? 10.5 : 0
                }

                FactTextField {
                    id:                 voltageField
                    anchors.topMargin:  _margins / 2
Don Gagne's avatar
Don Gagne committed
174
                    anchors.left:       gcsEnableCombo.left
175 176 177 178 179 180 181 182 183 184
                    anchors.top:        batteryEnableCombo.bottom
                    fact:               _failsafeBattVoltage
                    showUnits:          true
                }

                QGCCheckBox {
                    id:                 mahLabel
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.baseline:   mahField.baseline
185
                    text:               qsTr("MAH threshold:")
186 187 188 189 190 191 192 193
                    checked:            _failsafeBattMah.value != 0

                    onClicked: _failsafeBattMah.value = checked ? 600 : 0
                }

                FactTextField {
                    id:                 mahField
                    anchors.topMargin:  _margins / 2
Don Gagne's avatar
Don Gagne committed
194
                    anchors.left:       gcsEnableCombo.left
195 196 197 198 199 200 201 202
                    anchors.top:        voltageField.bottom
                    fact:               _failsafeBattMah
                    showUnits:          true
                }
            } // Rectangle - Failsafe Settings

            QGCLabel {
                id:                 geoFenceLabel
203 204 205
                anchors.leftMargin: _margins
                anchors.left:       failsafeSettings.right
                anchors.top:        parent.top
206
                text:               qsTr("GeoFence")
207
                font.family:        ScreenTools.demiboldFontFamily
208 209 210 211 212
            }

            Rectangle {
                id:                 geoFenceSettings
                anchors.topMargin:  _margins / 2
213
                anchors.left:       geoFenceLabel.left
214
                anchors.top:        geoFenceLabel.bottom
215 216
                anchors.bottom:     failsafeSettings.bottom
                width:              fenceAltMaxField.x + fenceAltMaxField.width + _margins
217 218 219 220 221 222 223
                color:              palette.windowShade

                QGCCheckBox {
                    id:                 circleGeo
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.top:        parent.top
224
                    text:               qsTr("Circle GeoFence enabled")
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
                    checked:            _fenceEnable.value != 0 && _fenceType.value & 2

                    onClicked: {
                        if (checked) {
                            if (_fenceEnable.value == 1) {
                                _fenceType.value |= 2
                            } else {
                                _fenceEnable.value = 1
                                _fenceType.value = 2
                            }
                        } else if (altitudeGeo.checked) {
                            _fenceType.value &= ~2
                        } else {
                            _fenceEnable.value = 0
                            _fenceType.value = 0
                        }
                    }
                }

                QGCCheckBox {
                    id:                 altitudeGeo
                    anchors.topMargin:  _margins / 2
                    anchors.left:       circleGeo.left
                    anchors.top:        circleGeo.bottom
249
                    text:               qsTr("Altitude GeoFence enabled")
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
                    checked:            _fenceEnable.value != 0 && _fenceType.value & 1

                    onClicked: {
                        if (checked) {
                            if (_fenceEnable.value == 1) {
                                _fenceType.value |= 1
                            } else {
                                _fenceEnable.value = 1
                                _fenceType.value = 1
                            }
                        } else if (circleGeo.checked) {
                            _fenceType.value &= ~1
                        } else {
                            _fenceEnable.value = 0
                            _fenceType.value = 0
                        }
                    }
                }

                QGCRadioButton {
                    id:                 geoReportRadio
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.top:        altitudeGeo.bottom
274
                    text:               qsTr("Report only")
275 276 277 278 279 280 281 282 283 284 285
                    exclusiveGroup:     fenceActionRadioGroup
                    checked:            _fenceAction.value == 0

                    onClicked: _fenceAction.value = 0
                }

                QGCRadioButton {
                    id:                 geoRTLRadio
                    anchors.topMargin:  _margins / 2
                    anchors.left:       circleGeo.left
                    anchors.top:        geoReportRadio.bottom
286
                    text:               qsTr("RTL or Land")
287 288 289 290 291 292 293 294 295 296
                    exclusiveGroup:     fenceActionRadioGroup
                    checked:            _fenceAction.value == 1

                    onClicked: _fenceAction.value = 1
                }

                QGCLabel {
                    id:                 fenceRadiusLabel
                    anchors.left:       circleGeo.left
                    anchors.baseline:   fenceRadiusField.baseline
297
                    text:               qsTr("Max radius:")
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
                }

                FactTextField {
                    id:                 fenceRadiusField
                    anchors.topMargin:  _margins
                    anchors.left:       fenceAltMaxField.left
                    anchors.top:        geoRTLRadio.bottom
                    fact:               _fenceRadius
                    showUnits:          true
                }

                QGCLabel {
                    id:                 fenceAltMaxLabel
                    anchors.left:       circleGeo.left
                    anchors.baseline:   fenceAltMaxField.baseline
313
                    text:               qsTr("Max altitude:")
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
                }

                FactTextField {
                    id:                 fenceAltMaxField
                    anchors.topMargin:  _margins / 2
                    anchors.leftMargin: _margin
                    anchors.left:       fenceAltMaxLabel.right
                    anchors.top:        fenceRadiusField.bottom
                    fact:               _fenceAltMax
                    showUnits:          true
                }
            } // Rectangle - GeoFence Settings

            QGCLabel {
                id:                 rtlLabel
                anchors.topMargin:  _margins
                anchors.top:        geoFenceSettings.bottom
331
                text:               qsTr("Return to Launch")
332
                font.family:        ScreenTools.demiboldFontFamily
333 334
            }

Don Gagne's avatar
Don Gagne committed
335
            Rectangle {
336
                id:                 rtlSettings
Don Gagne's avatar
Don Gagne committed
337 338 339
                anchors.topMargin:  _margins / 2
                anchors.left:       parent.left
                anchors.top:        rtlLabel.bottom
340
                width:              rltAltFinalField.x + rltAltFinalField.width + _margins
Don Gagne's avatar
Don Gagne committed
341 342 343 344 345 346 347 348 349 350
                height:             rltAltFinalField.y + rltAltFinalField.height + _margins
                color:              palette.windowShade

                Image {
                    id:                 icon
                    anchors.margins:    _margins
                    anchors.left:       parent.left
                    anchors.top:        parent.top
                    height:             ScreenTools.defaultFontPixelWidth * 20
                    width:              ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
351
                    sourceSize.width:   width
Don Gagne's avatar
Don Gagne committed
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
                    mipmap:             true
                    fillMode:           Image.PreserveAspectFit
                    visible:            false
                    source:             "/qmlimages/ReturnToHomeAltitude.svg"
                }

                ColorOverlay {
                    anchors.fill:   icon
                    source:         icon
                    color:          palette.text
                }

                QGCRadioButton {
                    id:                 returnAtCurrentRadio
                    anchors.leftMargin: _margins
                    anchors.left:       icon.right
                    anchors.top:        icon.top
369
                    text:               qsTr("Return at current altitude")
Don Gagne's avatar
Don Gagne committed
370 371 372 373 374 375 376 377 378 379 380
                    checked:            _rtlAltFact.value == 0
                    exclusiveGroup:     returnAltRadioGroup

                    onClicked: _rtlAltFact.value = 0
                }

                QGCRadioButton {
                    id:                 returnAltRadio
                    anchors.topMargin:  _margins
                    anchors.left:       returnAtCurrentRadio.left
                    anchors.top:        returnAtCurrentRadio.bottom
381
                    text:               qsTr("Return at specified altitude:")
Don Gagne's avatar
Don Gagne committed
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
                    exclusiveGroup:     returnAltRadioGroup
                    checked:            _rtlAltFact.value != 0

                    onClicked: _rtlAltFact.value = 1500
                }

                FactTextField {
                    id:                 rltAltField
                    anchors.leftMargin: _margins
                    anchors.left:       returnAltRadio.right
                    anchors.baseline:   returnAltRadio.baseline
                    fact:               _rtlAltFact
                    showUnits:          true
                    enabled:            returnAltRadio.checked
                }

                QGCCheckBox {
                    id:                 homeLoiterCheckbox
                    anchors.left:       returnAtCurrentRadio.left
                    anchors.baseline:   landDelayField.baseline
                    checked:            _rtlLoitTimeFact.value > 0
403
                    text:               qsTr("Loiter above Home for:")
Don Gagne's avatar
Don Gagne committed
404

405
                    onClicked: _rtlLoitTimeFact.value = (checked ? 60 : 0)
Don Gagne's avatar
Don Gagne committed
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
                }

                FactTextField {
                    id:                 landDelayField
                    anchors.topMargin:  _margins * 1.5
                    anchors.left:       rltAltField.left
                    anchors.top:        rltAltField.bottom
                    fact:               _rtlLoitTimeFact
                    showUnits:          true
                    enabled:            homeLoiterCheckbox.checked === true
                }

                QGCRadioButton {
                    id:                 landRadio
                    anchors.left:       returnAtCurrentRadio.left
                    anchors.baseline:   landSpeedField.baseline
422
                    text:               qsTr("Land with descent speed:")
Don Gagne's avatar
Don Gagne committed
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
                    checked:            _rtlAltFinalFact.value == 0
                    exclusiveGroup:     landLoiterRadioGroup

                    onClicked: _rtlAltFinalFact.value = 0
                }

                FactTextField {
                    id:                 landSpeedField
                    anchors.topMargin:  _margins * 1.5
                    anchors.top:        landDelayField.bottom
                    anchors.left:       rltAltField.left
                    fact:               _landSpeedFact
                    showUnits:          true
                    enabled:            landRadio.checked
                }

                QGCRadioButton {
                    id:                 finalLoiterRadio
                    anchors.left:       returnAtCurrentRadio.left
                    anchors.baseline:   rltAltFinalField.baseline
443
                    text:               qsTr("Final loiter altitude:")
Don Gagne's avatar
Don Gagne committed
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
                    exclusiveGroup:     landLoiterRadioGroup

                    onClicked: _rtlAltFinalFact.value = _rtlAltFact.value
                }

                FactTextField {
                    id:                 rltAltFinalField
                    anchors.topMargin:  _margins / 2
                    anchors.left:       rltAltField.left
                    anchors.top:        landSpeedField.bottom
                    fact:               _rtlAltFinalFact
                    enabled:            finalLoiterRadio.checked
                    showUnits:          true
                }
            } // Rectangle - RTL Settings
Don Gagne's avatar
Don Gagne committed
459 460 461 462 463 464

            QGCLabel {
                id:                 armingCheckLabel
                anchors.topMargin:  _margins
                anchors.left:       parent.left
                anchors.top:        rtlSettings.bottom
465
                text:               qsTr("Arming Checks")
466
                font.family:        ScreenTools.demiboldFontFamily
Don Gagne's avatar
Don Gagne committed
467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
            }

            Rectangle {
                id:                 armingCheckSettings
                anchors.topMargin:  _margins / 2
                anchors.left:       parent.left
                anchors.top:        armingCheckLabel.bottom
                width:              armingCheckColumn.x + armingCheckColumn.width + _margins
                height:             armingCheckColumn.y + armingCheckColumn.height + _margins
                color:              palette.windowShade

                Column {
                    id:         armingCheckColumn
                    spacing:    _margins

482
                    QGCLabel { text: qsTr("Be very careful when turning off arming checks. Could lead to loss of Vehicle control.") }
Don Gagne's avatar
Don Gagne committed
483 484 485
                    FactBitmask { fact: _armingCheck }
                }
            }
Don Gagne's avatar
Don Gagne committed
486
        } // QGCFlickable
Don Gagne's avatar
Don Gagne committed
487 488
    } // QGCViewPanel
} // QGCView