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