PowerComponent.qml 14.5 KB
Newer Older
dogmaphobic's avatar
dogmaphobic committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*=====================================================================

 QGroundControl Open Source Ground Control Station

 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

 This file is part of the QGROUNDCONTROL project

 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

 ======================================================================*/

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

import QtQuick 2.2
import QtQuick.Controls 1.2
30
import QtQuick.Dialogs 1.2
dogmaphobic's avatar
dogmaphobic committed
31 32 33 34 35

import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
36
import QGroundControl.ScreenTools 1.0
37
import QGroundControl.Controllers 1.0
dogmaphobic's avatar
dogmaphobic committed
38

39
QGCView {
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    id:         rootQGCView
    viewPanel:  panel

    property int firstColumnWidth: 220
    property int textEditWidth:    80

    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")

    property alias battHigh: battHighRow
    property alias battLow:  battLowRow

    function getBatteryImage()
    {
        switch(battNumCells.value) {
57 58 59 60 61 62 63
            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";
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
        }
    }

    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

        onOldFirmware:          showMessage("ESC Calibration", "QGroundControl cannot perform ESC Calibration with this version of firmware. You will need to upgrade to a newer firmware.", StandardButton.Ok)
        onNewerFirmware:        showMessage("ESC Calibration", "QGroundControl cannot perform ESC Calibration with this version of firmware. You will need to upgrade QGroundControl.", StandardButton.Ok)
        onBatteryConnected:     showMessage("ESC Calibration", "Performing calibration. This will take a few seconds..", 0)
        onCalibrationFailed:    showMessage("ESC Calibration failed", errorMessage, StandardButton.Ok)
        onCalibrationSuccess:   showMessage("ESC Calibration", "Calibration complete. You can disconnect your battery now if you like.", StandardButton.Ok)
Don Gagne's avatar
Don Gagne committed
101
        onConnectBattery:       showMessage("ESC Calibration", "<font color=\"yellow\">WARNING: Props must be removed from vehicle prior to performing ESC calibration.</font> Connect the battery now and calibration will begin.", 0)
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
        onDisconnectBattery:    showMessage("ESC Calibration failed", "You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again.", StandardButton.Ok)
    }

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

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent


        Column {
            anchors.fill: parent
            spacing: 10

            QGCLabel {
                text: "POWER CONFIG"
118
                font.pixelSize: ScreenTools.largeFontPixelSize
119 120
            }

121 122
            QGCLabel {
                text: "Battery"
123
                font.pixelSize: ScreenTools.mediumFontPixelSize
124 125
            }

126 127 128 129
            Rectangle {
                width: parent.width
                height: 120
                color: palette.windowShade
130

131 132 133 134 135
                Column {
                    id: batteryColumn
                    spacing: 10
                    anchors.verticalCenter: parent.verticalCenter
                    x: (parent.x + 20)
136

137
                    Row {
138
                        spacing: 10
139 140
                        Column {
                            id: voltageCol
141
                            spacing: 10
142
                            Row {
143
                                spacing: 10
144 145 146 147 148 149
                                QGCLabel { text: "Number of Cells (in Series)"; width: firstColumnWidth; anchors.baseline: cellsField.baseline}
                                FactTextField {
                                    id: cellsField
                                    width: textEditWidth
                                    fact: battNumCells
                                    showUnits: true
150
                                }
151 152 153 154 155 156 157 158 159 160
                            }
                            Row {
                                id: battHighRow
                                spacing: 10
                                QGCLabel { text: "Full Voltage (per cell)"; width: firstColumnWidth; anchors.baseline: battHighField.baseline}
                                FactTextField {
                                    id: battHighField
                                    width: textEditWidth
                                    fact: battHighVolt
                                    showUnits: true
161
                                }
162
                            }
163 164 165 166 167 168 169 170 171
                            Row {
                                id: battLowRow
                                spacing: 10
                                QGCLabel { text: "Empty Voltage (per cell)"; width: firstColumnWidth; anchors.baseline: battLowField.baseline}
                                FactTextField {
                                    id: battLowField
                                    width: textEditWidth
                                    fact: battLowVolt
                                    showUnits: true
172
                                }
173 174 175 176 177 178 179 180 181
                            }
                        }
                        Canvas {
                            id: arrows
                            height: voltageCol.height
                            width: 40
                            antialiasing: true
                            Connections {
                                target: ScreenTools
Don Gagne's avatar
Don Gagne committed
182
                                onRepaintRequested: {
183
                                    arrows.requestPaint();
184
                                }
185
                            }
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
                            onPaint: {
                                var y0 = voltageCol.mapFromItem(battHigh, 0, battHigh.height / 2).y;
                                var y1 = voltageCol.mapFromItem(battLow,  0, battLow.height  / 2).y;
                                var context = getContext("2d");
                                context.reset();
                                context.strokeStyle = palette.button;
                                context.fillStyle   = palette.button;
                                drawLineWithArrow(context, 0, y0, width, height * 0.25);
                                drawLineWithArrow(context, 0, y1, width, height * 0.85);
                            }
                        }
                        QGCColoredImage {
                            height:   voltageCol.height
                            width:    voltageCol.height * 0.75
                            source:   getBatteryImage();
                            fillMode: Image.PreserveAspectFit
                            smooth:   true
                            color:    palette.button
                            cache:    false
                        }
                        Item { width: 20; height: 1; }
                        Column {
                            spacing: 10
                            anchors.verticalCenter: parent.verticalCenter
                            Row {
                                spacing: 10
                                QGCLabel {
                                    text: "Battery Max:"
                                    width: 80
                                }
                                QGCLabel {
                                    text: (battNumCells.value * battHighVolt.value).toFixed(1) + ' V'
                                }
219
                            }
220
                            Row {
221
                                spacing: 10
222 223 224
                                QGCLabel {
                                    text: "Battery Min:"
                                    width: 80
225
                                }
226 227
                                QGCLabel {
                                    text: (battNumCells.value * battLowVolt.value).toFixed(1) + ' V'
228
                                }
229 230
                            }
                        }
dogmaphobic's avatar
dogmaphobic committed
231
                    }
232
                }
233
            }
234

235 236
            QGCLabel {
                text:           "ESC Calibration"
237
                font.pixelSize: ScreenTools.mediumFontPixelSize
238
            }
239

240 241
            Rectangle {
                width:              parent.width
242
                height:             140
243
                color:              palette.windowShade
244

245 246 247 248
                Column {
                    anchors.margins:    10
                    anchors.fill:       parent
                    spacing:            10
249

250
                    QGCLabel {
Don Gagne's avatar
Don Gagne committed
251 252 253 254 255 256
                        color:  "yellow"
                        text:   "<font color=\"yellow\">WARNING: Propellers must be removed from vehicle prior to performing ESC calibration.</font>"
                    }

                    QGCLabel {
                        text: "You must use USB connection for this operation."
257
                    }
258

259 260 261
                    QGCButton {
                        text:       "Calibrate"
                        onClicked:  controller.calibrateEsc()
dogmaphobic's avatar
dogmaphobic committed
262
                    }
263
                }
264
            }
265

266 267 268 269 270 271 272 273 274 275 276
            /*
             * This is disabled for now
            Row {
                width: parent.width
                spacing: 30
                visible: showAdvanced.checked
                Column {
                    spacing: 10
                    width: (parent.width / 2) - 5
                    QGCLabel {
                        text: "Propeller Function"
Don Gagne's avatar
Don Gagne committed
277
                        font.pixelSize: ScreenTools.mediumFontPixelSize
278
                    }
279 280 281 282
                    Rectangle {
                        width: parent.width
                        height: 160
                        color: palette.windowShade
dogmaphobic's avatar
dogmaphobic committed
283 284
                    }
                }
285 286 287 288 289
                Column {
                    spacing: 10
                    width: (parent.width / 2) - 5
                    QGCLabel {
                        text: "Magnetometer Distortion"
Don Gagne's avatar
Don Gagne committed
290
                        font.pixelSize: ScreenTools.mediumFontPixelSize
291 292 293 294 295 296
                    }
                    Rectangle {
                        width: parent.width
                        height: 160
                        color: palette.windowShade
                    }
297

298
                }
299 300 301 302 303 304 305 306 307
            }
            */

            //-- Advanced Settings
            QGCCheckBox {
                id: showAdvanced
                text: "Show Advanced Settings"
            }
            QGCLabel {
Don Gagne's avatar
Don Gagne committed
308 309 310
                text:           "Advanced Power Settings"
                font.pixelSize: ScreenTools.mediumFontPixelSize
                visible:        showAdvanced.checked
311 312
            }
            Rectangle {
313
                id: batteryRectangle
314
                width: parent.width
315
                height: 140
316 317 318 319 320 321 322 323
                color: palette.windowShade
                visible: showAdvanced.checked
                Column {
                    id: advBatteryColumn
                    spacing: 10
                    anchors.verticalCenter: parent.verticalCenter
                    x: (parent.x + 20)
                    Row {
324
                        spacing: 10
325 326 327 328 329 330
                        QGCLabel { text: "Voltage Drop on Full Load (per cell)"; width: firstColumnWidth; anchors.baseline: battDropField.baseline}
                        FactTextField {
                            id: battDropField
                            width: textEditWidth
                            fact: battVoltLoadDrop
                            showUnits: true
331
                        }
dogmaphobic's avatar
dogmaphobic committed
332
                    }
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
                    QGCLabel {
                        width: batteryRectangle.width - 30
                        wrapMode: Text.WordWrap
                        text: "All batteries have an internal resistance. This causes the voltage to drop when under load. " +
                              "This value tells the flight controller how much to compensate when computing the true battery minimum voltage. " +
                              "<font color=\"yellow\">If this value is set too high, the flight controller will allow the battery to drop bellow its minimum safety " +
                              "voltage, which will cause damage to the battery.</font>"
                    }
                    Row {
                        spacing: 10
                        QGCLabel {
                            text: "Compensated Minimum Voltage:"
                        }
                        QGCLabel {
                            text: ((battNumCells.value * battLowVolt.value) - (battNumCells.value * battVoltLoadDrop.value)).toFixed(1) + ' V'
                        }
                    }
dogmaphobic's avatar
dogmaphobic committed
350
                }
351 352 353
            }
        } // Column
    } // QGCViewPanel
dogmaphobic's avatar
dogmaphobic committed
354
}