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>"
readonly property string _batNCellsIndexedParamName: "BAT#_N_CELLS"
property Fact battNumCells: controller.getParameterFact(-1, "BAT_N_CELLS") property int _textEditWidth: ScreenTools.defaultFontPixelWidth * 8
property Fact battHighVolt: controller.getParameterFact(-1, "BAT_V_CHARGED") property Fact _uavcanEnable: controller.getParameterFact(-1, "UAVCAN_ENABLE", false)
property Fact battLowVolt: controller.getParameterFact(-1, "BAT_V_EMPTY") property bool _indexedBatteryParamsAvailable: controller.parameterExists(-1, _batNCellsIndexedParamName.replace("#", 1))
property Fact battVoltLoadDrop: controller.getParameterFact(-1, "BAT_V_LOAD_DROP") property int _indexedBatteryParamCount: getIndexedBatteryParamCount()
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 + "\">" function getIndexedBatteryParamCount() {
readonly property string highlightSuffix: "</font>" var batteryIndex = 1
do {
function getBatteryImage() if (!controller.parameterExists(-1, _batNCellsIndexedParamName.replace("#", batteryIndex))) {
{ return batteryIndex - 1
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";
} }
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 { 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.."))
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."))
}
Component { Loader {
id: calcVoltageDividerDlgComponent sourceComponent: batterySetupComponent
QGCViewDialog { property int batteryIndex: index + 1
id: calcVoltageDividerDlg property bool showBatteryIndex: batterySetupRepeater.count > 1
property bool useIndexedParamNames: _indexedBatteryParamsAvailable
}
}
QGCFlickable {
anchors.fill: parent
contentHeight: column.height
contentWidth: column.width
Column { QGCGroupBox {
id: column Layout.fillWidth: true
width: calcVoltageDividerDlg.width title: qsTr("ESC PWM Minimum and Maximum Calibration")
spacing: ScreenTools.defaultFontPixelHeight
ColumnLayout {
anchors.left: parent.left
anchors.right: parent.right
spacing: ScreenTools.defaultFontPixelWidth
QGCLabel { QGCLabel {
width: parent.width color: qgcPal.warningText
wrapMode: Text.WordWrap 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.") text: qsTr("WARNING: Propellers must be removed from vehicle prior to performing ESC calibration.")
Layout.fillWidth: true
} }
Grid {
columns: 2
spacing: ScreenTools.defaultFontPixelHeight / 2
verticalItemAlignment: Grid.AlignVCenter
QGCLabel { QGCLabel {
text: qsTr("Measured voltage:") text: qsTr("You must use USB connection for this operation.")
} }
QGCTextField { id: measuredVoltage }
QGCLabel { text: qsTr("Vehicle voltage:") } QGCButton {
QGCLabel { text: controller.vehicle.battery.voltage.valueString } text: qsTr("Calibrate")
width: ScreenTools.defaultFontPixelWidth * 20
onClicked: controller.calibrateEsc()
}
}
}
QGCLabel { text: qsTr("Voltage divider:") } QGCCheckBox {
FactLabel { fact: battVoltageDivider } id: showUAVCAN
text: qsTr("Show UAVCAN Settings")
checked: _uavcanEnable ? _uavcanEnable.rawValue !== 0 : false
} }
QGCButton { QGCGroupBox {
text: "Calculate" Layout.fillWidth: true
title: qsTr("UAVCAN Bus Configuration")
visible: showUAVCAN.checked
onClicked: { Row {
var measuredVoltageValue = parseFloat(measuredVoltage.text) id: uavCanConfigRow
if (measuredVoltageValue === 0 || isNaN(measuredVoltageValue)) { spacing: ScreenTools.defaultFontPixelWidth
return
FactComboBox {
id: _uavcanEnabledCheckBox
width: ScreenTools.defaultFontPixelWidth * 20
fact: _uavcanEnable
indexModel: false
} }
var newVoltageDivider = (measuredVoltageValue * battVoltageDivider.value) / controller.vehicle.battery.voltage.value
if (newVoltageDivider > 0) { QGCLabel {
battVoltageDivider.value = newVoltageDivider anchors.verticalCenter: parent.verticalCenter
text: qsTr("Change required restart")
} }
} }
} }
} // Column
} // QGCFlickable
} // QGCViewDialog
} // Component - calcVoltageDividerDlgComponent
Component { QGCGroupBox {
id: calcAmpsPerVoltDlgComponent Layout.fillWidth: true
title: qsTr("UAVCAN Motor Index and Direction Assignment")
QGCViewDialog { visible: showUAVCAN.checked
id: calcAmpsPerVoltDlg
QGCFlickable {
anchors.fill: parent
contentHeight: column.height
contentWidth: column.width
Column { ColumnLayout {
id: column anchors.left: parent.left
width: calcAmpsPerVoltDlg.width anchors.right: parent.right
spacing: ScreenTools.defaultFontPixelHeight spacing: ScreenTools.defaultFontPixelWidth
QGCLabel { QGCLabel {
width: parent.width
wrapMode: Text.WordWrap 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.") color: qgcPal.warningText
text: qsTr("WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration.")
Layout.fillWidth: true
} }
Grid {
columns: 2
spacing: ScreenTools.defaultFontPixelHeight / 2
verticalItemAlignment: Grid.AlignVCenter
QGCLabel { QGCLabel {
text: qsTr("Measured current:") wrapMode: Text.WordWrap
text: qsTr("ESC parameters will only be accessible in the editor after assignment.")
Layout.fillWidth: true
} }
QGCTextField { id: measuredCurrent }
QGCLabel { text: qsTr("Vehicle current:") }
QGCLabel { text: controller.vehicle.battery.current.valueString }
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
} }
var newAmpsPerVolt = (measuredCurrentValue * battAmpsPerVolt.value) / controller.vehicle.battery.current.value
if (newAmpsPerVolt != 0) { QGCButton {
battAmpsPerVolt.value = newAmpsPerVolt text: qsTr("Stop Assignment")
width: ScreenTools.defaultFontPixelWidth * 20
onClicked: controller.stopBusConfigureActuators()
} }
} }
} }
} // 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
...@@ -227,14 +258,12 @@ SetupPage { ...@@ -227,14 +258,12 @@ SetupPage {
} }
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,19 +272,17 @@ SetupPage { ...@@ -243,19 +272,17 @@ 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
} }
...@@ -269,13 +296,11 @@ SetupPage { ...@@ -269,13 +296,11 @@ SetupPage {
} }
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
} }
...@@ -290,218 +315,213 @@ SetupPage { ...@@ -290,218 +315,213 @@ SetupPage {
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")
onClicked: mainWindow.showComponentDialog(calcVoltageDividerDlgComponent, qsTr("Calculate Voltage Divider"), mainWindow.showDialogDefaultWidth, StandardButton.Close) visible: battVoltageDividerAvailable
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")
onClicked: mainWindow.showComponentDialog(calcAmpsPerVoltDlgComponent, qsTr("Calculate Amps per Volt"), mainWindow.showDialogDefaultWidth, StandardButton.Close) visible: battAmpsPerVoltAvailable
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 {
Layout.maximumWidth: batteryGroup.width
Layout.fillWidth: true
title: qsTr("ESC PWM Minimum and Maximum Calibration")
ColumnLayout { QGCCheckBox {
anchors.left: parent.left id: showAdvanced
anchors.right: parent.right Layout.columnSpan: batteryGrid.columns
spacing: ScreenTools.defaultFontPixelWidth text: qsTr("Show Advanced Settings")
}
QGCLabel { QGCLabel {
color: qgcPal.warningText text: qsTr("Voltage Drop on Full Load (per cell)")
wrapMode: Text.WordWrap visible: showAdvanced.checked
text: qsTr("WARNING: Propellers must be removed from vehicle prior to performing ESC calibration.")
Layout.fillWidth: true
} }
FactTextField {
id: battDropField
fact: battVoltLoadDrop
showUnits: true
visible: showAdvanced.checked
}
Item { width: 1; height: 1; Layout.columnSpan: 3; visible: showAdvanced.checked }
QGCLabel { QGCLabel {
text: qsTr("You must use USB connection for this operation.") 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
} }
QGCButton { QGCLabel {
text: qsTr("Calibrate") text: qsTr("Compensated Minimum Voltage:")
width: ScreenTools.defaultFontPixelWidth * 20 visible: showAdvanced.checked
onClicked: controller.calibrateEsc()
}
}
} }
QGCLabel {
QGCCheckBox { text: ((battNumCells.value * battLowVolt.value) - (battNumCells.value * battVoltLoadDrop.value)).toFixed(1) + qsTr(" V")
id: showUAVCAN visible: showAdvanced.checked
text: qsTr("Show UAVCAN Settings")
checked: uavcanEnable ? uavcanEnable.rawValue !== 0 : false
} }
Item { width: 1; height: 1; Layout.columnSpan: 3; visible: showAdvanced.checked }
} // Grid
} // QGCGroupBox - Battery settings
} // Component - batterySetupComponent
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 {
Layout.preferredWidth: gridLayout.width
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
color: qgcPal.warningText text: qsTr("Measure battery voltage using an external voltmeter and enter the value below. Click Calculate to set the new voltage multiplier.")
text: qsTr("WARNING: Propellers must be removed from vehicle prior to performing UAVCAN ESC configuration.")
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() 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
} }
} }
QGCCheckBox {
id: showAdvanced
text: qsTr("Show Advanced Settings")
} }
} // 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 {
Layout.preferredWidth: gridLayout.width
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: qsTr("Batteries show less voltage at high throttle. Enter the difference in Volts between idle throttle and full ") + 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.")
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
} }
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 }
} }
QGCLabel { QGCButton {
text: ((battNumCells.value * battLowVolt.value) - (battNumCells.value * battVoltLoadDrop.value)).toFixed(1) + qsTr(" V") text: qsTr("Calculate")
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
}
}
}
}
} }
} }
} // 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