APMPowerComponent.qml 22.4 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 30
    FactPanelController {
        id:         controller
        factPanel:  powerPage.viewPanel
    }

31
    Component {
32 33
        id: powerPageComponent

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

39
            property Fact _batt1Monitor:            controller.getParameterFact(-1, "BATT_MONITOR")
40
            property Fact _batt2Monitor:            controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */)
41 42 43 44 45 46 47
            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")

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

            QGCPalette { id: ggcPal; colorGroupEnabled: true }

51
            // Battery1 Monitor settings only - used when only monitor param is available
52 53
            Column {
                spacing: _margins / 2
54 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 88 89 90 91 92 93 94 95 96 97
                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
                            visible:    _batt1MonitorEnabled && !_batt1ParamsAvailable
                        }
                    }
                }
            }

            // Battery 1 settings
            Column {
                id:         _batt1FullSettings
                spacing:    _margins / 2
                visible:    _batt1MonitorEnabled && _batt1ParamsAvailable
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

                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
114 115 116 117 118 119 120 121 122
                        sourceComponent:    _batt1FullSettings.visible ? powerSetupComponent : undefined

                        property Fact armVoltMin:       controller.getParameterFact(-1, "r.ARMING_VOLT_MIN", false /* reportMissing */)
                        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 */)
123 124 125 126
                        property Fact vehicleVoltage:   controller.vehicle.battery.voltage
                        property Fact vehicleCurrent:   controller.vehicle.battery.current
                    }
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
127 128
            }

129
            // Battery2 Monitor settings only - used when only monitor param is available
130 131
            Column {
                spacing: _margins / 2
132
                visible: !_batt2MonitorEnabled || !_batt2ParamsAvailable
133 134 135 136 137 138 139

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

                Rectangle {
140 141
                    width:  batt2Column.x + batt2Column.width + _margins
                    height: batt2Column.y + batt2Column.height + _margins
142 143
                    color:  ggcPal.windowShade

144 145
                    ColumnLayout {
                        id:                 batt2Column
146 147 148 149 150
                        anchors.margins:    _margins
                        anchors.top:        parent.top
                        anchors.left:       parent.left
                        spacing:            ScreenTools.defaultFontPixelWidth

151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
                        RowLayout {
                            id:                 batt2MonitorRow
                            spacing:            ScreenTools.defaultFontPixelWidth

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

                        QGCLabel {
                            text:       _restartRequired
                            visible:    _batt2MonitorEnabled && !_batt2ParamsAvailable
166 167 168
                        }
                    }
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
169 170
            }

171 172
            // Battery 2 settings - Used when full params are available
            Column {
173 174 175
                id:         batt2FullSettings
                spacing:    _margins / 2
                visible:    _batt2MonitorEnabled && _batt2ParamsAvailable
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

                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
192
                        sourceComponent:    batt2FullSettings.visible ? powerSetupComponent : undefined
193 194 195 196 197 198 199 200 201 202 203 204

                        property Fact armVoltMin:       controller.getParameterFact(-1, "r.ARMING_VOLT2_MIN", false /* reportMissing */)
                        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
205
            }
206
        } // Flow
DonLakeFlyer's avatar
DonLakeFlyer committed
207 208 209 210 211 212 213
    } // Component - powerPageComponent

    Component {
        id: powerSetupComponent

        Column {
            spacing: _margins
214 215

            property real _margins:         ScreenTools.defaultFontPixelHeight / 2
DonLakeFlyer's avatar
DonLakeFlyer committed
216
            property bool _showAdvanced:    sensorCombo.currentIndex === sensorModel.count - 1
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
            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
            }
233

234
            QGCPalette { id: palette; colorGroupEnabled: true }
235

236 237
            ListModel {
                id: sensorModel
238

239 240 241 242 243 244 245
                ListElement {
                    text:       qsTr("Power Module 90A")
                    voltPin:    2
                    currPin:    3
                    voltMult:   10.1
                    ampPerVolt: 17.0
                }
246

247 248 249 250 251 252 253
                ListElement {
                    text:       qsTr("Power Module HV")
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 39.877
                }
254

255
                ListElement {
256
                    text:       qsTr("3DR Iris")
257 258 259 260 261
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 17.0
                }
262

263 264 265 266
                ListElement {
                    text:       qsTr("Other")
                }
            }
267

268 269 270 271 272 273 274 275 276

            GridLayout {
                columns:        3
                rowSpacing:     _margins
                columnSpacing:  _margins

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

                FactComboBox {
DonLakeFlyer's avatar
DonLakeFlyer committed
277 278 279
                    id:         monitorCombo
                    fact:       battMonitor
                    indexModel: false
280
                }
Don Gagne's avatar
Don Gagne committed
281

282 283 284 285 286
                QGCLabel {
                    Layout.row:     1
                    Layout.column:  0
                    text:           qsTr("Battery capacity:")
                }
Don Gagne's avatar
Don Gagne committed
287

288 289 290 291 292
                FactTextField {
                    id:     capacityField
                    width:  _fieldWidth
                    fact:   battCapacity
                }
Don Gagne's avatar
Don Gagne committed
293

294 295 296
                QGCLabel {
                    Layout.row:     2
                    Layout.column:  0
297 298 299 300 301 302 303 304 305 306 307 308
                    text:           qsTr("Minimum arming voltage:")
                }

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

                QGCLabel {
                    Layout.row:     3
                    Layout.column:  0
309 310
                    text:           qsTr("Power sensor:")
                }
Don Gagne's avatar
Don Gagne committed
311

312 313 314 315
                QGCComboBox {
                    id:                     sensorCombo
                    Layout.minimumWidth:    _fieldWidth
                    model:                  sensorModel
Don Gagne's avatar
Don Gagne committed
316

317 318 319 320 321 322 323
                    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
324

325
                        }
Don Gagne's avatar
Don Gagne committed
326 327 328
                    }
                }

329
                QGCLabel {
330
                    Layout.row:     4
331 332 333 334
                    Layout.column:  0
                    text:           qsTr("Current pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
335

336 337 338
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battCurrPin
339
                    indexModel:             false
340 341
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
342

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

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

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

364 365 366 367 368
                FactTextField {
                    width:      _fieldWidth
                    fact:       battVoltMult
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
369

370 371 372
                QGCButton {
                    text:       qsTr("Calculate")
                    visible:    _showAdvanced
DonLakeFlyer's avatar
DonLakeFlyer committed
373 374 375 376 377 378 379

                    onClicked: {
                        _calcVoltageDlgVehicleVoltage = vehicleVoltage
                        _calcVoltageDlgBattVoltMultParam = battVoltMult
                        showDialog(calcVoltageMultiplierDlgComponent, qsTr("Calculate Voltage Multiplier"), qgcView.showDialogDefaultWidth, StandardButton.Close)
                    }

380
                }
381

382 383 384 385 386 387 388 389
                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
                }
390

391 392 393 394
                QGCLabel {
                    text:       qsTr("Amps per volt:")
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
395

396 397 398 399 400
                FactTextField {
                    width:      _fieldWidth
                    fact:       battAmpPerVolt
                    visible:    _showAdvanced
                }
401

402 403 404
                QGCButton {
                    text:       qsTr("Calculate")
                    visible:    _showAdvanced
DonLakeFlyer's avatar
DonLakeFlyer committed
405 406 407 408 409 410

                    onClicked: {
                        _calcAmpsPerVoltDlgVehicleCurrent = vehicleCurrent
                        _calcAmpsPerVoltDlgBattAmpPerVoltParam = battAmpPerVolt
                        showDialog(calcAmpsPerVoltDlgComponent, qsTr("Calculate Amps per Volt"), qgcView.showDialogDefaultWidth, StandardButton.Close)
                    }
411
                }
412

413 414 415 416 417 418
                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
419
                    visible:            _showAdvanced
420 421 422
                }
            } // GridLayout
        } // Column
DonLakeFlyer's avatar
DonLakeFlyer committed
423 424
    } // Component - powerSetupComponent

DonLakeFlyer's avatar
DonLakeFlyer committed
425 426 427 428
    // Must be set prior to use of calcVoltageMultiplierDlgComponent
    property Fact _calcVoltageDlgVehicleVoltage
    property Fact _calcVoltageDlgBattVoltMultParam

DonLakeFlyer's avatar
DonLakeFlyer committed
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
    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
462
                        FactLabel { fact: _calcVoltageDlgVehicleVoltage }
DonLakeFlyer's avatar
DonLakeFlyer committed
463 464

                        QGCLabel { text: qsTr("Voltage multiplier:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
465
                        FactLabel { fact: _calcVoltageDlgBattVoltMultParam }
DonLakeFlyer's avatar
DonLakeFlyer committed
466 467 468 469 470 471 472 473 474 475
                    }

                    QGCButton {
                        text: "Calculate"

                        onClicked:  {
                            var measuredVoltageValue = parseFloat(measuredVoltage.text)
                            if (measuredVoltageValue == 0 || isNaN(measuredVoltageValue)) {
                                return
                            }
DonLakeFlyer's avatar
DonLakeFlyer committed
476
                            var newVoltageMultiplier = (measuredVoltageValue * _calcVoltageDlgBattVoltMultParam.value) / _calcVoltageDlgVehicleVoltage.value
DonLakeFlyer's avatar
DonLakeFlyer committed
477
                            if (newVoltageMultiplier > 0) {
DonLakeFlyer's avatar
DonLakeFlyer committed
478
                                _calcVoltageDlgBattVoltMultParam.value = newVoltageMultiplier
DonLakeFlyer's avatar
DonLakeFlyer committed
479 480 481 482 483 484 485 486
                            }
                        }
                    }
                } // Column
            } // QGCFlickable
        } // QGCViewDialog
    } // Component - calcVoltageMultiplierDlgComponent

DonLakeFlyer's avatar
DonLakeFlyer committed
487 488 489 490
    // Must be set prior to use of calcAmpsPerVoltDlgComponent
    property Fact _calcAmpsPerVoltDlgVehicleCurrent
    property Fact _calcAmpsPerVoltDlgBattAmpPerVoltParam

DonLakeFlyer's avatar
DonLakeFlyer committed
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
    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
524
                        FactLabel { fact: _calcAmpsPerVoltDlgVehicleCurrent }
DonLakeFlyer's avatar
DonLakeFlyer committed
525 526

                        QGCLabel { text: qsTr("Amps per volt:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
527
                        FactLabel { fact: _calcAmpsPerVoltDlgBattAmpPerVoltParam }
DonLakeFlyer's avatar
DonLakeFlyer committed
528 529 530 531 532 533 534 535 536 537
                    }

                    QGCButton {
                        text: "Calculate"

                        onClicked:  {
                            var measuredCurrentValue = parseFloat(measuredCurrent.text)
                            if (measuredCurrentValue == 0) {
                                return
                            }
DonLakeFlyer's avatar
DonLakeFlyer committed
538
                            var newAmpsPerVolt = (measuredCurrentValue * _calcAmpsPerVoltDlgBattAmpPerVoltParam.value) / _calcAmpsPerVoltDlgVehicleCurrent.value
DonLakeFlyer's avatar
DonLakeFlyer committed
539
                            if (newAmpsPerVolt != 0) {
DonLakeFlyer's avatar
DonLakeFlyer committed
540
                                _calcAmpsPerVoltDlgBattAmpPerVoltParam.value = newAmpsPerVolt
DonLakeFlyer's avatar
DonLakeFlyer committed
541 542 543 544 545 546 547
                            }
                        }
                    }
                } // Column
            } // QGCFlickable
        } // QGCViewDialog
    } // Component - calcAmpsPerVoltDlgComponent
548
} // SetupPage