PowerComponent.qml 18.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
dogmaphobic's avatar
dogmaphobic committed
103 104
            contentWidth:       panel.width
            flickableDirection: Flickable.VerticalFlick
105 106 107

            Column {
                id:             innerColumn
dogmaphobic's avatar
dogmaphobic committed
108
                width:          panel.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 188 189 190
                    } // Column

                    QGCColoredImage {
                        id:                     batteryImage
                        anchors.verticalCenter: voltageCol.verticalCenter
                        x:                      voltageCol.firstColumnWidth + textEditWidth + (ScreenTools.defaultFontPixelWidth * 3)
                        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 200 201 202 203
                    Column {
                        anchors.leftMargin:     ScreenTools.defaultFontPixelWidth * 2
                        anchors.left:           batteryImage.right
                        anchors.verticalCenter: voltageCol.verticalCenter
                        spacing:                ScreenTools.defaultFontPixelHeight
dogmaphobic's avatar
dogmaphobic committed
204 205 206
                        Row {
                            QGCLabel {
                                width:  ScreenTools.defaultFontPixelWidth * 12
207
                                text:   qsTr("Battery Max:")
dogmaphobic's avatar
dogmaphobic committed
208 209 210 211
                            }
                            QGCLabel {
                                text:   (battNumCells.value * battHighVolt.value).toFixed(1) + ' V'
                            }
212
                        }
dogmaphobic's avatar
dogmaphobic committed
213 214 215
                        Row {
                            QGCLabel {
                                width:  ScreenTools.defaultFontPixelWidth * 12
216
                                text:   qsTr("Battery Min:")
dogmaphobic's avatar
dogmaphobic committed
217 218 219 220
                            }
                            QGCLabel {
                                text:   (battNumCells.value * battLowVolt.value).toFixed(1) + ' V'
                            }
221
                        }
dogmaphobic's avatar
dogmaphobic committed
222
                    }
223 224 225
                } // Rectangle - Battery settings

                QGCLabel {
226
                    text:           qsTr("ESC PWM Minimum and Maximum Calibration")
227
                    font.family:    ScreenTools.demiboldFontFamily
228
                }
229

230 231 232 233
                Rectangle {
                    width:  parent.width
                    height: escCalColumn.height + ScreenTools.defaultFontPixelHeight
                    color:  palette.windowShade
234

235 236 237 238 239 240
                    Column {
                        id :                escCalColumn
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelWidth
241

242 243
                        QGCLabel {
                            color:  palette.warningText
244
                            text:   qsTr("WARNING: Propellers must be removed from vehicle prior to performing ESC calibration.")
245
                        }
Don Gagne's avatar
Don Gagne committed
246

247
                        QGCLabel {
248
                            text: qsTr("You must use USB connection for this operation.")
249
                        }
250

251
                        QGCButton {
252
                            text:       qsTr("Calibrate")
dogmaphobic's avatar
dogmaphobic committed
253
                            width:      ScreenTools.defaultFontPixelWidth * 20
254 255
                            onClicked:  controller.calibrateEsc()
                        }
dogmaphobic's avatar
dogmaphobic committed
256
                    }
257
                }
258

dogmaphobic's avatar
dogmaphobic committed
259
                QGCCheckBox {
dogmaphobic's avatar
dogmaphobic committed
260 261
                    id:         showUAVCAN
                    text:       qsTr("Show UAVCAN Settings")
Lorenz Meier's avatar
Lorenz Meier committed
262
                    visible:    uavcanEnable !== -1
dogmaphobic's avatar
dogmaphobic committed
263 264
                }

265
                QGCLabel {
266
                    text:           qsTr("UAVCAN Bus Configuration")
267
                    font.family:    ScreenTools.demiboldFontFamily
dogmaphobic's avatar
dogmaphobic committed
268
                    visible:        showUAVCAN.checked
269
                }
270

271
                Rectangle {
dogmaphobic's avatar
dogmaphobic committed
272 273 274 275
                    width:      parent.width
                    height:     uavCanConfigColumn.height + ScreenTools.defaultFontPixelHeight
                    color:      palette.windowShade
                    visible:    showUAVCAN.checked
276

277
                    Column {
278
                        id:                 uavCanConfigColumn
279 280 281 282
                        anchors.margins:    ScreenTools.defaultFontPixelHeight / 2
                        anchors.left:       parent.left
                        anchors.top:        parent.top
                        spacing:            ScreenTools.defaultFontPixelWidth
283

284 285 286
                        FactCheckBox {
                            id:                 uavcanEnabledCheckBox
                            width:              ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
287
                            fact:               uavcanEnable
288 289
                            checkedValue:       3
                            uncheckedValue:     0
290
                            text:               qsTr("Enable UAVCAN as the default MAIN output bus (requires autopilot restart)")
291
                        }
292 293 294 295
                    }
                }

                QGCLabel {
296
                    text:           qsTr("UAVCAN Motor Index and Direction Assignment")
297
                    font.family:    ScreenTools.demiboldFontFamily
dogmaphobic's avatar
dogmaphobic committed
298
                    visible:        showUAVCAN.checked
299 300 301
                }

                Rectangle {
dogmaphobic's avatar
dogmaphobic committed
302 303 304 305 306
                    width:      parent.width
                    height:     uavCanEscCalColumn.height + ScreenTools.defaultFontPixelHeight
                    color:      palette.windowShade
                    visible:    showUAVCAN.checked
                    enabled:    uavcanEnabledCheckBox.checked
307 308 309 310 311 312 313

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

315
                        QGCLabel {
316
                            color:  palette.warningText
317
                            text:   qsTr("WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration.")
318 319
                        }

320
                        QGCLabel {
321
                            text: qsTr("ESC parameters will only be accessible in the editor after assignment.")
322 323 324
                        }

                        QGCLabel {
325
                            text: qsTr("Start the process, then turn each motor into its turn direction, in the order of their motor indices.")
326
                        }
327

328
                        QGCButton {
329
                            text:       qsTr("Start Assignment")
dogmaphobic's avatar
dogmaphobic committed
330
                            width:      ScreenTools.defaultFontPixelWidth * 20
331 332 333 334
                            onClicked:  controller.busConfigureActuators()
                        }

                        QGCButton {
335
                            text:       qsTr("Stop Assignment")
dogmaphobic's avatar
dogmaphobic committed
336
                            width:      ScreenTools.defaultFontPixelWidth * 20
dogmaphobic's avatar
dogmaphobic committed
337
                            onClicked:  controller.stopBusConfigureActuators()
338
                        }
339
                    }
340
                }
341

342 343
                QGCCheckBox {
                    id:     showAdvanced
344
                    text:   qsTr("Show Advanced Settings")
345
                }
346

347
                QGCLabel {
348
                    text:           qsTr("Advanced Power Settings")
349
                    font.family:    ScreenTools.demiboldFontFamily
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
                    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 {
372
                                text:               qsTr("Voltage Drop on Full Load (per cell)")
373 374 375 376 377 378 379 380 381
                                anchors.baseline:   battDropField.baseline
                            }

                            FactTextField {
                                id:         battDropField
                                width:      textEditWidth
                                fact:       battVoltLoadDrop
                                showUnits:  true
                            }
382
                        }
383

384
                        QGCLabel {
385 386
                            width:      parent.width
                            wrapMode:   Text.WordWrap
387 388 389
                            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
390 391 392 393 394 395
                        }

                        Row {
                            spacing: ScreenTools.defaultFontPixelWidth

                            QGCLabel {
396
                                text: qsTr("Compensated Minimum Voltage:")
397 398 399
                            }

                            QGCLabel {
400
                                text: ((battNumCells.value * battLowVolt.value) - (battNumCells.value * battVoltLoadDrop.value)).toFixed(1) + qsTr(" V")
401
                            }
402 403
                        }
                    }
404 405
                } // Rectangle - Advanced power settings
            } // Column
Don Gagne's avatar
Don Gagne committed
406
        } // QGCFlickable
407
    } // QGCViewPanel
408
} // QGCView