APMPowerComponent.qml 14.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

26
    Component {
27 28 29 30 31
        id: powerPageComponent

        Column {
            spacing: _margins

32
            property Fact armVoltMin:       controller.getParameterFact(-1, "r.ARMING_VOLT_MIN")
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
            property Fact battAmpPerVolt:   controller.getParameterFact(-1, "BATT_AMP_PERVOLT")
            property Fact battCapacity:     controller.getParameterFact(-1, "BATT_CAPACITY")
            property Fact battCurrPin:      controller.getParameterFact(-1, "BATT_CURR_PIN")
            property Fact battMonitor:      controller.getParameterFact(-1, "BATT_MONITOR")
            property Fact battVoltMult:     controller.getParameterFact(-1, "BATT_VOLT_MULT")
            property Fact battVoltPin:      controller.getParameterFact(-1, "BATT_VOLT_PIN")

            property real _margins:         ScreenTools.defaultFontPixelHeight / 2
            property bool _showAdvanced:    sensorCombo.currentIndex == sensorModel.count - 1
            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
            }
58

59
            QGCPalette { id: palette; colorGroupEnabled: true }
60

61 62 63 64
            FactPanelController {
                id:         controller
                factPanel:  powerPage.viewPanel
            }
65

66 67
            ListModel {
                id: sensorModel
68

69 70 71 72 73 74 75
                ListElement {
                    text:       qsTr("Power Module 90A")
                    voltPin:    2
                    currPin:    3
                    voltMult:   10.1
                    ampPerVolt: 17.0
                }
76

77 78 79 80 81 82 83
                ListElement {
                    text:       qsTr("Power Module HV")
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 39.877
                }
84

85
                ListElement {
86
                    text:       qsTr("3DR Iris")
87 88 89 90 91
                    voltPin:    2
                    currPin:    3
                    voltMult:   12.02
                    ampPerVolt: 17.0
                }
92

93 94 95 96
                ListElement {
                    text:       qsTr("Other")
                }
            }
97

98 99
            Component {
                id: calcVoltageMultiplierDlgComponent
100

101 102
                QGCViewDialog {
                    id: calcVoltageMultiplierDlg
103

104 105 106 107
                    QGCFlickable {
                        anchors.fill:   parent
                        contentHeight:  column.height
                        contentWidth:   column.width
108

109 110 111 112
                        Column {
                            id:         column
                            width:      calcVoltageMultiplierDlg.width
                            spacing:    ScreenTools.defaultFontPixelHeight
113

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

120 121 122 123
                            Grid {
                                columns: 2
                                spacing: ScreenTools.defaultFontPixelHeight / 2
                                verticalItemAlignment: Grid.AlignVCenter
124

125
                                QGCLabel {
126
                                    text: qsTr("Measured voltage:")
127 128
                                }
                                QGCTextField { id: measuredVoltage }
129

130
                                QGCLabel { text: qsTr("Vehicle voltage:") }
131
                                QGCLabel { text: controller.vehicle.battery.voltage.valueString }
132

133
                                QGCLabel { text: qsTr("Voltage multiplier:") }
134 135
                                FactLabel { fact: battVoltMult }
                            }
136

137 138 139 140 141
                            QGCButton {
                                text: "Calculate"

                                onClicked:  {
                                    var measuredVoltageValue = parseFloat(measuredVoltage.text)
142
                                    if (measuredVoltageValue == 0 || isNaN(measuredVoltageValue)) {
143 144 145
                                        return
                                    }
                                    var newVoltageMultiplier = (measuredVoltageValue * battVoltMult.value) / controller.vehicle.battery.voltage.value
146
                                    if (newVoltageMultiplier > 0) {
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
                                        battVoltMult.value = newVoltageMultiplier
                                    }
                                }
                            }
                        } // Column
                    } // QGCFlickable
                } // QGCViewDialog
            } // Component - calcVoltageMultiplierDlgComponent

            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
175
                                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.")
176
                            }
177

178 179 180 181
                            Grid {
                                columns: 2
                                spacing: ScreenTools.defaultFontPixelHeight / 2
                                verticalItemAlignment: Grid.AlignVCenter
182

183
                                QGCLabel {
184
                                    text: qsTr("Measured current:")
185 186
                                }
                                QGCTextField { id: measuredCurrent }
187

188
                                QGCLabel { text: qsTr("Vehicle current:") }
189
                                QGCLabel { text: controller.vehicle.battery.current.valueString }
190

191
                                QGCLabel { text: qsTr("Amps per volt:") }
192
                                FactLabel { fact: battAmpPerVolt }
193
                            }
194 195 196 197 198 199 200 201 202 203 204 205 206 207

                            QGCButton {
                                text: "Calculate"

                                onClicked:  {
                                    var measuredCurrentValue = parseFloat(measuredCurrent.text)
                                    if (measuredCurrentValue == 0) {
                                        return
                                    }
                                    var newAmpsPerVolt = (measuredCurrentValue * battAmpPerVolt.value) / controller.vehicle.battery.current.value
                                    if (newAmpsPerVolt != 0) {
                                        battAmpPerVolt.value = newAmpsPerVolt
                                    }
                                }
208
                            }
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
                        } // Column
                    } // QGCFlickable
                } // QGCViewDialog
            } // Component - calcAmpsPerVoltDlgComponent

            GridLayout {
                columns:        3
                rowSpacing:     _margins
                columnSpacing:  _margins

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

                FactComboBox {
                    id:                     monitorCombo
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battMonitor
                    indexModel:             false
                }
Don Gagne's avatar
Don Gagne committed
227

228 229 230 231 232
                QGCLabel {
                    Layout.row:     1
                    Layout.column:  0
                    text:           qsTr("Battery capacity:")
                }
Don Gagne's avatar
Don Gagne committed
233

234 235 236 237 238
                FactTextField {
                    id:     capacityField
                    width:  _fieldWidth
                    fact:   battCapacity
                }
Don Gagne's avatar
Don Gagne committed
239

240 241 242
                QGCLabel {
                    Layout.row:     2
                    Layout.column:  0
243 244 245 246 247 248 249 250 251 252 253 254
                    text:           qsTr("Minimum arming voltage:")
                }

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

                QGCLabel {
                    Layout.row:     3
                    Layout.column:  0
255 256
                    text:           qsTr("Power sensor:")
                }
Don Gagne's avatar
Don Gagne committed
257

258 259 260 261
                QGCComboBox {
                    id:                     sensorCombo
                    Layout.minimumWidth:    _fieldWidth
                    model:                  sensorModel
Don Gagne's avatar
Don Gagne committed
262

263 264 265 266 267 268 269
                    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
270

271
                        }
Don Gagne's avatar
Don Gagne committed
272 273 274
                    }
                }

275
                QGCLabel {
276
                    Layout.row:     4
277 278 279 280
                    Layout.column:  0
                    text:           qsTr("Current pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
281

282 283 284
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battCurrPin
285
                    indexModel:             false
286 287
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
288

289
                QGCLabel {
290
                    Layout.row:     5
291 292 293 294
                    Layout.column:  0
                    text:           qsTr("Voltage pin:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
295

296 297 298 299 300 301
                FactComboBox {
                    Layout.minimumWidth:    _fieldWidth
                    fact:                   battVoltPin
                    indexModel:             false
                    visible:                _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
302

303
                QGCLabel {
304
                    Layout.row:     6
305 306 307 308
                    Layout.column:  0
                    text:           qsTr("Voltage multiplier:")
                    visible:        _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
309

310 311 312 313 314
                FactTextField {
                    width:      _fieldWidth
                    fact:       battVoltMult
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
315

316 317 318 319 320
                QGCButton {
                    text:       qsTr("Calculate")
                    onClicked:  showDialog(calcVoltageMultiplierDlgComponent, qsTr("Calculate Voltage Multiplier"), qgcView.showDialogDefaultWidth, StandardButton.Close)
                    visible:    _showAdvanced
                }
321

322 323 324 325 326 327 328 329
                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
                }
330

331 332 333 334
                QGCLabel {
                    text:       qsTr("Amps per volt:")
                    visible:    _showAdvanced
                }
Don Gagne's avatar
Don Gagne committed
335

336 337 338 339 340
                FactTextField {
                    width:      _fieldWidth
                    fact:       battAmpPerVolt
                    visible:    _showAdvanced
                }
341

342 343 344 345 346
                QGCButton {
                    text:       qsTr("Calculate")
                    onClicked:  showDialog(calcAmpsPerVoltDlgComponent, qsTr("Calculate Amps per Volt"), qgcView.showDialogDefaultWidth, StandardButton.Close)
                    visible:    _showAdvanced
                }
347

348 349 350 351 352 353 354 355 356 357 358 359
                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.")
                    visible:        _showAdvanced
                }
            } // GridLayout
        } // Column
    } // Component
} // SetupPage