#include "BatteryMonitorConfig.h"
#include <QMessageBox>

BatteryMonitorConfig::BatteryMonitorConfig(QWidget *parent) : AP2ConfigWidget(parent)
{
    ui.setupUi(this);
    ui.monitorComboBox->addItem("0: Disabled");
    ui.monitorComboBox->addItem("3: Battery Volts");
    ui.monitorComboBox->addItem("4: Voltage and Current");

    ui.sensorComboBox->addItem("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);


    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()));



}
void BatteryMonitorConfig::calcDividerSet()
{
    if (!m_uas)
    {
        QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
        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)
    {
        QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
        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)
    {
        QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
        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)
    {
        QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
        return;
    }
    if (index == 0)
    {
        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)
    {
        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)
    {
        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;
    float maxamps = 0;
    float mvpervolt = 0;
    float mvperamp = 0;
    float topvolt = 0;
    float topamps = 0;

    if (index == 1)
    {
        //atto 45
        maxvolt = 13.6;
        maxamps = 44.7;
        mvpervolt = 242.3;
        mvperamp = 73.20;
    }
    else if (index == 2)
    {
        //atto 90
        maxvolt = 50;
        maxamps = 89.4;
        mvpervolt = 63.69;
        mvperamp = 36.60;
    }
    else if (index == 3)
    {
        //atto 180
        maxvolt = 50;
        maxamps = 178.8;
        mvpervolt = 63.69;
        mvperamp = 18.30;
    }
    else if (index == 4)
    {
        //3dr
        maxvolt = 50;
        maxamps = 90;
        mvpervolt = 100;
        mvperamp = 55.55;
    }
    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);
    }
}

void BatteryMonitorConfig::apmVerCurrentIndexChanged(int index)
{
    if (!m_uas)
    {
        QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
        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::parameterChanged(int uas, int component, QString parameterName, QVariant value)
{
    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
    }
}
