/*===================================================================== 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 import QtQuick.Dialogs 1.2 import QGroundControl.FactSystem 1.0 import QGroundControl.FactControls 1.0 import QGroundControl.Palette 1.0 import QGroundControl.Controls 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Controllers 1.0 QGCView { id: rootQGCView viewPanel: panel property int textEditWidth: ScreenTools.defaultFontPixelWidth * 8 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") readonly property string highlightPrefix: "<font color=\"" + qgcPal.warningText + "\">" readonly property string highlightSuffix: "</font>" function getBatteryImage() { switch(battNumCells.value) { 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"; } } 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) onConnectBattery: showMessage("ESC Calibration", highlightPrefix + "WARNING: Props must be removed from vehicle prior to performing ESC calibration." + highlightSuffix + " Connect the battery now and calibration will begin.", 0) 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 Flickable { anchors.fill: parent clip: true contentHeight: innerColumn.height contentWidth: panel.width boundsBehavior: Flickable.StopAtBounds flickableDirection: Flickable.VerticalFlick Column { id: innerColumn width: panel.width spacing: ScreenTools.defaultFontPixelHeight * 0.5 QGCLabel { text: "Battery" font.weight: Font.DemiBold } Rectangle { width: parent.width height: voltageCol.height + ScreenTools.defaultFontPixelHeight color: palette.windowShade Column { id: voltageCol anchors.margins: ScreenTools.defaultFontPixelHeight / 2 anchors.left: parent.left anchors.top: parent.top spacing: ScreenTools.defaultFontPixelHeight / 2 property real firstColumnWidth: Math.max(Math.max(cellsLabel.contentWidth, battHighLabel.contentWidth), battLowLabel.contentWidth) + ScreenTools.defaultFontPixelWidth Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { id: cellsLabel text: "Number of Cells (in Series)" anchors.baseline: cellsField.baseline } FactTextField { id: cellsField x: voltageCol.firstColumnWidth width: textEditWidth fact: battNumCells showUnits: true } } Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { id: battHighLabel text: "Full Voltage (per cell)" anchors.baseline: battHighField.baseline } FactTextField { id: battHighField x: voltageCol.firstColumnWidth width: textEditWidth fact: battHighVolt showUnits: true } } Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { id: battLowLabel text: "Empty Voltage (per cell)" anchors.baseline: battLowField.baseline } FactTextField { id: battLowField x: voltageCol.firstColumnWidth width: textEditWidth fact: battLowVolt showUnits: true } } } // Column QGCColoredImage { id: batteryImage anchors.verticalCenter: voltageCol.verticalCenter x: voltageCol.firstColumnWidth + textEditWidth + (ScreenTools.defaultFontPixelWidth * 3) width: height * 0.75 height: voltageCol.height fillMode: Image.PreserveAspectFit smooth: true color: palette.button cache: false source: getBatteryImage(); } Column { anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2 anchors.left: batteryImage.right anchors.verticalCenter: voltageCol.verticalCenter spacing: ScreenTools.defaultFontPixelHeight Row { QGCLabel { width: ScreenTools.defaultFontPixelWidth * 12 text: "Battery Max:" } QGCLabel { text: (battNumCells.value * battHighVolt.value).toFixed(1) + ' V' } } Row { QGCLabel { width: ScreenTools.defaultFontPixelWidth * 12 text: "Battery Min:" } QGCLabel { text: (battNumCells.value * battLowVolt.value).toFixed(1) + ' V' } } } } // Rectangle - Battery settings QGCLabel { text: "ESC PWM Minimum and Maximum Calibration" font.weight: Font.DemiBold } Rectangle { width: parent.width height: escCalColumn.height + ScreenTools.defaultFontPixelHeight color: palette.windowShade Column { id : escCalColumn anchors.margins: ScreenTools.defaultFontPixelHeight / 2 anchors.left: parent.left anchors.top: parent.top spacing: ScreenTools.defaultFontPixelWidth QGCLabel { color: palette.warningText text: "WARNING: Propellers must be removed from vehicle prior to performing ESC calibration." } QGCLabel { text: "You must use USB connection for this operation." } QGCButton { text: "Calibrate" width: ScreenTools.defaultFontPixelWidth * 20 onClicked: controller.calibrateEsc() } } } QGCCheckBox { id: showUAVCAN text: "Show UAVCAN Settings" } QGCLabel { text: "UAVCAN Bus Configuration" font.weight: Font.DemiBold visible: showUAVCAN.checked } Rectangle { width: parent.width height: uavCanConfigColumn.height + ScreenTools.defaultFontPixelHeight color: palette.windowShade visible: showUAVCAN.checked Column { id: uavCanConfigColumn anchors.margins: ScreenTools.defaultFontPixelHeight / 2 anchors.left: parent.left anchors.top: parent.top spacing: ScreenTools.defaultFontPixelWidth FactCheckBox { id: uavcanEnabledCheckBox width: ScreenTools.defaultFontPixelWidth * 20 fact: controller.getParameterFact(-1, "UAVCAN_ENABLE") checkedValue: 3 uncheckedValue: 0 text: "Enable UAVCAN as the default MAIN output bus (requires autopilot restart)" } } } QGCLabel { text: "UAVCAN Motor Index and Direction Assignment" font.weight: Font.DemiBold visible: showUAVCAN.checked } Rectangle { width: parent.width height: uavCanEscCalColumn.height + ScreenTools.defaultFontPixelHeight color: palette.windowShade visible: showUAVCAN.checked enabled: uavcanEnabledCheckBox.checked Column { id: uavCanEscCalColumn anchors.margins: ScreenTools.defaultFontPixelHeight / 2 anchors.left: parent.left anchors.top: parent.top spacing: ScreenTools.defaultFontPixelWidth QGCLabel { color: palette.warningText text: "WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration." } QGCLabel { text: "ESC parameters will only be accessible in the editor after assignment." } QGCLabel { text: "Start the process, then turn each motor into its turn direction, in the order of their motor indices." } QGCButton { text: "Start Assignment" width: ScreenTools.defaultFontPixelWidth * 20 onClicked: controller.busConfigureActuators() } QGCButton { text: "Stop Assignment" width: ScreenTools.defaultFontPixelWidth * 20 onClicked: controller.stopBusConfigureActuators() } } } QGCCheckBox { id: showAdvanced text: "Show Advanced Settings" } QGCLabel { text: "Advanced Power Settings" font.weight: Font.DemiBold 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 { text: "Voltage Drop on Full Load (per cell)" anchors.baseline: battDropField.baseline } FactTextField { id: battDropField width: textEditWidth fact: battVoltLoadDrop showUnits: true } } QGCLabel { width: parent.width wrapMode: Text.WordWrap text: "Batteries show less voltage at high throttle. Enter the difference in Volts between idle throttle and full " + "throttle, divided by the number of battery cells. Leave at the default if unsure. " + highlightPrefix + "If this value is set too high, the battery might be deep discharged and damaged." + highlightSuffix } Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { text: "Compensated Minimum Voltage:" } QGCLabel { text: ((battNumCells.value * battLowVolt.value) - (battNumCells.value * battVoltLoadDrop.value)).toFixed(1) + ' V' } } } } // Rectangle - Advanced power settings } // Column } // Flickable } // QGCViewPanel } // QGCView