地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

619 lines
26 KiB

/****************************************************************************
*
* (c) 2009-2016 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.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
import QGroundControl.ScreenTools 1.0
SetupPage {
id: powerPage
pageComponent: powerPageComponent
FactPanelController {
id: controller
factPanel: powerPage.viewPanel
}
Component {
id: powerPageComponent
Flow {
id: flowLayout
width: availableWidth
spacing: _margins
property Fact _batt1Monitor: controller.getParameterFact(-1, "BATT_MONITOR")
property Fact _batt2Monitor: controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */)
property bool _batt2MonitorAvailable: controller.parameterExists(-1, "BATT2_MONITOR")
property bool _batt1MonitorEnabled: _batt1Monitor.rawValue !== 0
property bool _batt2MonitorEnabled: _batt2MonitorAvailable && _batt2Monitor.rawValue !== 0
property bool _batt1ParamsAvailable: controller.parameterExists(-1, "BATT_CAPACITY")
property bool _batt2ParamsAvailable: controller.parameterExists(-1, "BATT2_CAPACITY")
property bool _showBatt1Reboot: _batt1MonitorEnabled && !_batt1ParamsAvailable
property bool _showBatt2Reboot: _batt2MonitorEnabled && !_batt2ParamsAvailable
property bool _escCalibrationAvailable: controller.parameterExists(-1, "ESC_CALIBRATION")
property Fact _escCalibration: controller.getParameterFact(-1, "ESC_CALIBRATION", false /* reportMissing */)
property string _restartRequired: qsTr("Requires vehicle reboot")
QGCPalette { id: ggcPal; colorGroupEnabled: true }
// Battery1 Monitor settings only - used when only monitor param is available
Column {
spacing: _margins / 2
visible: !_batt1MonitorEnabled || !_batt1ParamsAvailable
QGCLabel {
text: qsTr("Battery 1")
font.family: ScreenTools.demiboldFontFamily
}
Rectangle {
width: batt1Column.x + batt1Column.width + _margins
height: batt1Column.y + batt1Column.height + _margins
color: ggcPal.windowShade
ColumnLayout {
id: batt1Column
anchors.margins: _margins
anchors.top: parent.top
anchors.left: parent.left
spacing: ScreenTools.defaultFontPixelWidth
RowLayout {
id: batt1MonitorRow
spacing: ScreenTools.defaultFontPixelWidth
QGCLabel { text: qsTr("Battery1 monitor:") }
FactComboBox {
id: monitor1Combo
fact: _batt1Monitor
indexModel: false
}
}
QGCLabel {
text: _restartRequired
visible: _showBatt1Reboot
}
QGCButton {
text: qsTr("Reboot vehicle")
visible: _showBatt1Reboot
onClicked: controller.vehicle.rebootVehicle()
}
}
}
}
// Battery 1 settings
Column {
id: _batt1FullSettings
spacing: _margins / 2
visible: _batt1MonitorEnabled && _batt1ParamsAvailable
QGCLabel {
text: qsTr("Battery 1")
font.family: ScreenTools.demiboldFontFamily
}
Rectangle {
width: battery1Loader.x + battery1Loader.width + _margins
height: battery1Loader.y + battery1Loader.height + _margins
color: ggcPal.windowShade
Loader {
id: battery1Loader
anchors.margins: _margins
anchors.top: parent.top
anchors.left: parent.left
sourceComponent: _batt1FullSettings.visible ? powerSetupComponent : undefined
property Fact armVoltMin: controller.getParameterFact(-1, "r.BATT_ARM_VOLT", false /* reportMissing */)
property Fact battAmpPerVolt: controller.getParameterFact(-1, "r.BATT_AMP_PERVLT", false /* reportMissing */)
property Fact battCapacity: controller.getParameterFact(-1, "BATT_CAPACITY", false /* reportMissing */)
property Fact battCurrPin: controller.getParameterFact(-1, "BATT_CURR_PIN", false /* reportMissing */)
property Fact battMonitor: controller.getParameterFact(-1, "BATT_MONITOR", false /* reportMissing */)
property Fact battVoltMult: controller.getParameterFact(-1, "BATT_VOLT_MULT", false /* reportMissing */)
property Fact battVoltPin: controller.getParameterFact(-1, "BATT_VOLT_PIN", false /* reportMissing */)
property Fact vehicleVoltage: controller.vehicle.battery.voltage
property Fact vehicleCurrent: controller.vehicle.battery.current
}
}
}
// Battery2 Monitor settings only - used when only monitor param is available
Column {
spacing: _margins / 2
visible: !_batt2MonitorEnabled || !_batt2ParamsAvailable
QGCLabel {
text: qsTr("Battery 2")
font.family: ScreenTools.demiboldFontFamily
}
Rectangle {
width: batt2Column.x + batt2Column.width + _margins
height: batt2Column.y + batt2Column.height + _margins
color: ggcPal.windowShade
ColumnLayout {
id: batt2Column
anchors.margins: _margins
anchors.top: parent.top
anchors.left: parent.left
spacing: ScreenTools.defaultFontPixelWidth
RowLayout {
id: batt2MonitorRow
spacing: ScreenTools.defaultFontPixelWidth
QGCLabel { text: qsTr("Battery2 monitor:") }
FactComboBox {
id: monitor2Combo
fact: _batt2Monitor
indexModel: false
}
}
QGCLabel {
text: _restartRequired
visible: _showBatt2Reboot
}
QGCButton {
text: qsTr("Reboot vehicle")
visible: _showBatt2Reboot
onClicked: controller.vehicle.rebootVehicle()
}
}
}
}
// Battery 2 settings - Used when full params are available
Column {
id: batt2FullSettings
spacing: _margins / 2
visible: _batt2MonitorEnabled && _batt2ParamsAvailable
QGCLabel {
text: qsTr("Battery 2")
font.family: ScreenTools.demiboldFontFamily
}
Rectangle {
width: battery2Loader.x + battery2Loader.width + _margins
height: battery2Loader.y + battery2Loader.height + _margins
color: ggcPal.windowShade
Loader {
id: battery2Loader
anchors.margins: _margins
anchors.top: parent.top
anchors.left: parent.left
sourceComponent: batt2FullSettings.visible ? powerSetupComponent : undefined
property Fact armVoltMin: controller.getParameterFact(-1, "r.BATT2_ARM_VOLT", false /* reportMissing */)
property Fact battAmpPerVolt: controller.getParameterFact(-1, "r.BATT2_AMP_PERVLT", false /* reportMissing */)
property Fact battCapacity: controller.getParameterFact(-1, "BATT2_CAPACITY", false /* reportMissing */)
property Fact battCurrPin: controller.getParameterFact(-1, "BATT2_CURR_PIN", false /* reportMissing */)
property Fact battMonitor: controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */)
property Fact battVoltMult: controller.getParameterFact(-1, "BATT2_VOLT_MULT", false /* reportMissing */)
property Fact battVoltPin: controller.getParameterFact(-1, "BATT2_VOLT_PIN", false /* reportMissing */)
property Fact vehicleVoltage: controller.vehicle.battery2.voltage
property Fact vehicleCurrent: controller.vehicle.battery2.current
}
}
}
Column {
spacing: _margins / 2
visible: _escCalibrationAvailable
QGCLabel {
text: qsTr("ESC Calibration")
font.family: ScreenTools.demiboldFontFamily
}
Rectangle {
width: escCalibrationHolder.x + escCalibrationHolder.width + _margins
height: escCalibrationHolder.y + escCalibrationHolder.height + _margins
color: ggcPal.windowShade
Column {
id: escCalibrationHolder
x: _margins
y: _margins
spacing: _margins
Column {
spacing: _margins
QGCLabel {
text: qsTr("WARNING: Remove props prior to calibration!")
color: qgcPal.warningText
}
Row {
spacing: _margins
QGCButton {
text: qsTr("Calibrate")
enabled: _escCalibration.rawValue === 0
onClicked: _escCalibration.rawValue = 3
}
Column {
enabled: _escCalibration.rawValue === 3
QGCLabel { text: _escCalibration.rawValue === 3 ? qsTr("Now perform these steps:") : qsTr("Click Calibrate to start, then:") }
QGCLabel { text: qsTr("- Disconnect USB and battery so flight controller powers down") }
QGCLabel { text: qsTr("- Connect the battery") }
QGCLabel { text: qsTr("- The arming tone will be played (if the vehicle has a buzzer attached)") }
QGCLabel { text: qsTr("- If using a flight controller with a safety button press it until it displays solid red") }
QGCLabel { text: qsTr("- You will hear a musical tone then two beeps") }
QGCLabel { text: qsTr("- A few seconds later you should hear a number of beeps (one for each battery cell you’re using)") }
QGCLabel { text: qsTr("- And finally a single long beep indicating the end points have been set and the ESC is calibrated") }
QGCLabel { text: qsTr("- Disconnect the battery and power up again normally") }
}
}
}
}
}
}
} // Flow
} // Component - powerPageComponent
Component {
id: powerSetupComponent
Column {
spacing: _margins
property real _margins: ScreenTools.defaultFontPixelHeight / 2
property bool _showAdvanced: sensorCombo.currentIndex === sensorModel.count - 1
property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 25
Component.onCompleted: calcSensor()
function calcSensor() {
for (var i=0; i<sensorModel.count - 1; i++) {
if (sensorModel.get(i).voltPin == battVoltPin.value &&
sensorModel.get(i).currPin == battCurrPin.value &&
Math.abs(sensorModel.get(i).voltMult - battVoltMult.value) < 0.001 &&
Math.abs(sensorModel.get(i).ampPerVolt - battAmpPerVolt.value) < 0.0001) {
sensorCombo.currentIndex = i
return
}
}
sensorCombo.currentIndex = sensorModel.count - 1
}
QGCPalette { id: palette; colorGroupEnabled: true }
ListModel {
id: sensorModel
ListElement {
text: qsTr("Power Module 90A")
voltPin: 2
currPin: 3
voltMult: 10.1
ampPerVolt: 17.0
}
ListElement {
text: qsTr("Power Module HV")
voltPin: 2
currPin: 3
voltMult: 12.02
ampPerVolt: 39.877
}
ListElement {
text: qsTr("3DR Iris")
voltPin: 2
currPin: 3
voltMult: 12.02
ampPerVolt: 17.0
}
ListElement {
text: qsTr("Other")
}
}
GridLayout {
columns: 3
rowSpacing: _margins
columnSpacing: _margins
QGCLabel { text: qsTr("Battery monitor:") }
FactComboBox {
id: monitorCombo
fact: battMonitor
indexModel: false
}
QGCLabel {
Layout.row: 1
Layout.column: 0
text: qsTr("Battery capacity:")
}
FactTextField {
id: capacityField
width: _fieldWidth
fact: battCapacity
}
QGCLabel {
Layout.row: 2
Layout.column: 0
text: qsTr("Minimum arming voltage:")
}
FactTextField {
id: armVoltField
width: _fieldWidth
fact: armVoltMin
}
QGCLabel {
Layout.row: 3
Layout.column: 0
text: qsTr("Power sensor:")
}
QGCComboBox {
id: sensorCombo
Layout.minimumWidth: _fieldWidth
model: sensorModel
onActivated: {
if (index < sensorModel.count - 1) {
battVoltPin.value = sensorModel.get(index).voltPin
battCurrPin.value = sensorModel.get(index).currPin
battVoltMult.value = sensorModel.get(index).voltMult
battAmpPerVolt.value = sensorModel.get(index).ampPerVolt
} else {
}
}
}
QGCLabel {
Layout.row: 4
Layout.column: 0
text: qsTr("Current pin:")
visible: _showAdvanced
}
FactComboBox {
Layout.minimumWidth: _fieldWidth
fact: battCurrPin
indexModel: false
visible: _showAdvanced
}
QGCLabel {
Layout.row: 5
Layout.column: 0
text: qsTr("Voltage pin:")
visible: _showAdvanced
}
FactComboBox {
Layout.minimumWidth: _fieldWidth
fact: battVoltPin
indexModel: false
visible: _showAdvanced
}
QGCLabel {
Layout.row: 6
Layout.column: 0
text: qsTr("Voltage multiplier:")
visible: _showAdvanced
}
FactTextField {
width: _fieldWidth
fact: battVoltMult
visible: _showAdvanced
}
QGCButton {
text: qsTr("Calculate")
visible: _showAdvanced
onClicked: {
_calcVoltageDlgVehicleVoltage = vehicleVoltage
_calcVoltageDlgBattVoltMultParam = battVoltMult
showDialog(calcVoltageMultiplierDlgComponent, qsTr("Calculate Voltage Multiplier"), qgcView.showDialogDefaultWidth, StandardButton.Close)
}
}
QGCLabel {
Layout.columnSpan: 3
Layout.fillWidth: true
font.pointSize: ScreenTools.smallFontPointSize
wrapMode: Text.WordWrap
text: qsTr("If the battery voltage reported by the vehicle is largely different than the voltage read externally using a voltmeter you can adjust the voltage multiplier value to correct this. Click the Calculate button for help with calculating a new value.")
visible: _showAdvanced
}
QGCLabel {
text: qsTr("Amps per volt:")
visible: _showAdvanced
}
FactTextField {
width: _fieldWidth
fact: battAmpPerVolt
visible: _showAdvanced
}
QGCButton {
text: qsTr("Calculate")
visible: _showAdvanced
onClicked: {
_calcAmpsPerVoltDlgVehicleCurrent = vehicleCurrent
_calcAmpsPerVoltDlgBattAmpPerVoltParam = battAmpPerVolt
showDialog(calcAmpsPerVoltDlgComponent, qsTr("Calculate Amps per Volt"), qgcView.showDialogDefaultWidth, StandardButton.Close)
}
}
QGCLabel {
Layout.columnSpan: 3
Layout.fillWidth: true
font.pointSize: ScreenTools.smallFontPointSize
wrapMode: Text.WordWrap
text: qsTr("If the current draw reported by the vehicle is largely different than the current read externally using a current meter you can adjust the amps per volt value to correct this. Click the Calculate button for help with calculating a new value.")
visible: _showAdvanced
}
} // GridLayout
} // Column
} // Component - powerSetupComponent
// Must be set prior to use of calcVoltageMultiplierDlgComponent
property Fact _calcVoltageDlgVehicleVoltage
property Fact _calcVoltageDlgBattVoltMultParam
Component {
id: calcVoltageMultiplierDlgComponent
QGCViewDialog {
id: calcVoltageMultiplierDlg
QGCFlickable {
anchors.fill: parent
contentHeight: column.height
contentWidth: column.width
Column {
id: column
width: calcVoltageMultiplierDlg.width
spacing: ScreenTools.defaultFontPixelHeight
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("Measure battery voltage using an external voltmeter and enter the value below. Click Calculate to set the new voltage multiplier.")
}
Grid {
columns: 2
spacing: ScreenTools.defaultFontPixelHeight / 2
verticalItemAlignment: Grid.AlignVCenter
QGCLabel {
text: qsTr("Measured voltage:")
}
QGCTextField { id: measuredVoltage }
QGCLabel { text: qsTr("Vehicle voltage:") }
FactLabel { fact: _calcVoltageDlgVehicleVoltage }
QGCLabel { text: qsTr("Voltage multiplier:") }
FactLabel { fact: _calcVoltageDlgBattVoltMultParam }
}
QGCButton {
text: "Calculate"
onClicked: {
var measuredVoltageValue = parseFloat(measuredVoltage.text)
if (measuredVoltageValue == 0 || isNaN(measuredVoltageValue)) {
return
}
var newVoltageMultiplier = (measuredVoltageValue * _calcVoltageDlgBattVoltMultParam.value) / _calcVoltageDlgVehicleVoltage.value
if (newVoltageMultiplier > 0) {
_calcVoltageDlgBattVoltMultParam.value = newVoltageMultiplier
}
}
}
} // Column
} // QGCFlickable
} // QGCViewDialog
} // Component - calcVoltageMultiplierDlgComponent
// Must be set prior to use of calcAmpsPerVoltDlgComponent
property Fact _calcAmpsPerVoltDlgVehicleCurrent
property Fact _calcAmpsPerVoltDlgBattAmpPerVoltParam
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 {
columns: 2
spacing: ScreenTools.defaultFontPixelHeight / 2
verticalItemAlignment: Grid.AlignVCenter
QGCLabel {
text: qsTr("Measured current:")
}
QGCTextField { id: measuredCurrent }
QGCLabel { text: qsTr("Vehicle current:") }
FactLabel { fact: _calcAmpsPerVoltDlgVehicleCurrent }
QGCLabel { text: qsTr("Amps per volt:") }
FactLabel { fact: _calcAmpsPerVoltDlgBattAmpPerVoltParam }
}
QGCButton {
text: "Calculate"
onClicked: {
var measuredCurrentValue = parseFloat(measuredCurrent.text)
if (measuredCurrentValue == 0) {
return
}
var newAmpsPerVolt = (measuredCurrentValue * _calcAmpsPerVoltDlgBattAmpPerVoltParam.value) / _calcAmpsPerVoltDlgVehicleCurrent.value
if (newAmpsPerVolt != 0) {
_calcAmpsPerVoltDlgBattAmpPerVoltParam.value = newAmpsPerVolt
}
}
}
} // Column
} // QGCFlickable
} // QGCViewDialog
} // Component - calcAmpsPerVoltDlgComponent
} // SetupPage