PowerComponent.qml 15.3 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 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 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
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

            property Fact battNumCells: Fact { name: "BAT_N_CELLS"; onFactMissing: showMissingFactOverlay(name) }
            property Fact battHighVolt: Fact { name: "BAT_V_CHARGED"; onFactMissing: showMissingFactOverlay(name) }
            property Fact battLowVolt:  Fact { name: "BAT_V_EMPTY"; onFactMissing: showMissingFactOverlay(name) }

            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)
113
                onDisconnectBattery:    showMessage("ESC Calibration failed", "You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again.", , StandardButton.Ok)
114
            }
dogmaphobic's avatar
dogmaphobic committed
115 116

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

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
                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

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

142 143
                        Row {
                            spacing: 10
144 145 146 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 175 176 177 178
                            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
                                        fact: Fact { name: "BAT_N_CELLS"; onFactMissing: showMissingFactOverlay(name) }
                                        showUnits: true
                                    }
                                }
                                Row {
                                    id: battHighRow
                                    spacing: 10
                                    QGCLabel { text: "Full Voltage (per cell)"; width: firstColumnWidth; anchors.baseline: battHighField.baseline}
                                    FactTextField {
                                        id: battHighField
                                        width: textEditWidth
                                        fact: Fact { name: "BAT_V_CHARGED"; onFactMissing: showMissingFactOverlay(name) }
                                        showUnits: true
                                    }
                                }
                                Row {
                                    id: battLowRow
                                    spacing: 10
                                    QGCLabel { text: "Empty Voltage (per cell)"; width: firstColumnWidth; anchors.baseline: battLowField.baseline}
                                    FactTextField {
                                        id: battLowField
                                        width: textEditWidth
                                        fact: Fact { name: "BAT_V_EMPTY"; onFactMissing: showMissingFactOverlay(name) }
                                        showUnits: true
                                    }
                                }
179
                            }
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
                            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);
                                }
201
                            }
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
                            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
                                    }
                                }
239 240
                            }
                        }
dogmaphobic's avatar
dogmaphobic committed
241
                    }
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
                }

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

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

                    Column {
                        anchors.margins:    10
                        anchors.left:       parent.left
                        anchors.right:      parent.right
                        anchors.top:        parent.top
                        anchors.bottom:     calibrateButton.bottom
                        spacing:            10

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

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

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

dogmaphobic's avatar
dogmaphobic committed
308 309
                    }
                }
310 311 312 313 314 315
                */

                //-- Advanced Settings
                QGCCheckBox {
                    id: showAdvanced
                    text: "Show Advanced Settings"
316 317
                }
                QGCLabel {
318
                    text: "Advanced Power Settings"
319
                    color: palette.text
320
                    font.pointSize: ScreenTools.fontPointFactor * (20);
321
                    visible: showAdvanced.checked
322 323 324
                }
                Rectangle {
                    width: parent.width
325
                    height: 40
326
                    color: palette.windowShade
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
                    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
                                fact: Fact { name: "BAT_V_LOAD_DROP"; onFactMissing: showMissingFactOverlay(name) }
                                showUnits: true
                            }
                        }
dogmaphobic's avatar
dogmaphobic committed
343 344
                    }
                }
345 346 347
            } // Column
        } // QGCViewPanel
    } // Component - view
dogmaphobic's avatar
dogmaphobic committed
348
}