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
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
|
|
|