@ -18,7 +18,11 @@ import QGroundControl.FactControls 1.0
@@ -18,7 +18,11 @@ import QGroundControl.FactControls 1.0
import QGroundControl . Controls 1.0
import QGroundControl . ScreenTools 1.0
import QGroundControl . Controllers 1.0
import QGroundControl . PX4 1.0
/ / N o t e : T h i s s e t u p s u p p o r t s b a c k c o m p a t o n b a t t e r y p a r a m e t e r n a m i n g
/ / O l d e r f i r m w a r e : S i n g l e b a t t e r y s e t u p u s i n g B A T _ * n a m i n g
/ / N e w e r f i r m w a r e : M u l t i p l e b a t t e r y s e t u p u s i n g B A T # _ * n a m i n g , w i t h i n d i c e s s t a r t i n g a t 1
SetupPage {
id: powerPage
pageComponent: pageComponent
@ -30,30 +34,34 @@ SetupPage {
@@ -30,30 +34,34 @@ SetupPage {
width: Math . max ( availableWidth , innerColumn . width )
height: innerColumn . height
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" )
property Fact battVoltageDivider: controller . getParameterFact ( - 1 , "BAT_V_DIV" )
property Fact battAmpsPerVolt: controller . getParameterFact ( - 1 , "BAT_A_PER_V" )
property Fact uavcanEnable: controller . getParameterFact ( - 1 , "UAVCAN_ENABLE" , false )
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" ;
}
readonly property string _highlightPrefix : "<font color=\"" + qgcPal . warningText + "\">"
readonly property string _highlightSuffix : "</font>"
readonly property string _batNCellsIndexedParamName : "BAT#_N_CELLS"
property int _textEditWidth : ScreenTools . defaultFontPixelWidth * 8
property Fact _uavcanEnable : controller . getParameterFact ( - 1 , "UAVCAN_ENABLE" , false )
property bool _indexedBatteryParamsAvailable : controller . parameterExists ( - 1 , _batNCellsIndexedParamName . replace ( "#" , 1 ) )
property int _indexedBatteryParamCount : getIndexedBatteryParamCount ( )
function getIndexedBatteryParamCount ( ) {
var batteryIndex = 1
do {
if ( ! controller . parameterExists ( - 1 , _batNCellsIndexedParamName . replace ( "#" , batteryIndex ) ) ) {
return batteryIndex - 1
}
batteryIndex ++
} while ( true )
}
PowerComponentController {
id: controller
onOldFirmware: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "%1 cannot perform ESC Calibration with this version of firmware. You will need to upgrade to a newer firmware." ) . arg ( QGroundControl . appName ) )
onNewerFirmware: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "%1 cannot perform ESC Calibration with this version of firmware. You will need to upgrade %1." ) . arg ( QGroundControl . appName ) )
onBatteryConnected: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "Performing calibration. This will take a few seconds.." ) )
onCalibrationFailed: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration failed" ) , errorMessage )
onCalibrationSuccess: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "Calibration complete. You can disconnect your battery now if you like." ) )
onConnectBattery: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , _highlightPrefix + qsTr ( "WARNING: Props must be removed from vehicle prior to performing ESC calibration." ) + _highlightSuffix + qsTr ( " Connect the battery now and calibration will begin." ) )
onDisconnectBattery: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration failed" ) , qsTr ( "You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again." ) )
}
ColumnLayout {
@ -86,136 +94,159 @@ SetupPage {
@@ -86,136 +94,159 @@ SetupPage {
drawArrowhead ( ctx , x2 , y2 , rd ) ;
}
PowerComponentController {
id: controller
onOldFirmware: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "%1 cannot perform ESC Calibration with this version of firmware. You will need to upgrade to a newer firmware." ) . arg ( QGroundControl . appName ) )
onNewerFirmware: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "%1 cannot perform ESC Calibration with this version of firmware. You will need to upgrade %1." ) . arg ( QGroundControl . appName ) )
onBatteryConnected: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "Performing calibration. This will take a few seconds.." ) )
onCalibrationFailed: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration failed" ) , errorMessage )
onCalibrationSuccess: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , qsTr ( "Calibration complete. You can disconnect your battery now if you like." ) )
onConnectBattery: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration" ) , highlightPrefix + qsTr ( "WARNING: Props must be removed from vehicle prior to performing ESC calibration." ) + highlightSuffix + qsTr ( " Connect the battery now and calibration will begin." ) )
onDisconnectBattery: mainWindow . showMessageDialog ( qsTr ( "ESC Calibration failed" ) , qsTr ( "You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again." ) )
Repeater {
id: batterySetupRepeater
model: _indexedBatteryParamsAvailable ? _indexedBatteryParamCount : 1
Loader {
sourceComponent: batterySetupComponent
property int batteryIndex: index + 1
property bool showBatteryIndex: batterySetupRepeater . count > 1
property bool useIndexedParamNames: _indexedBatteryParamsAvailable
}
}
Component {
id: calcVoltageDividerDlgComponent
QGCViewDialog {
id: calcVoltageDividerDlg
QGCGroupBox {
Layout.fillWidth: true
title: qsTr ( "ESC PWM Minimum and Maximum Calibration" )
QGCFlickable {
anchors.fill: paren t
contentHeight: column . he ight
contentWidth: column . w idth
ColumnLayout {
anchors.left: parent . lef t
anchors.right: parent . r ight
spacing: ScreenTools . defaultFontPixelW idth
Column {
id: column
width: calcVoltageDividerDlg . width
spacing: ScreenTools . defaultFontPixelHeight
QGCLabel {
color: qgcPal . warningText
wrapMode: Text . WordWrap
text: qsTr ( "WARNING: Propellers must be removed from vehicle prior to performing ESC calibration." )
Layout.fillWidth: true
}
QGCLabel {
width: parent . width
wrapMode: Text . WordWrap
text: qsTr ( "Measure battery voltage using an external voltmeter and enter the value below. Click Calculate to set the new voltage multiplier." )
}
QGCLabel {
text: qsTr ( "You must use USB connection for this operation." )
}
Grid {
columns: 2
spacing: ScreenTools . defaultFontPixelHeight / 2
verticalItemAlignment: Grid . AlignVCenter
QGCButton {
text: qsTr ( "Calibrate" )
width: ScreenTools . defaultFontPixelWidth * 20
onClicked: controller . calibrateEsc ( )
}
}
}
QGCLabel {
text: qsTr ( "Measured voltage:" )
}
QGCTextField { id: measuredVoltage }
QGCCheckBox {
id: showUAVCAN
text: qsTr ( "Show UAVCAN Settings" )
checked: _uavcanEnable ? _uavcanEnable . rawValue !== 0 : false
}
QGCLabel { text: qsTr ( "Vehicle voltage:" ) }
QGCLabel { text: controller . vehicle . battery . voltage . valueString }
QGCGroupBox {
Layout.fillWidth: true
title: qsTr ( "UAVCAN Bus Configuration" )
visible: showUAVCAN . checked
QGCLabel { text: qsTr ( "Voltage divider:" ) }
FactLabel { fact: battVoltageDivider }
}
Row {
id: uavCanConfigRow
spacing: ScreenTools . defaultFontPixelWidth
QGCButton {
text: "Calculate"
onClicked: {
var measuredVoltageValue = parseFloat ( measuredVoltage . text )
if ( measuredVoltageValue === 0 || isNaN ( measuredVoltageValue ) ) {
return
}
var newVoltageDivider = ( measuredVoltageValue * battVoltageDivider . value ) / controller . vehicle . battery . voltage . value
if ( newVoltageDivider > 0 ) {
battVoltageDivider . value = newVoltageDivider
}
}
}
} / / C o l u m n
} / / Q G C F l i c k a b l e
} / / Q G C V i e w D i a l o g
} / / C o m p o n e n t - c a l c V o l t a g e D i v i d e r D l g C o m p o n e n t
Component {
id: calcAmpsPerVoltDlgComponent
QGCViewDialog {
id: calcAmpsPerVoltDlg
QGCFlickable {
anchors.fill: parent
contentHeight: column . height
contentWidth: column . width
Column {
id: column
width: calcAmpsPerVoltDlg . width
spacing: ScreenTools . defaultFontPixelHeight
QGCLabel {
width: parent . width
wrapMode: Text . WordWrap
text: qsTr ( "Measure current draw using an external current meter and enter the value below. Click Calculate to set the new amps per volt value." )
}
FactComboBox {
id: _uavcanEnabledCheckBox
width: ScreenTools . defaultFontPixelWidth * 20
fact: _uavcanEnable
indexModel: false
}
QGCLabel {
anchors.verticalCenter: parent . verticalCenter
text: qsTr ( "Change required restart" )
}
}
}
QGCGroupBox {
Layout.fillWidth: true
title: qsTr ( "UAVCAN Motor Index and Direction Assignment" )
visible: showUAVCAN . checked
Grid {
columns: 2
spacing: ScreenTools . defaultFontPixelHeight / 2
verticalItemAlignment: Grid . AlignVCenter
ColumnLayout {
anchors.left: parent . left
anchors.right: parent . right
spacing: ScreenTools . defaultFontPixelWidth
QGCLabel {
text: qsTr ( "Measured current:" )
}
QGCTextField { id: measuredCurrent }
QGCLabel {
wrapMode: Text . WordWrap
color: qgcPal . warningText
text: qsTr ( "WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration." )
Layout.fillWidth: true
}
QGCLabel { text: qsTr ( "Vehicle current:" ) }
QGCLabel { text: controller . vehicle . battery . current . valueString }
QGCLabel {
wrapMode: Text . WordWrap
text: qsTr ( "ESC parameters will only be accessible in the editor after assignment." )
Layout.fillWidth: true
}
QGCLabel { text: qsTr ( "Amps per volt:" ) }
FactLabel { fact: battAmpsPerVolt }
}
QGCLabel {
wrapMode: Text . WordWrap
text: qsTr ( "Start the process, then turn each motor into its turn direction, in the order of their motor indices." )
Layout.fillWidth: true
}
QGCButton {
text: qsTr ( "Calculate " )
onClicked: {
var measuredCurrentValue = parseFloat ( measuredCurrent . text )
if ( measuredCurrentValue === 0 ) {
return
}
var newAmpsPerVolt = ( measuredCurrentValue * battAmpsPerVolt . value ) / controller . vehicle . battery . current . value
if ( newAmpsPerVolt != 0 ) {
battAmpsPerVolt . value = newAmpsPerVolt
}
}
}
} / / C o l u m n
} / / Q G C F l i c k a b l e
} / / Q G C V i e w D i a l o g
} / / C o m p o n e n t - c a l c A m p s P e r V o l t D l g C o m p o n e n t
QGCButton {
text: qsTr ( "Start Assignment " )
width: ScreenTools . defaultFontPixelWidth * 20
onClicked: controller . startBusConfigureActuators ( )
}
QGCButton {
text: qsTr ( "Stop Assignment" )
width: ScreenTools . defaultFontPixelWidth * 20
onClicked: controller . stopBusConfigureActuators ( )
}
}
}
} / / C o l u m n
Component {
id: batterySetupComponen t
QGCGroupBox {
id: batteryGroup
title: qsTr ( "Battery" )
title: qsTr ( "Battery " ) + ( showBatteryIndex ? batteryIndex : "" )
property var _controller : controller
property int _batteryIndex : batteryIndex
BatteryParams {
id: batParams
controller: _controller
batteryIndex: _batteryIndex
}
property bool battVoltageDividerAvailable: batParams . battVoltageDividerAvailable
property bool battAmpsPerVoltAvailable: batParams . battAmpsPerVoltAvailable
property Fact battNumCells: batParams . battNumCells
property Fact battHighVolt: batParams . battHighVolt
property Fact battLowVolt: batParams . battLowVolt
property Fact battVoltLoadDrop: batParams . battVoltLoadDrop
property Fact battVoltageDivider: batParams . battVoltageDivider
property Fact battAmpsPerVolt: batParams . battAmpsPerVolt
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" ;
}
}
GridLayout {
id: batteryGrid
@ -223,18 +254,16 @@ SetupPage {
@@ -223,18 +254,16 @@ SetupPage {
columnSpacing: ScreenTools . defaultFontPixelWidth
QGCLabel {
text: qsTr ( "Number of Cells (in Series)" )
text: qsTr ( "Number of Cells (in Series)" )
}
FactTextField {
id: cellsField
width: textEditWidth
width: _textEditWidth
fact: battNumCells
showUnits: true
}
QGCColoredImage {
id: batteryImage
Layout.rowSpan: 3
width: height * 0.75
height: 100
@ -243,265 +272,256 @@ SetupPage {
@@ -243,265 +272,256 @@ SetupPage {
smooth: true
color: qgcPal . text
cache: false
source: getBatteryImage ( ) ;
source: getBatteryImage ( batteryIndex )
}
Item { width: 1 ; height: 1 ; Layout.columnSpan: 2 }
QGCLabel {
id: battHighLabel
text: qsTr ( "Full Voltage (per cell)" )
text: qsTr ( "Full Voltage (per cell)" )
}
FactTextField {
id: battHighField
width: textEditWidth
width: _textEditWidth
fact: battHighVolt
showUnits: true
}
QGCLabel {
text: qsTr ( "Battery Max:" )
text: qsTr ( "Battery Max:" )
}
QGCLabel {
text: ( battNumCells . value * battHighVolt . value ) . toFixed ( 1 ) + ' V'
text: ( battNumCells . value * battHighVolt . value ) . toFixed ( 1 ) + ' V'
}
QGCLabel {
id: battLowLabel
text: qsTr ( "Empty Voltage (per cell)" )
text: qsTr ( "Empty Voltage (per cell)" )
}
FactTextField {
id: battLowField
width: textEditWidth
width: _textEditWidth
fact: battLowVolt
showUnits: true
}
QGCLabel {
text: qsTr ( "Battery Min:" )
text: qsTr ( "Battery Min:" )
}
QGCLabel {
text: ( battNumCells . value * battLowVolt . value ) . toFixed ( 1 ) + ' V'
text: ( battNumCells . value * battLowVolt . value ) . toFixed ( 1 ) + ' V'
}
QGCLabel {
text: qsTr ( "Voltage divider" )
text: qsTr ( "Voltage divider" )
visible: battVoltageDividerAvailable
}
FactTextField {
id: voltMultField
fact: battVoltageDivider
fact: battVoltageDivider
visible: battVoltageDividerAvailable
}
QGCButton {
id: voltMultCalculateButton
text: qsTr ( "Calculate" )
onClicked: mainWindow . showComponentDialog ( calcVoltageDividerDlgComponent , qsTr ( "Calculate Voltage Divider" ) , mainWindow . showDialogDefaultWidth , StandardButton . Close )
text: qsTr ( "Calculate" )
visible: battVoltageDividerAvailable
onClicked: mainWindow . showPopupDialogFrom Component ( calcVoltageDividerDlgComponent , { batteryIndex: _batteryIndex } )
}
Item { width: 1 ; height: 1 ; Layout.columnSpan: 2 }
Item { width: 1 ; height: 1 ; Layout.columnSpan: 2 ; visible: battVoltageDividerAvailable }
QGCLabel {
id: voltMultHelp
Layout.columnSpan: batteryGrid . columns
Layout.fillWidth: true
font.pointSize: ScreenTools . smallFontPointSize
wrapMode: Text . WordWrap
text: qsTr ( "If the battery voltage reported by the vehicle is largely different than the voltage read externally using a voltmeter you can adjust the voltage multiplier value to correct this. " ) +
qsTr ( "Click the Calculate button for help with calculating a new value." )
visible: battVoltageDividerAvailable
}
QGCLabel {
id: ampPerVoltLabel
text: qsTr ( "Amps per volt" )
text: qsTr ( "Amps per volt" )
visible: battAmpsPerVoltAvailable
}
FactTextField {
id: ampPerVoltField
fact: battAmpsPerVolt
fact: battAmpsPerVolt
visible: battAmpsPerVoltAvailable
}
QGCButton {
id: ampPerVoltCalculateButton
text: qsTr ( "Calculate" )
onClicked: mainWindow . showComponentDialog ( calcAmpsPerVoltDlgComponent , qsTr ( "Calculate Amps per Volt" ) , mainWindow . showDialogDefaultWidth , StandardButton . Close )
text: qsTr ( "Calculate" )
visible: battAmpsPerVoltAvailable
onClicked: mainWindow . showPopupDialogFrom Component ( calcAmpsPerVoltDlgComponent , { batteryIndex: _batteryIndex } )
}
Item { width: 1 ; height: 1 ; Layout.columnSpan: 2 }
Item { width: 1 ; height: 1 ; Layout.columnSpan: 2 ; visible: battAmpsPerVoltAvailable }
QGCLabel {
id: ampPerVoltHelp
Layout.columnSpan: batteryGrid . columns
Layout.fillWidth: true
font.pointSize: ScreenTools . smallFontPointSize
wrapMode: Text . WordWrap
text: qsTr ( "If the current draw reported by the vehicle is largely different than the current read externally using a current meter you can adjust the amps per volt value to correct this. " ) +
qsTr ( "Click the Calculate button for help with calculating a new value." )
visible: battAmpsPerVoltAvailable
}
} / / G r i d
} / / Q G C G r o u p B o x - B a t t e r y s e t t i n g s
QGCGroupBox {
Layout.maximumWidth: batteryGroup . width
Layout.fillWidth: true
title: qsTr ( "ESC PWM Minimum and Maximum Calibration" )
QGCCheckBox {
id: showAdvanced
Layout.columnSpan: batteryGrid . columns
text: qsTr ( "Show Advanced Settings" )
}
ColumnLayout {
anchors.left: parent . left
anchors.right: parent . right
spacing: ScreenTools . defaultFontPixelWidth
QGCLabel {
text: qsTr ( "Voltage Drop on Full Load (per cell)" )
visible: showAdvanced . checked
}
FactTextField {
id: battDropField
fact: battVoltLoadDrop
showUnits: true
visible: showAdvanced . checked
}
Item { width: 1 ; height: 1 ; Layout.columnSpan: 3 ; visible: showAdvanced . checked }
QGCLabel {
color: qgcPal . warningText
wrapMode: Text . WordWrap
text: qsTr ( "WARNING: Propellers must be removed from vehicle prior to performing ESC calibration." )
Layout.columnSpan: batteryGrid . columns
Layout.fillWidth: true
wrapMode: Text . WordWrap
font.pointSize: ScreenTools . smallFontPointSize
text: qsTr ( "Batteries show less voltage at high throttle. Enter the difference in Volts between idle throttle and full " ) +
qsTr ( "throttle, divided by the number of battery cells. Leave at the default if unsure. " ) +
_highlightPrefix + qsTr ( "If this value is set too high, the battery might be deep discharged and damaged." ) + _highlightSuffix
visible: showAdvanced . checked
}
QGCLabel {
text: qsTr ( "You must use USB connection for this operation." )
text: qsTr ( "Compensated Minimum Voltage:" )
visible: showAdvanced . checked
}
QGCButton {
text: qsTr ( "Calibrate" )
width: ScreenTools . defaultFontPixelWidth * 20
onClicked: controller . calibrateEsc ( )
QGCLabel {
text: ( ( battNumCells . value * battLowVolt . value ) - ( battNumCells . value * battVoltLoadDrop . value ) ) . toFixed ( 1 ) + qsTr ( " V" )
visible: showAdvanced . checked
}
}
}
QGCCheckBox {
id: showUAVCAN
text: qsTr ( "Show UAVCAN Settings" )
checked: uavcanEnable ? uavcanEnable . rawValue !== 0 : false
}
Item { width: 1 ; height: 1 ; Layout.columnSpan: 3 ; visible: showAdvanced . checked }
} / / G r i d
} / / Q G C G r o u p B o x - B a t t e r y s e t t i n g s
} / / C o m p o n e n t - b a t t e r y S e t u p C o m p o n e n t
QGCGroupBox {
Layout.maximumWidth: batteryGroup . width
Layout.fillWidth: true
title: qsTr ( "UAVCAN Bus Configuration" )
visible: showUAVCAN . checked
Component {
id: calcVoltageDividerDlgComponent
Row {
id: uavCanConfigRow
spacing: ScreenTools . defaultFontPixelWidth
QGCPopupDialog {
title: qsTr ( "Calculate Voltage Divider" )
buttons: StandardButton . Close
FactComboBox {
id: uavcanEnabledCheckBox
width: ScreenTools . defaultFontPixelWidth * 20
fact: uavcanEnable
indexModel: false
}
property var _controller : controller
QGCLabel {
anchors.verticalCenter: parent . verticalCenter
text: qsTr ( "Change required restart" )
}
BatteryParams {
id: batParams
controller: _controller
batteryIndex: dialogProperties . batteryIndex
}
}
QGCGroupBox {
Layout.maximumWidth: batteryGroup . width
Layout.fillWidth: true
title: qsTr ( "UAVCAN Motor Index and Direction Assignment" )
visible: showUAVCAN . checked
ColumnLayout {
anchors.left: parent . left
anchors.right: parent . right
spacing: ScreenTools . defaultFontPixelWidth
spacing: ScreenTools . defaultFontPixelHeight
QGCLabel {
wrapMode: Text . WordWrap
color: qgcPal . warningText
text: qsTr ( "WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration." )
Layout.fillWidth: true
Layout.preferredWidth: gridLayout . width
wrapMode: Text . WordWrap
text: qsTr ( "Measure battery voltage using an external voltmeter and enter the value below. Click Calculate to set the new voltage multiplier." )
}
QGCLabel {
wrapMode: Text . WordWrap
text: qsTr ( "ESC parameters will only be accessible in the editor after assignment." )
Layout.fillWidth: true
}
GridLayout {
id: gridLayout
columns: 2
QGCLabel {
wrapMode: Text . WordWrap
text: qsTr ( "Start the process, then turn each motor into its turn direction, in the order of their motor indices." )
Layout.fillWidth: true
}
QGCLabel { text: qsTr ( "Measured voltage:" ) }
QGCTextField { id: measuredVoltage }
QGCButton {
text: qsTr ( "Start Assignment" )
width: ScreenTools . defaultFontPixelWidth * 20
onClicked: controller . busConfigureActuators ( )
QGCLabel { text: qsTr ( "Vehicle voltage:" ) }
QGCLabel { text: controller . vehicle . battery . voltage . valueString }
QGCLabel { text: qsTr ( "Voltage divider:" ) }
FactLabel { fact: batParams . battVoltageDivider }
}
QGCButton {
text: qsTr ( "Stop Assignment" )
width: ScreenTools . defaultFontPixelWidth * 20
onClicked: controller . stopBusConfigureActuators ( )
}
}
}
text: qsTr ( "Calculate" )
QGCCheckBox {
id: showAdvanced
text: qsTr ( "Show Advanced Settings" )
}
onClicked: {
var measuredVoltageValue = parseFloat ( measuredVoltage . text )
if ( measuredVoltageValue === 0 || isNaN ( measuredVoltageValue ) ) {
return
}
var newVoltageDivider = ( measuredVoltageValue * batParams . battVoltageDivider . value ) / controller . vehicle . battery . voltage . value
if ( newVoltageDivider > 0 ) {
batParams . battVoltageDivider . value = newVoltageDivider
}
}
}
} / / C o l u m n
} / / Q G C V i e w D i a l o g
} / / C o m p o n e n t - c a l c V o l t a g e D i v i d e r D l g C o m p o n e n t
QGCGroupBox {
Layout.maximumWidth: batteryGroup . width
Layout.fillWidth: true
title: qsTr ( "Advanced Power Settings" )
visible: showAdvanced . checked
Component {
id: calcAmpsPerVoltDlgComponent
ColumnLayout {
anchors.left: parent . left
anchors.right: parent . right
spacing: ScreenTools . defaultFontPixelWidth
QGCPopupDialog {
title: qsTr ( "Calculate Amps per Volt" )
buttons: StandardButton . Close
Row {
spacing: ScreenTools . defaultFontPixelWidth
property var _controller : controller
QGCLabel {
text: qsTr ( "Voltage Drop on Full Load (per cell)" )
anchors.baseline: battDropField . baseline
}
BatteryParams {
id: batParams
controller: _controller
batteryIndex: dialogProperties . batteryIndex
}
FactTextField {
id: battDropField
width: textEditWidth
fact: battVoltLoadDrop
showUnits: true
}
}
ColumnLayout {
spacing: ScreenTools . defaultFontPixelHeight
QGCLabel {
wrapMode: Text . WordWrap
text: qsTr ( "Batteries show less voltage at high throttle. Enter the difference in Volts between idle throttle and full " ) +
qsTr ( "throttle, divided by the number of battery cells. Leave at the default if unsure. " ) +
highlightPrefix + qsTr ( "If this value is set too high, the battery might be deep discharged and damaged." ) + highlightSuffix
Layout.maximumWidth: ScreenTools . defaultFontPixelWidth * 60
Layout.preferredWidth: gridLayout . width
wrapMode: Text . WordWrap
text: qsTr ( "Measure current draw using an external current meter and enter the value below. Click Calculate to set the new amps per volt value." )
}
Row {
spacing: ScreenTools . defaultFontPixelWidth
GridLayout {
id: gridLayout
columns: 2
QGCLabel {
text: qsTr ( "Compensated Minimum Voltage:" )
}
QGCLabel { text: qsTr ( "Measured current:" ) }
QGCTextField { id: measuredCurrent }
QGCLabel { text: qsTr ( "Vehicle current:" ) }
QGCLabel { text: controller . vehicle . battery . current . valueString }
QGCLabel { text: qsTr ( "Amps per volt:" ) }
FactLabel { fact: batParams . battAmpsPerVolt }
}
QGCButton {
text: qsTr ( "Calculate" )
QGCLabel {
text: ( ( battNumCells . value * battLowVolt . value ) - ( battNumCells . value * battVoltLoadDrop . value ) ) . toFixed ( 1 ) + qsTr ( " V" )
onClicked: {
var measuredCurrentValue = parseFloat ( measuredCurrent . text )
if ( measuredCurrentValue === 0 || isNaN ( measuredCurrentValue ) ) {
return
}
var newAmpsPerVolt = ( measuredCurrentValue * batParams . battAmpsPerVolt . value ) / controller . vehicle . battery . current . value
if ( newAmpsPerVolt != 0 ) {
batParams . battAmpsPerVolt . value = newAmpsPerVolt
}
}
}
} / / C o l u m n
} / / Q G C G r o u p B o x - A d v a n c e d p o w e r s e t t i n g s
} / / C o l u m n
}
}
}
} / / I t e m
} / / C o m p o n e n t
} / / S e t u p P a g e