/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
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