PowerComponent.qml 14.8 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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
QGCView {
    id:             rootQGCView
    viewComponent:  view

    Component {
        id: view

        QGCViewPanel {
            id: viewPanel

            QGCPalette { id: palette; colorGroupEnabled: enabled }

            width:  600
            height: 600
            color:  palette.window

            property int firstColumnWidth: 220
            property int textEditWidth:    80

Don Gagne's avatar
Don Gagne committed
58 59 60 61
            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")
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

            property alias battHigh: battHighRow
            property alias battLow:  battLowRow

            function getBatteryImage()
            {
                switch(battNumCells.value) {
                    case 1:  return "/qml/PowerComponentBattery_01cell.svg";
                    case 2:  return "/qml/PowerComponentBattery_02cell.svg"
                    case 3:  return "/qml/PowerComponentBattery_03cell.svg"
                    case 4:  return "/qml/PowerComponentBattery_04cell.svg"
                    case 5:  return "/qml/PowerComponentBattery_05cell.svg"
                    case 6:  return "/qml/PowerComponentBattery_06cell.svg"
                    default: return "/qml/PowerComponentBattery_01cell.svg";
                }
            }

            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:  viewPanel

                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)
                onConnectBattery:       showMessage("ESC Calibration", "WARNING: Props must be removed from vehicle prior to performing ESC calibration.\n\nConnect the battery now and calibration will begin.", 0)
Don Gagne's avatar
Don Gagne committed
114
                onDisconnectBattery:    showMessage("ESC Calibration failed", "You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again.", StandardButton.Ok)
115
            }
dogmaphobic's avatar
dogmaphobic committed
116 117

            Column {
118
                anchors.fill: parent
dogmaphobic's avatar
dogmaphobic committed
119 120
                spacing: 10

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
                QGCLabel {
                    text: "POWER CONFIG"
                    font.pointSize: ScreenTools.largeFontPointSize
                }

                QGCLabel {
                    text: "Battery"
                    color: palette.text
                    font.pointSize: ScreenTools.mediumFontPointSize
                }

                Rectangle {
                    width: parent.width
                    height: 120
                    color: palette.windowShade

137
                    Column {
138
                        id: batteryColumn
139
                        spacing: 10
140 141 142
                        anchors.verticalCenter: parent.verticalCenter
                        x: (parent.x + 20)

143 144
                        Row {
                            spacing: 10
145 146 147 148 149 150 151 152 153
                            Column {
                                id: voltageCol
                                spacing: 10
                                Row {
                                    spacing: 10
                                    QGCLabel { text: "Number of Cells (in Series)"; width: firstColumnWidth; anchors.baseline: cellsField.baseline}
                                    FactTextField {
                                        id: cellsField
                                        width: textEditWidth
Don Gagne's avatar
Don Gagne committed
154
                                        fact: battNumCells
155 156 157 158 159 160 161 162 163 164
                                        showUnits: true
                                    }
                                }
                                Row {
                                    id: battHighRow
                                    spacing: 10
                                    QGCLabel { text: "Full Voltage (per cell)"; width: firstColumnWidth; anchors.baseline: battHighField.baseline}
                                    FactTextField {
                                        id: battHighField
                                        width: textEditWidth
Don Gagne's avatar
Don Gagne committed
165
                                        fact: battHighVolt
166 167 168 169 170 171 172 173 174 175
                                        showUnits: true
                                    }
                                }
                                Row {
                                    id: battLowRow
                                    spacing: 10
                                    QGCLabel { text: "Empty Voltage (per cell)"; width: firstColumnWidth; anchors.baseline: battLowField.baseline}
                                    FactTextField {
                                        id: battLowField
                                        width: textEditWidth
Don Gagne's avatar
Don Gagne committed
176
                                        fact: battLowVolt
177 178 179
                                        showUnits: true
                                    }
                                }
180
                            }
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
                            Canvas {
                                id: arrows
                                height: voltageCol.height
                                width: 40
                                antialiasing: true
                                Connections {
                                    target: ScreenTools
                                    onRepaintRequestedChanged: {
                                        arrows.requestPaint();
                                    }
                                }
                                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);
                                }
202
                            }
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
                            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:"
                                        color: palette.text
                                        width: 80
                                    }
                                    QGCLabel {
                                        text: (battNumCells.value * battHighVolt.value).toFixed(1) + ' V'
                                        color: palette.text
                                    }
                                }
                                Row {
                                    spacing: 10
                                    QGCLabel {
                                        text: "Battery Min:"
                                        color: palette.text
                                        width: 80
                                    }
                                    QGCLabel {
                                        text: (battNumCells.value * battLowVolt.value).toFixed(1) + ' V'
                                        color: palette.text
                                    }
                                }
240 241
                            }
                        }
dogmaphobic's avatar
dogmaphobic committed
242
                    }
243 244 245 246 247 248 249 250 251 252 253 254 255 256
                }

                QGCLabel {
                    text:           "ESC Calibration"
                    font.pointSize: ScreenTools.mediumFontPointSize
                }

                Rectangle {
                    width:              parent.width
                    height:             80
                    color:              palette.windowShade

                    Column {
                        anchors.margins:    10
257
                        anchors.fill:       parent
258 259 260 261
                        spacing:            10

                        QGCLabel {
                            text: "WARNING: Props must be removed from vehicle prior to performing ESC calibration."
262
                        }
263 264 265 266

                        QGCButton {
                            text:       "Calibrate"
                            onClicked:  controller.calibrateEsc()
267
                        }
dogmaphobic's avatar
dogmaphobic committed
268
                    }
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
                }

                /*
                 * 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"
                            color: palette.text
                            font.pointSize: ScreenTools.fontPointFactor * (20);
                        }
                        Rectangle {
                            width: parent.width
                            height: 160
                            color: palette.windowShade
                        }
290 291 292
                    }
                    Column {
                        spacing: 10
293 294 295 296 297
                        width: (parent.width / 2) - 5
                        QGCLabel {
                            text: "Magnetometer Distortion"
                            color: palette.text
                            font.pointSize: ScreenTools.fontPointFactor * (20);
298
                        }
299 300 301 302
                        Rectangle {
                            width: parent.width
                            height: 160
                            color: palette.windowShade
303
                        }
304

dogmaphobic's avatar
dogmaphobic committed
305 306
                    }
                }
307 308 309 310 311 312
                */

                //-- Advanced Settings
                QGCCheckBox {
                    id: showAdvanced
                    text: "Show Advanced Settings"
313 314
                }
                QGCLabel {
315
                    text: "Advanced Power Settings"
316
                    color: palette.text
317
                    font.pointSize: ScreenTools.fontPointFactor * (20);
318
                    visible: showAdvanced.checked
319 320 321
                }
                Rectangle {
                    width: parent.width
322
                    height: 40
323
                    color: palette.windowShade
324 325 326 327 328 329 330 331 332 333 334 335
                    visible: showAdvanced.checked
                    Column {
                        id: advBatteryColumn
                        spacing: 10
                        anchors.verticalCenter: parent.verticalCenter
                        x: (parent.x + 20)
                        Row {
                            spacing: 10
                            QGCLabel { text: "Voltage Drop on Full Load (per cell)"; width: firstColumnWidth; anchors.baseline: battDropField.baseline}
                            FactTextField {
                                id: battDropField
                                width: textEditWidth
Don Gagne's avatar
Don Gagne committed
336
                                fact: battVoltLoadDrop
337 338 339
                                showUnits: true
                            }
                        }
dogmaphobic's avatar
dogmaphobic committed
340 341
                    }
                }
342 343 344
            } // Column
        } // QGCViewPanel
    } // Component - view
dogmaphobic's avatar
dogmaphobic committed
345
}