APMPowerComponent.qml 23 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
import QtQuick          2.3
import QtQuick.Controls 1.2
13
import QtQuick.Dialogs  1.2
14
import QtQuick.Layouts  1.2
Don Gagne's avatar
Don Gagne committed
15 16 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

22 23 24
SetupPage {
    id:             powerPage
    pageComponent:  powerPageComponent
Don Gagne's avatar
Don Gagne committed
25

DonLakeFlyer's avatar
DonLakeFlyer committed
26 27 28 29
    FactPanelController {
        id:         controller
    }

30
    Component {
31 32
        id: powerPageComponent

33 34 35 36 37
        Flow {
            id:         flowLayout
            width:      availableWidth
            spacing:    _margins

38
            property Fact _batt1Monitor:            controller.getParameterFact(-1, "BATT_MONITOR")
39
            property Fact _batt2Monitor:            controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */)
40 41 42 43 44
            property bool _batt2MonitorAvailable:   controller.parameterExists(-1, "BATT2_MONITOR")
            property bool _batt1MonitorEnabled:     _batt1Monitor.rawValue !== 0
            property bool _batt2MonitorEnabled:     _batt2MonitorAvailable && _batt2Monitor.rawValue !== 0
            property bool _batt1ParamsAvailable:    controller.parameterExists(-1, "BATT_CAPACITY")
            property bool _batt2ParamsAvailable:    controller.parameterExists(-1, "BATT2_CAPACITY")
45 46
            property bool _showBatt1Reboot:         _batt1MonitorEnabled && !_batt1ParamsAvailable
            property bool _showBatt2Reboot:         _batt2MonitorEnabled && !_batt2ParamsAvailable
47 48

            property string _restartRequired: qsTr("Requires vehicle reboot")
49 50 51

            QGCPalette { id: ggcPal; colorGroupEnabled: true }

52
            // Battery1 Monitor settings only - used when only monitor param is available
53 54
            Column {
                spacing: _margins / 2
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
                visible: !_batt1MonitorEnabled || !_batt1ParamsAvailable

                QGCLabel {
                    text:       qsTr("Battery 1")
                    font.family: ScreenTools.demiboldFontFamily
                }

                Rectangle {
                    width:  batt1Column.x + batt1Column.width + _margins
                    height: batt1Column.y + batt1Column.height + _margins
                    color:  ggcPal.windowShade

                    ColumnLayout {
                        id:                 batt1Column
                        anchors.margins:    _margins
                        anchors.top:        parent.top
                        anchors.left:       parent.left
                        spacing:            ScreenTools.defaultFontPixelWidth

                        RowLayout {
                            id:                 batt1MonitorRow
                            spacing:            ScreenTools.defaultFontPixelWidth

                            QGCLabel { text: qsTr("Battery1 monitor:") }
                            FactComboBox {
                                id:         monitor1Combo
                                fact:       _batt1Monitor
                                indexModel: false
                            }
                        }

                        QGCLabel {
                            text:       _restartRequired
88 89 90 91 92 93 94
                            visible:    _showBatt1Reboot
                        }

                        QGCButton {
                            text:       qsTr("Reboot vehicle")
                            visible:    _showBatt1Reboot
                            onClicked:  controller.vehicle.rebootVehicle()
95 96 97 98 99 100 101 102 103 104
                        }
                    }
                }
            }

            // Battery 1 settings
            Column {
                id:         _batt1FullSettings
                spacing:    _margins / 2
                visible:    _batt1MonitorEnabled && _batt1ParamsAvailable
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120

                QGCLabel {
                    text:       qsTr("Battery 1")
                    font.family: ScreenTools.demiboldFontFamily
                }

                Rectangle {
                    width:  battery1Loader.x + battery1Loader.width + _margins
                    height: battery1Loader.y + battery1Loader.height + _margins
                    color:  ggcPal.windowShade

                    Loader {
                        id:                 battery1Loader
                        anchors.margins:    _margins
                        anchors.top:        parent.top
                        anchors.left:       parent.left
121 122
                        sourceComponent:    _batt1FullSettings.visible ? powerSetupComponent : undefined

123
                        property Fact armVoltMin:       controller.getParameterFact(-1, "r.BATT_ARM_VOLT", false /* reportMissing */)
124 125 126 127 128 129
                        property Fact battAmpPerVolt:   controller.getParameterFact(-1, "r.BATT_AMP_PERVLT", false /* reportMissing */)
                        property Fact battCapacity:     controller.getParameterFact(-1, "BATT_CAPACITY", false /* reportMissing */)
                        property Fact battCurrPin:      controller.getParameterFact(-1, "BATT_CURR_PIN", false /* reportMissing */)
                        property Fact battMonitor:      controller.getParameterFact(-1, "BATT_MONITOR", false /* reportMissing */)
                        property Fact battVoltMult:     controller.getParameterFact(-1, "BATT_VOLT_MULT", false /* reportMissing */)
                        property Fact battVoltPin:      controller.getParameterFact(-1, "BATT_VOLT_PIN", false /* reportMissing */)
130 131 132 133
                        property Fact vehicleVoltage:   controller.vehicle.battery.voltage
                        property Fact vehicleCurrent:   controller.vehicle.battery.current
                    }
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
134 135
            }

136
            // Battery2 Monitor settings only - used when only monitor param is available
137 138
            Column {
                spacing: _margins / 2
139
                visible: !_batt2MonitorEnabled || !_batt2ParamsAvailable
140 141 142 143 144 145 146

                QGCLabel {
                    text:       qsTr("Battery 2")
                    font.family: ScreenTools.demiboldFontFamily
                }

                Rectangle {
147 148
                    width:  batt2Column.x + batt2Column.width + _margins
                    height: batt2Column.y + batt2Column.height + _margins
149 150
                    color:  ggcPal.windowShade

151 152
                    ColumnLayout {
                        id:                 batt2Column
153 154 155 156 157
                        anchors.margins:    _margins
                        anchors.top:        parent.top
                        anchors.left:       parent.left
                        spacing:            ScreenTools.defaultFontPixelWidth

158 159 160 161 162 163 164 165 166 167 168 169 170 171
                        RowLayout {
                            id:                 batt2MonitorRow
                            spacing:            ScreenTools.defaultFontPixelWidth

                            QGCLabel { text: qsTr("Battery2 monitor:") }
                            FactComboBox {
                                id:         monitor2Combo
                                fact:       _batt2Monitor
                                indexModel: false
                            }
                        }

                        QGCLabel {
                            text:       _restartRequired
172 173 174 175 176 177 178
                            visible:    _showBatt2Reboot
                        }

                        QGCButton {
                            text:       qsTr("Reboot vehicle")
                            visible:    _showBatt2Reboot
                            onClicked:  controller.vehicle.rebootVehicle()
179 180 181
                        }
                    }
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
182 183
            }

184 185
            // Battery 2 settings - Used when full params are available
            Column {
186 187 188
                id:         batt2FullSettings
                spacing:    _margins / 2
                visible:    _batt2MonitorEnabled && _batt2ParamsAvailable
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204

                QGCLabel {
                    text:       qsTr("Battery 2")
                    font.family: ScreenTools.demiboldFontFamily
                }

                Rectangle {
                    width:  battery2Loader.x + battery2Loader.width + _margins
                    height: battery2Loader.y + battery2Loader.height + _margins
                    color:  ggcPal.windowShade

                    Loader {
                        id:                 battery2Loader
                        anchors.margins:    _margins
                        anchors.top:        parent.top
                        anchors.left:       parent.left
205
                        sourceComponent:    batt2FullSettings.visible ? powerSetupComponent : undefined
206

207
                        property Fact armVoltMin:       controller.getParameterFact(-1, "r.BATT2_ARM_VOLT", false /* reportMissing */)
208 209 210 211 212 213 214 215 216 217
                        property Fact battAmpPerVolt:   controller.getParameterFact(-1, "r.BATT2_AMP_PERVLT", false /* reportMissing */)
                        property Fact battCapacity:     controller.getParameterFact(-1, "BATT2_CAPACITY", false /* reportMissing */)
                        property Fact battCurrPin:      controller.getParameterFact(-1, "BATT2_CURR_PIN", false /* reportMissing */)
                        property Fact battMonitor:      controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */)
                        property Fact battVoltMult:     controller.getParameterFact(-1, "BATT2_VOLT_MULT", false /* reportMissing */)
                        property Fact battVoltPin:      controller.getParameterFact(-1, "BATT2_VOLT_PIN", false /* reportMissing */)
                        property Fact vehicleVoltage:   controller.vehicle.battery2.voltage
                        property Fact vehicleCurrent:   controller.vehicle.battery2.current
                    }
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
218
            }
219
        } // Flow
DonLakeFlyer's avatar
DonLakeFlyer committed
220 221 222 223 224 225 226
    } // Component - powerPageComponent

    Component {
        id: powerSetupComponent

        Column {
            spacing: _margins
227 228

            property real _margins:         ScreenTools.defaultFontPixelHeight / 2
DonLakeFlyer's avatar
DonLakeFlyer committed
229
            property bool _showAdvanced:    sensorCombo.currentIndex === sensorModel.count - 1
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
            property real _fieldWidth:      ScreenTools.defaultFontPixelWidth * 25

            Component.onCompleted: calcSensor()

            function calcSensor() {
                for (var i=0; i<sensorModel.count - 1; i++) {
                    if (sensorModel.get(i).voltPin == battVoltPin.value &&
                            sensorModel.get(i).currPin == battCurrPin.value &&
                            Math.abs(sensorModel.get(i).voltMult - battVoltMult.value) < 0.001 &&
                            Math.abs(sensorModel.get(i).ampPerVolt - battAmpPerVolt.value) < 0.0001) {
                        sensorCombo.currentIndex = i
                        return
                    }
                }
                sensorCombo.currentIndex = sensorModel.count - 1
            }
246

247
            QGCPalette { id: palette; colorGroupEnabled: true }
248

249 250
            ListModel {
                id: sensorModel
251

252 253 254 255 256 257 258
                ListElement {
                    text:       qsTr("Power Module 90A")
                    voltPin:    2
                    currPin:    3
                    voltMult:   10.1
                    ampPerVolt: 17.0
                }
259

260 261 262 263 264 265 266
                ListElement {
                    text:       qsTr("Power Module HV")
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 39.877
                }
267

268
                ListElement {
269
                    text:       qsTr("3DR Iris")
270 271 272 273 274
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 17.0
                }
275

276 277 278 279
                ListElement {
                    text:       qsTr("Other")
                }
            }
280

281 282 283 284 285 286 287 288 289

            GridLayout {
                columns:        3
                rowSpacing:     _margins
                columnSpacing:  _margins

                QGCLabel { text: qsTr("Battery monitor:") }

                FactComboBox {
DonLakeFlyer's avatar
DonLakeFlyer committed
290 291 292
                    id:         monitorCombo
                    fact:       battMonitor
                    indexModel: false
293
                }
Don Gagne's avatar
Don Gagne committed
294

295 296 297 298 299
                QGCLabel {
                    Layout.row:     1
                    Layout.column:  0
                    text:           qsTr("Battery capacity:")
                }
Don Gagne's avatar
Don Gagne committed
300

301 302 303 304 305
                FactTextField {
                    id:     capacityField
                    width:  _fieldWidth
                    fact:   battCapacity
                }
Don Gagne's avatar
Don Gagne committed
306

307 308 309
                QGCLabel {
                    Layout.row:     2
                    Layout.column:  0
310 311 312 313 314 315 316 317 318 319 320 321
                    text:           qsTr("Minimum arming voltage:")
                }

                FactTextField {
                    id:     armVoltField
                    width:  _fieldWidth
                    fact:   armVoltMin
                }

                QGCLabel {
                    Layout.row:     3
                    Layout.column:  0
322 323
                    text:           qsTr("Power sensor:")
                }
Don Gagne's avatar
Don Gagne committed
324

325 326 327 328
                QGCComboBox {
                    id:                     sensorCombo
                    Layout.minimumWidth:    _fieldWidth
                    model:                  sensorModel
Don Gagne's avatar
Don Gagne committed
329

330 331 332 333 334 335 336
                    onActivated: {
                        if (index < sensorModel.count - 1) {
                            battVoltPin.value = sensorModel.get(index).voltPin
                            battCurrPin.value = sensorModel.get(index).currPin
                            battVoltMult.value = sensorModel.get(index).voltMult
                            battAmpPerVolt.value = sensorModel.get(index).ampPerVolt
                        } else {
Don Gagne's avatar
Don Gagne committed
337

338
                        }
Don Gagne's avatar
Don Gagne committed
339 340 341
                    }
                }

342
                QGCLabel {
343
                    Layout.row:     4
344 345 346 347
                    Layout.column:  0
                    text:           qsTr("Current pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
348

349 350 351
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battCurrPin
352
                    indexModel:             false
353 354
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
355

356
                QGCLabel {
357
                    Layout.row:     5
358 359 360 361
                    Layout.column:  0
                    text:           qsTr("Voltage pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
362

363 364 365 366 367 368
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battVoltPin
                    indexModel:             false
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
369

370
                QGCLabel {
371
                    Layout.row:     6
372 373 374 375
                    Layout.column:  0
                    text:           qsTr("Voltage multiplier:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
376

377 378 379 380 381
                FactTextField {
                    width:      _fieldWidth
                    fact:       battVoltMult
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
382

383 384 385
                QGCButton {
                    text:       qsTr("Calculate")
                    visible:    _showAdvanced
DonLakeFlyer's avatar
DonLakeFlyer committed
386 387 388 389

                    onClicked: {
                        _calcVoltageDlgVehicleVoltage = vehicleVoltage
                        _calcVoltageDlgBattVoltMultParam = battVoltMult
390
                        mainWindow.showDialog(calcVoltageMultiplierDlgComponent, qsTr("Calculate Voltage Multiplier"), mainWindow.showDialogDefaultWidth, StandardButton.Close)
DonLakeFlyer's avatar
DonLakeFlyer committed
391 392
                    }

393
                }
394

395 396 397 398 399 400 401 402
                QGCLabel {
                    Layout.columnSpan:  3
                    Layout.fillWidth:   true
                    font.pointSize:     ScreenTools.smallFontPointSize
                    wrapMode:           Text.WordWrap
                    text:               qsTr("If the battery voltage reported by the vehicle is largely different than the voltage read externally using a voltmeter you can adjust the voltage multiplier value to correct this. Click the Calculate button for help with calculating a new value.")
                    visible:            _showAdvanced
                }
403

404 405 406 407
                QGCLabel {
                    text:       qsTr("Amps per volt:")
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
408

409 410 411 412 413
                FactTextField {
                    width:      _fieldWidth
                    fact:       battAmpPerVolt
                    visible:    _showAdvanced
                }
414

415 416 417
                QGCButton {
                    text:       qsTr("Calculate")
                    visible:    _showAdvanced
DonLakeFlyer's avatar
DonLakeFlyer committed
418 419 420 421

                    onClicked: {
                        _calcAmpsPerVoltDlgVehicleCurrent = vehicleCurrent
                        _calcAmpsPerVoltDlgBattAmpPerVoltParam = battAmpPerVolt
422
                        mainWindow.showDialog(calcAmpsPerVoltDlgComponent, qsTr("Calculate Amps per Volt"), mainWindow.showDialogDefaultWidth, StandardButton.Close)
DonLakeFlyer's avatar
DonLakeFlyer committed
423
                    }
424
                }
425

426 427 428 429 430 431
                QGCLabel {
                    Layout.columnSpan:  3
                    Layout.fillWidth:   true
                    font.pointSize:     ScreenTools.smallFontPointSize
                    wrapMode:           Text.WordWrap
                    text:               qsTr("If the current draw reported by the vehicle is largely different than the current read externally using a current meter you can adjust the amps per volt value to correct this. Click the Calculate button for help with calculating a new value.")
DonLakeFlyer's avatar
DonLakeFlyer committed
432
                    visible:            _showAdvanced
433 434 435
                }
            } // GridLayout
        } // Column
DonLakeFlyer's avatar
DonLakeFlyer committed
436 437
    } // Component - powerSetupComponent

DonLakeFlyer's avatar
DonLakeFlyer committed
438 439 440 441
    // Must be set prior to use of calcVoltageMultiplierDlgComponent
    property Fact _calcVoltageDlgVehicleVoltage
    property Fact _calcVoltageDlgBattVoltMultParam

DonLakeFlyer's avatar
DonLakeFlyer committed
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
    Component {
        id: calcVoltageMultiplierDlgComponent

        QGCViewDialog {
            id: calcVoltageMultiplierDlg

            QGCFlickable {
                anchors.fill:   parent
                contentHeight:  column.height
                contentWidth:   column.width

                Column {
                    id:         column
                    width:      calcVoltageMultiplierDlg.width
                    spacing:    ScreenTools.defaultFontPixelHeight

                    QGCLabel {
                        width:      parent.width
                        wrapMode:   Text.WordWrap
                        text:       qsTr("Measure battery voltage using an external voltmeter and enter the value below. Click Calculate to set the new voltage multiplier.")
                    }

                    Grid {
                        columns: 2
                        spacing: ScreenTools.defaultFontPixelHeight / 2
                        verticalItemAlignment: Grid.AlignVCenter

                        QGCLabel {
                            text: qsTr("Measured voltage:")
                        }
                        QGCTextField { id: measuredVoltage }

                        QGCLabel { text: qsTr("Vehicle voltage:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
475
                        FactLabel { fact: _calcVoltageDlgVehicleVoltage }
DonLakeFlyer's avatar
DonLakeFlyer committed
476 477

                        QGCLabel { text: qsTr("Voltage multiplier:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
478
                        FactLabel { fact: _calcVoltageDlgBattVoltMultParam }
DonLakeFlyer's avatar
DonLakeFlyer committed
479 480 481 482 483 484 485 486 487 488
                    }

                    QGCButton {
                        text: "Calculate"

                        onClicked:  {
                            var measuredVoltageValue = parseFloat(measuredVoltage.text)
                            if (measuredVoltageValue == 0 || isNaN(measuredVoltageValue)) {
                                return
                            }
DonLakeFlyer's avatar
DonLakeFlyer committed
489
                            var newVoltageMultiplier = (measuredVoltageValue * _calcVoltageDlgBattVoltMultParam.value) / _calcVoltageDlgVehicleVoltage.value
DonLakeFlyer's avatar
DonLakeFlyer committed
490
                            if (newVoltageMultiplier > 0) {
DonLakeFlyer's avatar
DonLakeFlyer committed
491
                                _calcVoltageDlgBattVoltMultParam.value = newVoltageMultiplier
DonLakeFlyer's avatar
DonLakeFlyer committed
492 493 494 495 496 497 498 499
                            }
                        }
                    }
                } // Column
            } // QGCFlickable
        } // QGCViewDialog
    } // Component - calcVoltageMultiplierDlgComponent

DonLakeFlyer's avatar
DonLakeFlyer committed
500 501 502 503
    // Must be set prior to use of calcAmpsPerVoltDlgComponent
    property Fact _calcAmpsPerVoltDlgVehicleCurrent
    property Fact _calcAmpsPerVoltDlgBattAmpPerVoltParam

DonLakeFlyer's avatar
DonLakeFlyer committed
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
    Component {
        id: calcAmpsPerVoltDlgComponent

        QGCViewDialog {
            id: calcAmpsPerVoltDlg

            QGCFlickable {
                anchors.fill:   parent
                contentHeight:  column.height
                contentWidth:   column.width

                Column {
                    id:         column
                    width:      calcAmpsPerVoltDlg.width
                    spacing:    ScreenTools.defaultFontPixelHeight

                    QGCLabel {
                        width:      parent.width
                        wrapMode:   Text.WordWrap
                        text:       qsTr("Measure current draw using an external current meter and enter the value below. Click Calculate to set the new amps per volt value.")
                    }

                    Grid {
                        columns: 2
                        spacing: ScreenTools.defaultFontPixelHeight / 2
                        verticalItemAlignment: Grid.AlignVCenter

                        QGCLabel {
                            text: qsTr("Measured current:")
                        }
                        QGCTextField { id: measuredCurrent }

                        QGCLabel { text: qsTr("Vehicle current:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
537
                        FactLabel { fact: _calcAmpsPerVoltDlgVehicleCurrent }
DonLakeFlyer's avatar
DonLakeFlyer committed
538 539

                        QGCLabel { text: qsTr("Amps per volt:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
540
                        FactLabel { fact: _calcAmpsPerVoltDlgBattAmpPerVoltParam }
DonLakeFlyer's avatar
DonLakeFlyer committed
541 542 543 544 545 546 547 548 549 550
                    }

                    QGCButton {
                        text: "Calculate"

                        onClicked:  {
                            var measuredCurrentValue = parseFloat(measuredCurrent.text)
                            if (measuredCurrentValue == 0) {
                                return
                            }
DonLakeFlyer's avatar
DonLakeFlyer committed
551
                            var newAmpsPerVolt = (measuredCurrentValue * _calcAmpsPerVoltDlgBattAmpPerVoltParam.value) / _calcAmpsPerVoltDlgVehicleCurrent.value
DonLakeFlyer's avatar
DonLakeFlyer committed
552
                            if (newAmpsPerVolt != 0) {
DonLakeFlyer's avatar
DonLakeFlyer committed
553
                                _calcAmpsPerVoltDlgBattAmpPerVoltParam.value = newAmpsPerVolt
DonLakeFlyer's avatar
DonLakeFlyer committed
554 555 556 557 558 559 560
                            }
                        }
                    }
                } // Column
            } // QGCFlickable
        } // QGCViewDialog
    } // Component - calcAmpsPerVoltDlgComponent
561
} // SetupPage