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.
320 lines
9.7 KiB
320 lines
9.7 KiB
#include "BatteryMonitorConfig.h" |
|
#include <QMessageBox> |
|
|
|
BatteryMonitorConfig::BatteryMonitorConfig(QWidget *parent) : AP2ConfigWidget(parent) |
|
{ |
|
ui.setupUi(this); |
|
ui.monitorComboBox->addItem(tr("0: Disabled")); |
|
ui.monitorComboBox->addItem(tr("3: Battery Volts")); |
|
ui.monitorComboBox->addItem(tr("4: Voltage and Current")); |
|
|
|
ui.sensorComboBox->addItem(tr("0: Other")); |
|
ui.sensorComboBox->addItem("1: AttoPilot 45A"); |
|
ui.sensorComboBox->addItem("2: AttoPilot 90A"); |
|
ui.sensorComboBox->addItem("3: AttoPilot 180A"); |
|
ui.sensorComboBox->addItem("4: 3DR Power Module"); |
|
|
|
ui.apmVerComboBox->addItem("0: APM1"); |
|
ui.apmVerComboBox->addItem("1: APM2 - 2.5 non 3DR"); |
|
ui.apmVerComboBox->addItem("2: APM2.5 - 3DR Power Module"); |
|
ui.apmVerComboBox->addItem("3: PX4"); |
|
|
|
ui.alertOnLowCheckBox->setVisible(false); //Unimpelemented, but TODO. |
|
|
|
|
|
connect(ui.monitorComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(monitorCurrentIndexChanged(int))); |
|
connect(ui.sensorComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(sensorCurrentIndexChanged(int))); |
|
connect(ui.apmVerComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(apmVerCurrentIndexChanged(int))); |
|
|
|
connect(ui.calcDividerLineEdit,SIGNAL(editingFinished()),this,SLOT(calcDividerSet())); |
|
connect(ui.ampsPerVoltsLineEdit,SIGNAL(editingFinished()),this,SLOT(ampsPerVoltSet())); |
|
connect(ui.battCapacityLineEdit,SIGNAL(editingFinished()),this,SLOT(batteryCapacitySet())); |
|
|
|
|
|
initConnections(); |
|
} |
|
void BatteryMonitorConfig::activeUASSet(UASInterface *uas) |
|
{ |
|
if (m_uas) |
|
{ |
|
disconnect(m_uas,SIGNAL(batteryChanged(UASInterface*,double,double,double,int)),this,SLOT(batteryChanged(UASInterface*,double,double,double,int))); |
|
} |
|
AP2ConfigWidget::activeUASSet(uas); |
|
if (!uas) |
|
{ |
|
return; |
|
} |
|
connect(uas,SIGNAL(batteryChanged(UASInterface*,double,double,double,int)),this,SLOT(batteryChanged(UASInterface*,double,double,double,int))); |
|
|
|
} |
|
void BatteryMonitorConfig::alertOnLowClicked(bool checked) |
|
{ |
|
Q_UNUSED(checked); |
|
} |
|
|
|
void BatteryMonitorConfig::calcDividerSet() |
|
{ |
|
if (!m_uas) |
|
{ |
|
showNullMAVErrorMessageBox(); |
|
return; |
|
} |
|
bool ok = false; |
|
float newval = ui.calcDividerLineEdit->text().toFloat(&ok); |
|
if (!ok) |
|
{ |
|
//Error parsing; |
|
QMessageBox::information(0,"Error","Invalid number entered for voltage divider. Please try again"); |
|
return; |
|
} |
|
m_uas->getParamManager()->setParameter(1,"VOLT_DIVIDER",newval); |
|
} |
|
void BatteryMonitorConfig::ampsPerVoltSet() |
|
{ |
|
if (!m_uas) |
|
{ |
|
showNullMAVErrorMessageBox(); |
|
return; |
|
} |
|
bool ok = false; |
|
float newval = ui.ampsPerVoltsLineEdit->text().toFloat(&ok); |
|
if (!ok) |
|
{ |
|
//Error parsing; |
|
QMessageBox::information(0,"Error","Invalid number entered for amps per volts. Please try again"); |
|
return; |
|
} |
|
m_uas->getParamManager()->setParameter(1,"AMPS_PER_VOLT",newval); |
|
} |
|
void BatteryMonitorConfig::batteryCapacitySet() |
|
{ |
|
if (!m_uas) |
|
{ |
|
showNullMAVErrorMessageBox(); |
|
return; |
|
} |
|
bool ok = false; |
|
float newval = ui.battCapacityLineEdit->text().toFloat(&ok); |
|
if (!ok) |
|
{ |
|
//Error parsing; |
|
QMessageBox::information(0,"Error","Invalid number entered for amps per volts. Please try again"); |
|
return; |
|
} |
|
m_uas->getParamManager()->setParameter(1,"BATT_CAPACITY",newval); |
|
} |
|
|
|
void BatteryMonitorConfig::monitorCurrentIndexChanged(int index) |
|
{ |
|
if (!m_uas) |
|
{ |
|
showNullMAVErrorMessageBox(); |
|
return; |
|
} |
|
if (index == 0) //Battery Monitor Disabled |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_VOLT_PIN",-1); |
|
m_uas->getParamManager()->setParameter(1,"BATT_CURR_PIN",-1); |
|
m_uas->getParamManager()->setParameter(1,"BATT_MONITOR",0); |
|
ui.sensorComboBox->setEnabled(false); |
|
ui.apmVerComboBox->setEnabled(false); |
|
ui.measuredVoltsLineEdit->setEnabled(false); |
|
ui.measuredVoltsLineEdit->setEnabled(false); |
|
ui.calcDividerLineEdit->setEnabled(false); |
|
ui.calcVoltsLineEdit->setEnabled(false); |
|
ui.ampsPerVoltsLineEdit->setEnabled(false); |
|
} |
|
else if (index == 1) //Monitor voltage only |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_MONITOR",3); |
|
ui.sensorComboBox->setEnabled(false); |
|
ui.apmVerComboBox->setEnabled(true); |
|
ui.measuredVoltsLineEdit->setEnabled(true); |
|
ui.calcDividerLineEdit->setEnabled(true); |
|
ui.calcVoltsLineEdit->setEnabled(false); |
|
ui.ampsPerVoltsLineEdit->setEnabled(false); |
|
} |
|
else if (index == 2) //Monitor voltage and current |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_MONITOR",4); |
|
ui.sensorComboBox->setEnabled(true); |
|
ui.apmVerComboBox->setEnabled(true); |
|
ui.measuredVoltsLineEdit->setEnabled(true); |
|
ui.calcDividerLineEdit->setEnabled(true); |
|
ui.calcVoltsLineEdit->setEnabled(false); |
|
ui.ampsPerVoltsLineEdit->setEnabled(true); |
|
} |
|
|
|
|
|
} |
|
void BatteryMonitorConfig::sensorCurrentIndexChanged(int index) |
|
{ |
|
float maxvolt = 0.0; |
|
float maxamps = 0.0; |
|
float mvpervolt = 0.0; |
|
float mvperamp = 0.0; |
|
float topvolt = 0.0; |
|
float topamps = 0.0; |
|
|
|
if (index == 1) |
|
{ |
|
//atto 45 see https://www.sparkfun.com/products/10643 |
|
maxvolt = 13.6; |
|
maxamps = 44.7; |
|
} |
|
else if (index == 2) |
|
{ |
|
//atto 90 see https://www.sparkfun.com/products/9028 |
|
maxvolt = 51.8; |
|
maxamps = 89.4; |
|
} |
|
else if (index == 3) |
|
{ |
|
//atto 180 see https://www.sparkfun.com/products/10644 |
|
maxvolt = 51.8; |
|
maxamps = 178.8; |
|
} |
|
else if (index == 4) |
|
{ |
|
//3dr |
|
maxvolt = 50.0; |
|
maxamps = 90.0; |
|
} |
|
mvpervolt = calculatemVPerVolt(3.3,maxvolt); |
|
mvperamp = calculatemVPerAmp(3.3,maxamps); |
|
if (index == 0) |
|
{ |
|
//Other |
|
ui.ampsPerVoltsLineEdit->setEnabled(true); |
|
ui.calcDividerLineEdit->setEnabled(true); |
|
ui.measuredVoltsLineEdit->setEnabled(true); |
|
} |
|
else |
|
{ |
|
topvolt = (maxvolt * mvpervolt) / 1000.0; |
|
topamps = (maxamps * mvperamp) / 1000.0; |
|
|
|
ui.calcDividerLineEdit->setText(QString::number(maxvolt/topvolt)); |
|
ui.ampsPerVoltsLineEdit->setText(QString::number(maxamps / topamps)); |
|
ui.ampsPerVoltsLineEdit->setEnabled(false); |
|
ui.calcDividerLineEdit->setEnabled(false); |
|
ui.measuredVoltsLineEdit->setEnabled(false); |
|
} |
|
} |
|
float BatteryMonitorConfig::calculatemVPerAmp(float maxvoltsout,float maxamps) |
|
{ |
|
return (1000.0 * (maxvoltsout/maxamps)); |
|
} |
|
|
|
float BatteryMonitorConfig::calculatemVPerVolt(float maxvoltsout,float maxvolts) |
|
{ |
|
return (1000.0 * (maxvoltsout/maxvolts)); |
|
} |
|
|
|
void BatteryMonitorConfig::apmVerCurrentIndexChanged(int index) |
|
{ |
|
if (!m_uas) |
|
{ |
|
showNullMAVErrorMessageBox(); |
|
return; |
|
} |
|
if (index == 0) //APM1 |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_VOLT_PIN",0); |
|
m_uas->getParamManager()->setParameter(1,"BATT_CURR_PIN",1); |
|
} |
|
else if (index == 1) //APM2 |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_VOLT_PIN",1); |
|
m_uas->getParamManager()->setParameter(1,"BATT_CURR_PIN",2); |
|
} |
|
else if (index == 2) //APM2.5 |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_VOLT_PIN",13); |
|
m_uas->getParamManager()->setParameter(1,"BATT_CURR_PIN",12); |
|
} |
|
else if (index == 3) //PX4 |
|
{ |
|
m_uas->getParamManager()->setParameter(1,"BATT_VOLT_PIN",100); |
|
m_uas->getParamManager()->setParameter(1,"BATT_CURR_PIN",101); |
|
m_uas->getParamManager()->setParameter(1,"VOLT_DIVIDER",1); |
|
ui.calcDividerLineEdit->setText("1"); |
|
} |
|
} |
|
|
|
BatteryMonitorConfig::~BatteryMonitorConfig() |
|
{ |
|
} |
|
void BatteryMonitorConfig::batteryChanged(UASInterface* uas, double voltage, double current, double percent, int seconds) |
|
{ |
|
Q_UNUSED(uas); |
|
Q_UNUSED(current); |
|
Q_UNUSED(percent); |
|
Q_UNUSED(seconds); |
|
|
|
ui.calcVoltsLineEdit->setText(QString::number(voltage,'f',2)); |
|
if (ui.measuredVoltsLineEdit->text() == "") |
|
{ |
|
ui.measuredVoltsLineEdit->setText(ui.calcVoltsLineEdit->text()); |
|
} |
|
} |
|
|
|
void BatteryMonitorConfig::parameterChanged(int uas, int component, QString parameterName, QVariant value) |
|
{ |
|
Q_UNUSED(uas); |
|
Q_UNUSED(component); |
|
|
|
if (parameterName == "VOLT_DIVIDER") |
|
{ |
|
ui.calcDividerLineEdit->setText(QString::number(value.toFloat(),'f',4)); |
|
} |
|
else if (parameterName == "AMP_PER_VOLT") |
|
{ |
|
ui.ampsPerVoltsLineEdit->setText(QString::number(value.toFloat(),'g',2)); |
|
|
|
} |
|
else if (parameterName == "BATT_MONITOR") |
|
{ |
|
if (value.toInt() == 0) //0: Disable |
|
{ |
|
ui.monitorComboBox->setCurrentIndex(0); |
|
} |
|
else if (value.toInt() == 3) //3: Battery volts |
|
{ |
|
ui.monitorComboBox->setCurrentIndex(1); |
|
} |
|
else if (value.toInt() == 4) //4: Voltage and Current |
|
{ |
|
ui.monitorComboBox->setCurrentIndex(2); |
|
} |
|
|
|
} |
|
else if (parameterName == "BATT_CAPACITY") |
|
{ |
|
ui.battCapacityLineEdit->setText(QString::number(value.toFloat())); |
|
} |
|
else if (parameterName == "BATT_VOLT_PIN") |
|
{ |
|
int ivalue = value.toInt(); |
|
if (ivalue == 0) //APM1 |
|
{ |
|
ui.apmVerComboBox->setCurrentIndex(0); |
|
} |
|
else if (ivalue == 1) //APM2 |
|
{ |
|
ui.apmVerComboBox->setCurrentIndex(1); |
|
} |
|
else if (ivalue == 13) //APM2.5 |
|
{ |
|
ui.apmVerComboBox->setCurrentIndex(2); |
|
} |
|
else if (ivalue == 100) //PX4 |
|
{ |
|
ui.apmVerComboBox->setCurrentIndex(3); |
|
} |
|
} |
|
else if (parameterName == "BATT_CURR_PIN") |
|
{ |
|
//Unused at the moment, everything is off BATT_VOLT_PIN |
|
} |
|
}
|
|
|