Commit 9ca7bbe7 authored by DonLakeFlyer's avatar DonLakeFlyer

parent 0d1a709d
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.2
import QGroundControl 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Controls 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controllers 1.0
// Exposes the set of battery parameters for new and old firmwares
// Older firmware: BAT_* naming
// Newer firmware: BAT#_* naming, with indices starting at 1
QtObject {
property var controller ///< FactPanelController
property int batteryIndex ///< 1-based battery index
property bool battVoltageDividerAvailable: controller.parameterExists(-1, "BAT#_V_DIV".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""))
property bool battAmpsPerVoltAvailable: controller.parameterExists(-1, "BAT#_A_PER_V".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""))
property Fact battNumCells: controller.getParameterFact(-1, "BAT#_N_CELLS".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""))
property Fact battHighVolt: controller.getParameterFact(-1, "BAT#_V_CHARGED".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""))
property Fact battLowVolt: controller.getParameterFact(-1, "BAT#_V_EMPTY".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""))
property Fact battVoltLoadDrop: controller.getParameterFact(-1, "BAT#_V_LOAD_DROP".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""))
property Fact battVoltageDivider: controller.getParameterFact(-1, "BAT#_V_DIV".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""), false)
property Fact battAmpsPerVolt: controller.getParameterFact(-1, "BAT#_A_PER_V".replace("#", _indexedBatteryParamsAvailable ? batteryIndex : ""), false)
property string _batNCellsIndexedParamName: "BAT#_N_CELLS"
property bool _indexedBatteryParamsAvailable: controller.parameterExists(-1, _batNCellsIndexedParamName.replace("#", 1))
property int _indexedBatteryParamCount: getIndexedBatteryParamCount()
Component.onCompleted: {
if (batteryIndex > 1 && !_indexedBatteryParamsAvailable) {
console.warn("Internal Error: BatteryParams.qml batteryIndex > 1 while indexed params are not available", batteryIndex)
}
}
function getIndexedBatteryParamCount() {
var batteryIndex = 1
do {
if (!controller.parameterExists(-1, _batNCellsIndexedParamName.replace("#", batteryIndex))) {
return batteryIndex - 1
}
batteryIndex++
} while (true)
}
}
...@@ -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.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
// Note: This setup supports back compat on battery parameter naming
// Older firmware: Single battery setup using BAT_* naming
// Newer firmware: Multiple battery setup using BAT#_* naming, with indices starting at 1
SetupPage { SetupPage {
id: powerPage id: powerPage
pageComponent: pageComponent pageComponent: pageComponent
...@@ -30,30 +34,34 @@ SetupPage { ...@@ -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 { ...@@ -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: parent anchors.left: parent.left
contentHeight: column.height anchors.right: parent.right
contentWidth: column.width spacing: ScreenTools.defaultFontPixelWidth
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 }
} }
} }
}
} // Column QGCGroupBox {
} // QGCFlickable Layout.fillWidth: true
} // QGCViewDialog title: qsTr("UAVCAN Motor Index and Direction Assignment")
} // Component - calcVoltageDividerDlgComponent 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 }
} }
} }
}
} // Column } // Column
} // QGCFlickable
} // QGCViewDialog Component {
} // Component - calcAmpsPerVoltDlgComponent id: batterySetupComponent
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 { ...@@ -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 { ...@@ -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.showPopupDialogFromComponent(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.showPopupDialogFromComponent(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
} }
} // Grid
} // QGCGroupBox - Battery settings
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 }
} } // Grid
} // QGCGroupBox - Battery settings
QGCCheckBox { } // Component - batterySetupComponent
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
}
}
}
} // Column
} // QGCViewDialog
} // Component - calcVoltageDividerDlgComponent
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
}
} }
} }
} // Column }
} // QGCGroupBox - Advanced power settings }
} // Column }
} // Item } // Item
} // Component } // Component
} // SetupPage } // SetupPage
...@@ -22,26 +22,26 @@ PowerComponentController::PowerComponentController(void) ...@@ -22,26 +22,26 @@ PowerComponentController::PowerComponentController(void)
void PowerComponentController::calibrateEsc(void) void PowerComponentController::calibrateEsc(void)
{ {
_warningMessages.clear(); _warningMessages.clear();
connect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage); connect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleVehicleTextMessage);
_vehicle->startCalibration(Vehicle::CalibrationEsc); _vehicle->startCalibration(Vehicle::CalibrationEsc);
} }
void PowerComponentController::busConfigureActuators(void) void PowerComponentController::startBusConfigureActuators(void)
{ {
_warningMessages.clear(); _warningMessages.clear();
connect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage); connect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleVehicleTextMessage);
_uas->startBusConfig(UASInterface::StartBusConfigActuators); _vehicle->startUAVCANBusConfig();
} }
void PowerComponentController::stopBusConfigureActuators(void) void PowerComponentController::stopBusConfigureActuators(void)
{ {
disconnect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage); disconnect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleVehicleTextMessage);
_uas->startBusConfig(UASInterface::EndBusConfigActuators); _vehicle->stopUAVCANBusConfig();
} }
void PowerComponentController::_stopCalibration(void) void PowerComponentController::_stopCalibration(void)
{ {
disconnect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage); disconnect(_vehicle, &Vehicle::textMessageReceived, this, &PowerComponentController::_handleVehicleTextMessage);
} }
void PowerComponentController::_stopBusConfig(void) void PowerComponentController::_stopBusConfig(void)
...@@ -49,12 +49,9 @@ void PowerComponentController::_stopBusConfig(void) ...@@ -49,12 +49,9 @@ void PowerComponentController::_stopBusConfig(void)
_stopCalibration(); _stopCalibration();
} }
void PowerComponentController::_handleUASTextMessage(int uasId, int compId, int severity, QString text) void PowerComponentController::_handleVehicleTextMessage(int vehicleId, int /* compId */, int /* severity */, QString text)
{ {
Q_UNUSED(compId); if (vehicleId != _vehicle->id()) {
Q_UNUSED(severity);
if (uasId != _vehicle->id()) {
return; return;
} }
......
...@@ -29,7 +29,7 @@ public: ...@@ -29,7 +29,7 @@ public:
PowerComponentController(void); PowerComponentController(void);
Q_INVOKABLE void calibrateEsc(void); Q_INVOKABLE void calibrateEsc(void);
Q_INVOKABLE void busConfigureActuators(void); Q_INVOKABLE void startBusConfigureActuators(void);
Q_INVOKABLE void stopBusConfigureActuators(void); Q_INVOKABLE void stopBusConfigureActuators(void);
signals: signals:
...@@ -43,7 +43,7 @@ signals: ...@@ -43,7 +43,7 @@ signals:
void calibrationSuccess(const QStringList& warningMessages); void calibrationSuccess(const QStringList& warningMessages);
private slots: private slots:
void _handleUASTextMessage(int uasId, int compId, int severity, QString text); void _handleVehicleTextMessage(int vehicleId, int compId, int severity, QString text);
private: private:
void _stopCalibration(void); void _stopCalibration(void);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
<file alias="SensorsComponentSummaryFixedWing.qml">../../AutoPilotPlugins/PX4/SensorsComponentSummaryFixedWing.qml</file> <file alias="SensorsComponentSummaryFixedWing.qml">../../AutoPilotPlugins/PX4/SensorsComponentSummaryFixedWing.qml</file>
<file alias="SensorsSetup.qml">../../AutoPilotPlugins/PX4/SensorsSetup.qml</file> <file alias="SensorsSetup.qml">../../AutoPilotPlugins/PX4/SensorsSetup.qml</file>
<file alias="QGroundControl/PX4/qmldir">../../QmlControls/QGroundControl/PX4/qmldir</file> <file alias="QGroundControl/PX4/qmldir">../../QmlControls/QGroundControl/PX4/qmldir</file>
<file alias="QGroundControl/PX4/BatteryParams.qml">../../AutoPilotPlugins/PX4/BatteryParams.qml</file>
</qresource> </qresource>
<qresource prefix="/json"> <qresource prefix="/json">
<file alias="PX4-MavCmdInfoCommon.json">PX4-MavCmdInfoCommon.json</file> <file alias="PX4-MavCmdInfoCommon.json">PX4-MavCmdInfoCommon.json</file>
......
Module QGroundControl.PX4 Module QGroundControl.PX4
BatteryParams 1.0 BatteryParams.qml
SensorSetupPage 1.0 SensorSetupPage.qml SensorSetupPage 1.0 SensorSetupPage.qml
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment