APMPowerComponent.qml 28 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8
 *
 * 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 bool _escCalibrationAvailable: controller.parameterExists(-1, "ESC_CALIBRATION")
            property Fact _escCalibration:          controller.getParameterFact(-1, "ESC_CALIBRATION", false /* reportMissing */)
49 50

            property string _restartRequired: qsTr("Requires vehicle reboot")
51 52 53

            QGCPalette { id: ggcPal; colorGroupEnabled: true }

54
            // Battery1 Monitor settings only - used when only monitor param is available
55 56
            Column {
                spacing: _margins / 2
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
                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
90 91 92 93 94 95 96
                            visible:    _showBatt1Reboot
                        }

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

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

                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
123 124
                        sourceComponent:    _batt1FullSettings.visible ? powerSetupComponent : undefined

125
                        property Fact armVoltMin:       controller.getParameterFact(-1, "r.BATT_ARM_VOLT", false /* reportMissing */)
126
                        property Fact battAmpPerVolt:   controller.getParameterFact(-1, "r.BATT_AMP_PERVLT", false /* reportMissing */)
127
                        property Fact battAmpOffset:    controller.getParameterFact(-1, "BATT_AMP_OFFSET", false /* reportMissing */)
128 129 130 131 132
                        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 */)
133 134 135 136
                        property Fact vehicleVoltage:   controller.vehicle.battery.voltage
                        property Fact vehicleCurrent:   controller.vehicle.battery.current
                    }
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
137 138
            }

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

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

                Rectangle {
150 151
                    width:  batt2Column.x + batt2Column.width + _margins
                    height: batt2Column.y + batt2Column.height + _margins
152 153
                    color:  ggcPal.windowShade

154 155
                    ColumnLayout {
                        id:                 batt2Column
156 157 158 159 160
                        anchors.margins:    _margins
                        anchors.top:        parent.top
                        anchors.left:       parent.left
                        spacing:            ScreenTools.defaultFontPixelWidth

161 162 163 164 165 166 167 168 169 170 171 172 173 174
                        RowLayout {
                            id:                 batt2MonitorRow
                            spacing:            ScreenTools.defaultFontPixelWidth

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

                        QGCLabel {
                            text:       _restartRequired
175 176 177 178 179 180 181
                            visible:    _showBatt2Reboot
                        }

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

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

                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
208
                        sourceComponent:    batt2FullSettings.visible ? powerSetupComponent : undefined
209

210
                        property Fact armVoltMin:       controller.getParameterFact(-1, "r.BATT2_ARM_VOLT", false /* reportMissing */)
211
                        property Fact battAmpPerVolt:   controller.getParameterFact(-1, "r.BATT2_AMP_PERVLT", false /* reportMissing */)
212
                        property Fact battAmpOffset:    controller.getParameterFact(-1, "BATT2_AMP_OFFSET", false /* reportMissing */)
213 214 215 216 217 218 219 220 221
                        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
                    }
                }
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
            }

            Column {
                spacing:    _margins / 2
                visible:    _escCalibrationAvailable

                QGCLabel {
                    text:       qsTr("ESC Calibration")
                    font.family: ScreenTools.demiboldFontFamily
                }

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

                    Column {
                        id:         escCalibrationHolder
                        x:          _margins
                        y:          _margins
                        spacing:    _margins

                        Column {
                            spacing: _margins

                            QGCLabel {
                                text:   qsTr("WARNING: Remove props prior to calibration!")
                                color:  qgcPal.warningText
                            }

                            Row {
                                spacing: _margins

                                QGCButton {
                                    text: qsTr("Calibrate")
257 258
                                    enabled:    _escCalibration && _escCalibration.rawValue === 0
                                    onClicked:  if(_escCalibration) _escCalibration.rawValue = 3
259 260 261
                                }

                                Column {
262 263
                                    enabled: _escCalibration && _escCalibration.rawValue === 3
                                    QGCLabel { text:   _escCalibration ? (_escCalibration.rawValue === 3 ? qsTr("Now perform these steps:") : qsTr("Click Calibrate to start, then:")) : "" }
264 265 266 267 268
                                    QGCLabel { text:   qsTr("- Disconnect USB and battery so flight controller powers down") }
                                    QGCLabel { text:   qsTr("- Connect the battery") }
                                    QGCLabel { text:   qsTr("- The arming tone will be played (if the vehicle has a buzzer attached)") }
                                    QGCLabel { text:   qsTr("- If using a flight controller with a safety button press it until it displays solid red") }
                                    QGCLabel { text:   qsTr("- You will hear a musical tone then two beeps") }
269
                                    QGCLabel { text:   qsTr("- A few seconds later you should hear a number of beeps (one for each battery cell you're using)") }
270 271 272 273 274 275
                                    QGCLabel { text:   qsTr("- And finally a single long beep indicating the end points have been set and the ESC is calibrated") }
                                    QGCLabel { text:   qsTr("- Disconnect the battery and power up again normally") }
                                }
                            }
                        }
                    }
276
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
277
            }
278
        } // Flow
DonLakeFlyer's avatar
DonLakeFlyer committed
279 280 281 282 283 284 285
    } // Component - powerPageComponent

    Component {
        id: powerSetupComponent

        Column {
            spacing: _margins
286 287

            property real _margins:         ScreenTools.defaultFontPixelHeight / 2
DonLakeFlyer's avatar
DonLakeFlyer committed
288
            property bool _showAdvanced:    sensorCombo.currentIndex === sensorModel.count - 1
289 290 291 292 293 294 295 296 297
            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 &&
298 299
                            Math.abs(sensorModel.get(i).ampPerVolt - battAmpPerVolt.value) < 0.0001 &&
                            Math.abs(sensorModel.get(i).ampOffset - battAmpOffset.value) < 0.0001) {
300 301 302 303 304 305
                        sensorCombo.currentIndex = i
                        return
                    }
                }
                sensorCombo.currentIndex = sensorModel.count - 1
            }
306

307
            QGCPalette { id: palette; colorGroupEnabled: true }
308

309 310
            ListModel {
                id: sensorModel
311

312 313 314 315 316 317
                ListElement {
                    text:       qsTr("Power Module 90A")
                    voltPin:    2
                    currPin:    3
                    voltMult:   10.1
                    ampPerVolt: 17.0
318
                    ampOffset:  0
319
                }
320

321 322 323 324 325 326
                ListElement {
                    text:       qsTr("Power Module HV")
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 39.877
327
                    ampOffset:  0
328
                }
329

330
                ListElement {
331
                    text:       qsTr("3DR Iris")
332 333 334 335
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 17.0
336
                    ampOffset:  0
337
                }
338

339 340 341 342 343 344 345 346 347
                ListElement {
                    text:       qsTr("Blue Robotics Power Sense Module R2")
                    voltPin:    2
                    currPin:    3
                    voltMult:   11.000
                    ampPerVolt: 37.8788
                    ampOffset:  0.330
                }

348 349 350 351
                ListElement {
                    text:       qsTr("Other")
                }
            }
352

353 354 355 356 357 358 359 360 361

            GridLayout {
                columns:        3
                rowSpacing:     _margins
                columnSpacing:  _margins

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

                FactComboBox {
DonLakeFlyer's avatar
DonLakeFlyer committed
362 363 364
                    id:         monitorCombo
                    fact:       battMonitor
                    indexModel: false
365
                }
Don Gagne's avatar
Don Gagne committed
366

367 368 369 370 371
                QGCLabel {
                    Layout.row:     1
                    Layout.column:  0
                    text:           qsTr("Battery capacity:")
                }
Don Gagne's avatar
Don Gagne committed
372

373 374 375 376 377
                FactTextField {
                    id:     capacityField
                    width:  _fieldWidth
                    fact:   battCapacity
                }
Don Gagne's avatar
Don Gagne committed
378

379 380 381
                QGCLabel {
                    Layout.row:     2
                    Layout.column:  0
382 383 384 385 386 387 388 389 390 391 392 393
                    text:           qsTr("Minimum arming voltage:")
                }

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

                QGCLabel {
                    Layout.row:     3
                    Layout.column:  0
394 395
                    text:           qsTr("Power sensor:")
                }
Don Gagne's avatar
Don Gagne committed
396

397 398 399 400
                QGCComboBox {
                    id:                     sensorCombo
                    Layout.minimumWidth:    _fieldWidth
                    model:                  sensorModel
401
                    textRole:               "text"
Don Gagne's avatar
Don Gagne committed
402

403 404 405 406 407 408
                    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
409
                            battAmpOffset.value = sensorModel.get(index).ampOffset
410
                        } else {
Don Gagne's avatar
Don Gagne committed
411

412
                        }
Don Gagne's avatar
Don Gagne committed
413 414 415
                    }
                }

416
                QGCLabel {
417
                    Layout.row:     4
418 419 420 421
                    Layout.column:  0
                    text:           qsTr("Current pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
422

423 424 425
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battCurrPin
426
                    indexModel:             false
427 428
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
429

430
                QGCLabel {
431
                    Layout.row:     5
432 433 434 435
                    Layout.column:  0
                    text:           qsTr("Voltage pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
436

437 438 439 440 441 442
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battVoltPin
                    indexModel:             false
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
443

444
                QGCLabel {
445
                    Layout.row:     6
446 447 448 449
                    Layout.column:  0
                    text:           qsTr("Voltage multiplier:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
450

451 452 453 454 455
                FactTextField {
                    width:      _fieldWidth
                    fact:       battVoltMult
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
456

457 458 459
                QGCButton {
                    text:       qsTr("Calculate")
                    visible:    _showAdvanced
DonLakeFlyer's avatar
DonLakeFlyer committed
460 461 462 463

                    onClicked: {
                        _calcVoltageDlgVehicleVoltage = vehicleVoltage
                        _calcVoltageDlgBattVoltMultParam = battVoltMult
464
                        mainWindow.showComponentDialog(calcVoltageMultiplierDlgComponent, qsTr("Calculate Voltage Multiplier"), mainWindow.showDialogDefaultWidth, StandardButton.Close)
DonLakeFlyer's avatar
DonLakeFlyer committed
465 466
                    }

467
                }
468

469 470 471 472 473 474 475 476
                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
                }
477

478 479 480 481
                QGCLabel {
                    text:       qsTr("Amps per volt:")
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
482

483 484 485 486 487
                FactTextField {
                    width:      _fieldWidth
                    fact:       battAmpPerVolt
                    visible:    _showAdvanced
                }
488

489 490 491
                QGCButton {
                    text:       qsTr("Calculate")
                    visible:    _showAdvanced
DonLakeFlyer's avatar
DonLakeFlyer committed
492 493 494 495

                    onClicked: {
                        _calcAmpsPerVoltDlgVehicleCurrent = vehicleCurrent
                        _calcAmpsPerVoltDlgBattAmpPerVoltParam = battAmpPerVolt
496
                        mainWindow.showComponentDialog(calcAmpsPerVoltDlgComponent, qsTr("Calculate Amps per Volt"), mainWindow.showDialogDefaultWidth, StandardButton.Close)
DonLakeFlyer's avatar
DonLakeFlyer committed
497
                    }
498
                }
499

500 501 502 503 504 505
                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
506
                    visible:            _showAdvanced
507
                }
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528

                QGCLabel {
                    text:       qsTr("Amps Offset:")
                    visible:    _showAdvanced
                }

                FactTextField {
                    width:      _fieldWidth
                    fact:       battAmpOffset
                    visible:    _showAdvanced
                }

                QGCLabel {
                    Layout.columnSpan:  3
                    Layout.fillWidth:   true
                    font.pointSize:     ScreenTools.smallFontPointSize
                    wrapMode:           Text.WordWrap
                    text:               qsTr("If the vehicle reports a high current read when there is little or no current going through it, adjust the Amps Offset. It should be equal to the voltage reported by the sensor when the current is zero.")
                    visible:            _showAdvanced
                }

529 530
            } // GridLayout
        } // Column
DonLakeFlyer's avatar
DonLakeFlyer committed
531 532
    } // Component - powerSetupComponent

DonLakeFlyer's avatar
DonLakeFlyer committed
533 534 535 536
    // Must be set prior to use of calcVoltageMultiplierDlgComponent
    property Fact _calcVoltageDlgVehicleVoltage
    property Fact _calcVoltageDlgBattVoltMultParam

DonLakeFlyer's avatar
DonLakeFlyer committed
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
    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
556
                        text:       qsTr("Measure battery voltage using an external voltmeter and enter the value below. Click Calculate to set the new adjusted voltage multiplier.")
DonLakeFlyer's avatar
DonLakeFlyer committed
557 558 559 560 561 562 563 564 565 566 567 568 569
                    }

                    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
570
                        FactLabel { fact: _calcVoltageDlgVehicleVoltage }
DonLakeFlyer's avatar
DonLakeFlyer committed
571 572

                        QGCLabel { text: qsTr("Voltage multiplier:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
573
                        FactLabel { fact: _calcVoltageDlgBattVoltMultParam }
DonLakeFlyer's avatar
DonLakeFlyer committed
574 575 576
                    }

                    QGCButton {
577
                        text: qsTr("Calculate And Set")
DonLakeFlyer's avatar
DonLakeFlyer committed
578 579 580 581 582 583

                        onClicked:  {
                            var measuredVoltageValue = parseFloat(measuredVoltage.text)
                            if (measuredVoltageValue == 0 || isNaN(measuredVoltageValue)) {
                                return
                            }
DonLakeFlyer's avatar
DonLakeFlyer committed
584
                            var newVoltageMultiplier = (measuredVoltageValue * _calcVoltageDlgBattVoltMultParam.value) / _calcVoltageDlgVehicleVoltage.value
DonLakeFlyer's avatar
DonLakeFlyer committed
585
                            if (newVoltageMultiplier > 0) {
DonLakeFlyer's avatar
DonLakeFlyer committed
586
                                _calcVoltageDlgBattVoltMultParam.value = newVoltageMultiplier
DonLakeFlyer's avatar
DonLakeFlyer committed
587 588 589 590 591 592 593 594
                            }
                        }
                    }
                } // Column
            } // QGCFlickable
        } // QGCViewDialog
    } // Component - calcVoltageMultiplierDlgComponent

DonLakeFlyer's avatar
DonLakeFlyer committed
595 596 597 598
    // Must be set prior to use of calcAmpsPerVoltDlgComponent
    property Fact _calcAmpsPerVoltDlgVehicleCurrent
    property Fact _calcAmpsPerVoltDlgBattAmpPerVoltParam

DonLakeFlyer's avatar
DonLakeFlyer committed
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631
    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
632
                        FactLabel { fact: _calcAmpsPerVoltDlgVehicleCurrent }
DonLakeFlyer's avatar
DonLakeFlyer committed
633 634

                        QGCLabel { text: qsTr("Amps per volt:") }
DonLakeFlyer's avatar
DonLakeFlyer committed
635
                        FactLabel { fact: _calcAmpsPerVoltDlgBattAmpPerVoltParam }
DonLakeFlyer's avatar
DonLakeFlyer committed
636 637 638
                    }

                    QGCButton {
639
                        text: qsTr("Calculate And Set")
DonLakeFlyer's avatar
DonLakeFlyer committed
640 641 642 643 644 645

                        onClicked:  {
                            var measuredCurrentValue = parseFloat(measuredCurrent.text)
                            if (measuredCurrentValue == 0) {
                                return
                            }
DonLakeFlyer's avatar
DonLakeFlyer committed
646
                            var newAmpsPerVolt = (measuredCurrentValue * _calcAmpsPerVoltDlgBattAmpPerVoltParam.value) / _calcAmpsPerVoltDlgVehicleCurrent.value
DonLakeFlyer's avatar
DonLakeFlyer committed
647
                            if (newAmpsPerVolt != 0) {
DonLakeFlyer's avatar
DonLakeFlyer committed
648
                                _calcAmpsPerVoltDlgBattAmpPerVoltParam.value = newAmpsPerVolt
DonLakeFlyer's avatar
DonLakeFlyer committed
649 650 651 652 653 654 655
                            }
                        }
                    }
                } // Column
            } // QGCFlickable
        } // QGCViewDialog
    } // Component - calcAmpsPerVoltDlgComponent
656
} // SetupPage