PowerComponent.qml 19.1 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.
 *
 ****************************************************************************/
dogmaphobic's avatar
dogmaphobic committed
9 10 11 12 13 14 15 16


/// @file
///     @brief Battery, propeller and magnetometer settings
///     @author Gus Grubba <mavlink@grubba.com>

import QtQuick 2.2
import QtQuick.Controls 1.2
17
import QtQuick.Dialogs 1.2
dogmaphobic's avatar
dogmaphobic committed
18 19 20 21 22

import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
23
import QGroundControl.ScreenTools 1.0
24
import QGroundControl.Controllers 1.0
dogmaphobic's avatar
dogmaphobic committed
25

26
QGCView {
27 28 29
    id:         rootQGCView
    viewPanel:  panel

30
    property int textEditWidth:    ScreenTools.defaultFontPixelWidth * 8
31 32 33 34 35

    property Fact battNumCells:     controller.getParameterFact(-1, "BAT_N_CELLS")
    property Fact battHighVolt:     controller.getParameterFact(-1, "BAT_V_CHARGED")
    property Fact battLowVolt:      controller.getParameterFact(-1, "BAT_V_EMPTY")
    property Fact battVoltLoadDrop: controller.getParameterFact(-1, "BAT_V_LOAD_DROP")
dogmaphobic's avatar
dogmaphobic committed
36
    property Fact uavcanEnable:     controller.getParameterFact(-1, "UAVCAN_ENABLE", false)
37

dogmaphobic's avatar
dogmaphobic committed
38 39 40 41
    readonly property string highlightPrefix:   "<font color=\"" + qgcPal.warningText + "\">"
    readonly property string highlightSuffix:   "</font>"


42 43 44
    function getBatteryImage()
    {
        switch(battNumCells.value) {
45 46 47 48 49 50 51
            case 1:  return "/qmlimages/PowerComponentBattery_01cell.svg";
            case 2:  return "/qmlimages/PowerComponentBattery_02cell.svg"
            case 3:  return "/qmlimages/PowerComponentBattery_03cell.svg"
            case 4:  return "/qmlimages/PowerComponentBattery_04cell.svg"
            case 5:  return "/qmlimages/PowerComponentBattery_05cell.svg"
            case 6:  return "/qmlimages/PowerComponentBattery_06cell.svg"
            default: return "/qmlimages/PowerComponentBattery_01cell.svg";
52 53 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
        }
    }

    function drawArrowhead(ctx, x, y, radians)
    {
        ctx.save();
        ctx.beginPath();
        ctx.translate(x,y);
        ctx.rotate(radians);
        ctx.moveTo(0,0);
        ctx.lineTo(5,10);
        ctx.lineTo(-5,10);
        ctx.closePath();
        ctx.restore();
        ctx.fill();
    }

    function drawLineWithArrow(ctx, x1, y1, x2, y2)
    {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);
        ctx.stroke();
        var rd = Math.atan((y2 - y1) / (x2 - x1));
        rd += ((x2 > x1) ? 90 : -90) * Math.PI/180;
        drawArrowhead(ctx, x2, y2, rd);
    }

    PowerComponentController {
        id:         controller
        factPanel:  panel

84 85 86 87 88 89 90
        onOldFirmware:          showMessage(qsTr("ESC Calibration"), qsTr("QGroundControl cannot perform ESC Calibration with this version of firmware. You will need to upgrade to a newer firmware."), StandardButton.Ok)
        onNewerFirmware:        showMessage(qsTr("ESC Calibration"), qsTr("QGroundControl cannot perform ESC Calibration with this version of firmware. You will need to upgrade QGroundControl."), StandardButton.Ok)
        onBatteryConnected:     showMessage(qsTr("ESC Calibration"), qsTr("Performing calibration. This will take a few seconds.."), 0)
        onCalibrationFailed:    showMessage(qsTr("ESC Calibration failed"), errorMessage, StandardButton.Ok)
        onCalibrationSuccess:   showMessage(qsTr("ESC Calibration"), qsTr("Calibration complete. You can disconnect your battery now if you like."), StandardButton.Ok)
        onConnectBattery:       showMessage(qsTr("ESC Calibration"), highlightPrefix + qsTr("WARNING: Props must be removed from vehicle prior to performing ESC calibration.") + highlightSuffix + qsTr(" Connect the battery now and calibration will begin."), 0)
        onDisconnectBattery:    showMessage(qsTr("ESC Calibration failed"), qsTr("You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again."), StandardButton.Ok)
91 92 93 94 95 96 97 98
    }

    QGCPalette { id: palette; colorGroupEnabled: panel.enabled }

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent

Don Gagne's avatar
Don Gagne committed
99
        QGCFlickable {
100
            anchors.fill:       parent
dogmaphobic's avatar
dogmaphobic committed
101
            clip:               true
102
            contentHeight:      innerColumn.height
Don Gagne's avatar
Don Gagne committed
103
                contentWidth:       panel.width
dogmaphobic's avatar
dogmaphobic committed
104
            flickableDirection: Flickable.VerticalFlick
105 106 107

            Column {
                id:             innerColumn
Don Gagne's avatar
Don Gagne committed
108
                width:          parent.width
dogmaphobic's avatar
dogmaphobic committed
109
                spacing:        ScreenTools.defaultFontPixelHeight * 0.5
110 111

                QGCLabel {
112
                    text: qsTr("Battery")
113
                    font.family: ScreenTools.demiboldFontFamily
114
                }
115

116 117 118 119
                Rectangle {
                    width:  parent.width
                    height: voltageCol.height + ScreenTools.defaultFontPixelHeight
                    color:  palette.windowShade
120

121 122 123 124 125 126
                    Column {
                        id:                 voltageCol
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelHeight / 2
127

128
                        property real firstColumnWidth: Math.max(Math.max(cellsLabel.contentWidth, battHighLabel.contentWidth), battLowLabel.contentWidth) + ScreenTools.defaultFontPixelWidth
129

130 131
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth
132

133 134
                            QGCLabel {
                                id:                 cellsLabel
135
                                text:               qsTr("Number of Cells (in Series)")
136 137
                                anchors.baseline:   cellsField.baseline
                            }
138

139 140 141 142 143 144 145
                            FactTextField {
                                id:         cellsField
                                x:          voltageCol.firstColumnWidth
                                width:      textEditWidth
                                fact:       battNumCells
                                showUnits: true
                            }
146
                        }
147

148 149 150 151 152
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth

                            QGCLabel {
                                id:                 battHighLabel
153
                                text:               qsTr("Full Voltage (per cell)")
154 155 156 157 158 159 160 161 162 163
                                anchors.baseline:   battHighField.baseline
                                }

                            FactTextField {
                                id:         battHighField
                                x:          voltageCol.firstColumnWidth
                                width:      textEditWidth
                                fact:       battHighVolt
                                showUnits:  true
                            }
164 165
                        }

166 167
                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth
168

169 170
                            QGCLabel {
                                id:                 battLowLabel
171
                                text:               qsTr("Empty Voltage (per cell)")
172
                                anchors.baseline:   battLowField.baseline
173
                            }
174

175 176 177 178 179 180 181
                            FactTextField {
                                id:         battLowField
                                x:          voltageCol.firstColumnWidth
                                width:      textEditWidth
                                fact:       battLowVolt
                                showUnits:  true
                            }
182
                        }
183 184 185 186 187
                    } // Column

                    QGCColoredImage {
                        id:                     batteryImage
                        anchors.verticalCenter: voltageCol.verticalCenter
Don Gagne's avatar
Don Gagne committed
188
                        x:                      voltageCol.firstColumnWidth + textEditWidth + (ScreenTools.defaultFontPixelWidth * 2)
189 190
                        width:                  height * 0.75
                        height:                 voltageCol.height
dogmaphobic's avatar
dogmaphobic committed
191
                        sourceSize.height:      height
192 193
                        fillMode:               Image.PreserveAspectFit
                        smooth:                 true
194
                        color:                  palette.text
195 196
                        cache:                  false
                        source:                 getBatteryImage();
197 198
                    }

199
                    Column {
Don Gagne's avatar
Don Gagne committed
200 201
                        id:                     batteryMinMaxColumn
                        anchors.leftMargin:     ScreenTools.defaultFontPixelWidth
202 203 204
                        anchors.left:           batteryImage.right
                        anchors.verticalCenter: voltageCol.verticalCenter
                        spacing:                ScreenTools.defaultFontPixelHeight
Don Gagne's avatar
Don Gagne committed
205 206 207

                        property real firstColumnWidth: Math.max(batteryMaxLabel.width, batteryMinLabel.contentWidth) + ScreenTools.defaultFontPixelWidth

dogmaphobic's avatar
dogmaphobic committed
208
                        Row {
Don Gagne's avatar
Don Gagne committed
209 210
                            spacing: ScreenTools.defaultFontPixelWidth

dogmaphobic's avatar
dogmaphobic committed
211
                            QGCLabel {
Don Gagne's avatar
Don Gagne committed
212
                                id:     batteryMaxLabel
213
                                text:   qsTr("Battery Max:")
dogmaphobic's avatar
dogmaphobic committed
214
                            }
Don Gagne's avatar
Don Gagne committed
215

dogmaphobic's avatar
dogmaphobic committed
216
                            QGCLabel {
Don Gagne's avatar
Don Gagne committed
217
                                x:      batteryMinMaxColumn.firstColumnWidth
dogmaphobic's avatar
dogmaphobic committed
218 219
                                text:   (battNumCells.value * battHighVolt.value).toFixed(1) + ' V'
                            }
220
                        }
dogmaphobic's avatar
dogmaphobic committed
221
                        Row {
Don Gagne's avatar
Don Gagne committed
222 223
                            spacing: ScreenTools.defaultFontPixelWidth

dogmaphobic's avatar
dogmaphobic committed
224
                            QGCLabel {
Don Gagne's avatar
Don Gagne committed
225
                                id:     batteryMinLabel
226
                                text:   qsTr("Battery Min:")
dogmaphobic's avatar
dogmaphobic committed
227
                            }
Don Gagne's avatar
Don Gagne committed
228

dogmaphobic's avatar
dogmaphobic committed
229
                            QGCLabel {
Don Gagne's avatar
Don Gagne committed
230
                                x:      batteryMinMaxColumn.firstColumnWidth
dogmaphobic's avatar
dogmaphobic committed
231 232
                                text:   (battNumCells.value * battLowVolt.value).toFixed(1) + ' V'
                            }
233
                        }
dogmaphobic's avatar
dogmaphobic committed
234
                    }
235 236 237
                } // Rectangle - Battery settings

                QGCLabel {
238
                    text:           qsTr("ESC PWM Minimum and Maximum Calibration")
239
                    font.family:    ScreenTools.demiboldFontFamily
240
                }
241

242 243 244 245
                Rectangle {
                    width:  parent.width
                    height: escCalColumn.height + ScreenTools.defaultFontPixelHeight
                    color:  palette.windowShade
246

247 248 249 250
                    Column {
                        id :                escCalColumn
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
Don Gagne's avatar
Don Gagne committed
251
                        anchors.right:      parent.right
252 253
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelWidth
254

255
                        QGCLabel {
Don Gagne's avatar
Don Gagne committed
256 257 258 259
                            width:      parent.width
                            color:      palette.warningText
                            wrapMode:   Text.WordWrap
                            text:       qsTr("WARNING: Propellers must be removed from vehicle prior to performing ESC calibration.")
260
                        }
Don Gagne's avatar
Don Gagne committed
261

262
                        QGCLabel {
263
                            text: qsTr("You must use USB connection for this operation.")
264
                        }
265

266
                        QGCButton {
267
                            text:       qsTr("Calibrate")
dogmaphobic's avatar
dogmaphobic committed
268
                            width:      ScreenTools.defaultFontPixelWidth * 20
269 270
                            onClicked:  controller.calibrateEsc()
                        }
dogmaphobic's avatar
dogmaphobic committed
271
                    }
272
                }
273

dogmaphobic's avatar
dogmaphobic committed
274
                QGCCheckBox {
dogmaphobic's avatar
dogmaphobic committed
275 276
                    id:         showUAVCAN
                    text:       qsTr("Show UAVCAN Settings")
Lorenz Meier's avatar
Lorenz Meier committed
277
                    visible:    uavcanEnable !== -1
dogmaphobic's avatar
dogmaphobic committed
278 279
                }

280
                QGCLabel {
281
                    text:           qsTr("UAVCAN Bus Configuration")
282
                    font.family:    ScreenTools.demiboldFontFamily
dogmaphobic's avatar
dogmaphobic committed
283
                    visible:        showUAVCAN.checked
284
                }
285

286
                Rectangle {
dogmaphobic's avatar
dogmaphobic committed
287 288 289 290
                    width:      parent.width
                    height:     uavCanConfigColumn.height + ScreenTools.defaultFontPixelHeight
                    color:      palette.windowShade
                    visible:    showUAVCAN.checked
291

292
                    Column {
293
                        id:                 uavCanConfigColumn
294 295 296 297
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelWidth
298

299 300 301
                        FactCheckBox {
                            id:                 uavcanEnabledCheckBox
                            width:              ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
302
                            fact:               uavcanEnable
303 304
                            checkedValue:       3
                            uncheckedValue:     0
305
                            text:               qsTr("Enable UAVCAN as the default MAIN output bus (requires autopilot restart)")
306
                        }
307 308 309 310
                    }
                }

                QGCLabel {
311
                    text:           qsTr("UAVCAN Motor Index and Direction Assignment")
312
                    font.family:    ScreenTools.demiboldFontFamily
dogmaphobic's avatar
dogmaphobic committed
313
                    visible:        showUAVCAN.checked
314 315 316
                }

                Rectangle {
dogmaphobic's avatar
dogmaphobic committed
317 318 319 320 321
                    width:      parent.width
                    height:     uavCanEscCalColumn.height + ScreenTools.defaultFontPixelHeight
                    color:      palette.windowShade
                    visible:    showUAVCAN.checked
                    enabled:    uavcanEnabledCheckBox.checked
322 323 324 325 326

                    Column {
                        id:                 uavCanEscCalColumn
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
Don Gagne's avatar
Don Gagne committed
327
                        anchors.right:      parent.right
328 329
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelWidth
330

331
                        QGCLabel {
Don Gagne's avatar
Don Gagne committed
332 333 334 335
                            width:      parent.width
                            wrapMode:   Text.WordWrap
                            color:      palette.warningText
                            text:       qsTr("WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration.")
336 337
                        }

338
                        QGCLabel {
Don Gagne's avatar
Don Gagne committed
339 340 341
                            width:      parent.width
                            wrapMode:   Text.WordWrap
                            text:       qsTr("ESC parameters will only be accessible in the editor after assignment.")
342 343 344
                        }

                        QGCLabel {
Don Gagne's avatar
Don Gagne committed
345 346 347
                            width:      parent.width
                            wrapMode:   Text.WordWrap
                            text:       qsTr("Start the process, then turn each motor into its turn direction, in the order of their motor indices.")
348
                        }
349

350
                        QGCButton {
351
                            text:       qsTr("Start Assignment")
dogmaphobic's avatar
dogmaphobic committed
352
                            width:      ScreenTools.defaultFontPixelWidth * 20
353 354 355 356
                            onClicked:  controller.busConfigureActuators()
                        }

                        QGCButton {
357
                            text:       qsTr("Stop Assignment")
dogmaphobic's avatar
dogmaphobic committed
358
                            width:      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
359
                            onClicked:  controller.stopBusConfigureActuators()
360
                        }
361
                    }
362
                }
363

364 365
                QGCCheckBox {
                    id:     showAdvanced
366
                    text:   qsTr("Show Advanced Settings")
367
                }
368

369
                QGCLabel {
370
                    text:           qsTr("Advanced Power Settings")
371
                    font.family:    ScreenTools.demiboldFontFamily
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
                    visible:        showAdvanced.checked
                }

                Rectangle {
                    id:         batteryRectangle
                    width:      parent.width
                    height:     advBatteryColumn.height + ScreenTools.defaultFontPixelHeight
                    color:      palette.windowShade
                    visible:    showAdvanced.checked

                    Column {
                        id: advBatteryColumn
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
                        anchors.right:      parent.right
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelWidth

                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth

                            QGCLabel {
394
                                text:               qsTr("Voltage Drop on Full Load (per cell)")
395 396 397 398 399 400 401 402 403
                                anchors.baseline:   battDropField.baseline
                            }

                            FactTextField {
                                id:         battDropField
                                width:      textEditWidth
                                fact:       battVoltLoadDrop
                                showUnits:  true
                            }
404
                        }
405

406
                        QGCLabel {
407 408
                            width:      parent.width
                            wrapMode:   Text.WordWrap
409 410 411
                            text:       qsTr("Batteries show less voltage at high throttle. Enter the difference in Volts between idle throttle and full ") +
                                        qsTr("throttle, divided by the number of battery cells. Leave at the default if unsure. ") +
                                            highlightPrefix + qsTr("If this value is set too high, the battery might be deep discharged and damaged.") + highlightSuffix
412 413 414 415 416 417
                        }

                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth

                            QGCLabel {
418
                                text: qsTr("Compensated Minimum Voltage:")
419 420 421
                            }

                            QGCLabel {
422
                                text: ((battNumCells.value * battLowVolt.value) - (battNumCells.value * battVoltLoadDrop.value)).toFixed(1) + qsTr(" V")
423
                            }
424 425
                        }
                    }
426 427
                } // Rectangle - Advanced power settings
            } // Column
Don Gagne's avatar
Don Gagne committed
428
        } // QGCFlickable
429
    } // QGCViewPanel
430
} // QGCView