#include "laserramancontroller.h"
#include "ui_laserramancontroller.h"
#define APPNAME "FalconGUI"

LaserRamanController::LaserRamanController(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::LaserRamanController)
{
    ui->setupUi(this);
    bLaserOn = false;
    adc = new VersalogicMMPEEAX();
    QMessageBox::StandardButton ret = QMessageBox::Retry;
    while (ret == QMessageBox::Retry) {
        if (!adc->isConnected()) {
            printf("%s: Failed to connect to VersalogicMMPEEAX Analog Input Module\n", APPNAME);
            ret = QMessageBox::critical(this,"Cannot Connect",
                                        "Cannot connect to A/D device, please check device drivers and restart the program.",
                                        QMessageBox::Retry|QMessageBox::Cancel,QMessageBox::Retry);
            if (ret == QMessageBox::Retry) adc->open();
        }
        else ret = QMessageBox::Ok;
    }
    if (ret == QMessageBox::Cancel)       {
        //TODO can the software. exit();
    }

    //Ok open the appropriate serial port.
    TCHAR sCommPort[] = "COM1";
    tsp = new triggerSerialPort(sCommPort);
    if (!tsp->isConnected()) {
        QMessageBox::critical(this,"Cannot Connect",
                              "Cannot connect to serial port COM1, please check device drivers and restart the program.",
                              QMessageBox::Ok);
    }

    // Set Channel Names (for now staticly set)
    ui->lbl_ch1Name->setText("Ambient Temp");
    ui->lbl_ch2Name->setText("ADC_CH2");
    ui->lbl_ch3Name->setText("Humidity");
    ui->lbl_ch4Name->setText("ADC_CH4");
    ui->lbl_ch5Name->setText("PSU Temp");
    ui->lbl_ch6Name->setText("ADC_CH6");
    ui->lbl_ch7Name->setText("Laser Temp");
    ui->lbl_ch8Name->setText("Spectrometer Temp");

    ui->lbl_ch1Units->setText("C");
    ui->lbl_ch2Units->setText("");
    ui->lbl_ch3Units->setText("%RH");
    ui->lbl_ch4Units->setText("");
    ui->lbl_ch5Units->setText("C");
    ui->lbl_ch6Units->setText("");
    ui->lbl_ch7Units->setText("C");
    ui->lbl_ch8Units->setText("C");


    //Set up and connect the timer
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()),this,SLOT(readAI()));


    connect(ui->pushButton,SIGNAL(clicked()), this, SLOT(on_pushButton_toggled()));
    connect(ui->actionAbout_LaserRamanController, SIGNAL(triggered()),this, SLOT(on_actionAbout_LaserRamanController_triggered()),Qt::UniqueConnection);
    timer->start(1000);
}

LaserRamanController::~LaserRamanController()
{
    adc->close();
    tsp->closeSerialPort();
    delete ui;
    delete adc;
    delete tsp;

}

void LaserRamanController::on_pushButton_toggled()
{
    //Double Check
    int ret = QMessageBox::warning(this,"Laser Power Verification","Are you sure you want to turn the laser on/off?",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);

    if (ret == QMessageBox::Yes )
    {
        //Turn on the laser DIG OUT
        if (!bLaserOn) {
            tsp->setRTS(1);
            ui->lbl_laserStatus->setText("Laser is ON");
            bLaserOn = true;
        }
        else {
            tsp->setRTS(0);
            ui->lbl_laserStatus->setText("Laser is OFF");
            bLaserOn = false;
        }
        //if laser on

        //if laser off
    }
}



void LaserRamanController::on_actionAbout_LaserRamanController_triggered()
{
    QMessageBox msgBox;
    msgBox.setText("Laser Raman Controller\n Version 1.0.0\n Copyright MBARI 2015");
    msgBox.exec();
}

double LaserRamanController::calcAD592Temp(double voltage)
{
    double temp;
    temp = 1050*voltage -273.15;
    return temp;
}

double LaserRamanController::calcSpectTemp(double voltage)
{
    double temp;
    temp = 200*(voltage) -273.15;//there is a gain of 5 on the amplifier
    return temp;
}



double LaserRamanController::calcHTM2500lfHumidity(double voltage)
{
    double humid;
    humid = 0.0375*1000*voltage -37.7;
    return humid;
}

double LaserRamanController::calcHTM2500lfTemperature(double voltage)
{
    double temp;
    temp = -2.4283 * pow(voltage,3) + 19.9963 * pow(voltage,2)+ -74.1851 * voltage + 123.3241;
    return temp;
}

void LaserRamanController::readAI() {
   if (!adc->isConnected())
        return;

    adc->readAllAIChannels();
    char lblstr[32];

    // set raw values
    for (int i=0; i<VL_MAXAIN;i++){
        {   sprintf(lblstr,"%6.3f",adc->dAINValues[i]);
            switch(i) {
            case 0:
                ui->lbl_ch1Raw->setText(lblstr);
                break;
            case 1:
                ui->lbl_ch2Raw->setText(lblstr);
                break;
            case 2:
                ui->lbl_ch3Raw->setText(lblstr);
                break;
            case 3:
                ui->lbl_ch4Raw->setText(lblstr);
                break;
            case 4:
                ui->lbl_ch5Raw->setText(lblstr);
                break;
            case 5:
                ui->lbl_ch6Raw->setText(lblstr);
                break;
            case 6:
                ui->lbl_ch7Raw->setText(lblstr);
                break;
            case 7:
                ui->lbl_ch8Raw->setText(lblstr);
                break;
            }
        }
    }

    // calculate and set values.
    double cv;
    for (int i=0; i<VL_MAXAIN;i++){
        {
            switch(i) {
            case 0:
                cv = calcHTM2500lfTemperature(adc->dAINValues[i]);
                sprintf_s(lblstr,"%6.2f",cv);
                ui->lbl_ch1Calc->setText(lblstr);
                break;
            case 1:
                sprintf_s(lblstr,"");
                ui->lbl_ch2Calc->setText(lblstr);
                break;
            case 2:
                cv = calcHTM2500lfHumidity(adc->dAINValues[i]);
                sprintf_s(lblstr,"%6.2f",cv);
                ui->lbl_ch3Calc->setText(lblstr);
                break;
            case 3:
                sprintf_s(lblstr,"");
                ui->lbl_ch4Calc->setText(lblstr);
                break;
            case 4:
                cv = calcAD592Temp(adc->dAINValues[i]);
                sprintf_s(lblstr,"%6.2f",cv);
                ui->lbl_ch5Calc->setText(lblstr);
                break;
            case 5:
                sprintf_s(lblstr,"");
                ui->lbl_ch6Calc->setText(lblstr);
                break;
            case 6:
                cv = calcAD592Temp(adc->dAINValues[i]);
                sprintf_s(lblstr,"%6.2f",cv);
                ui->lbl_ch7Calc->setText(lblstr);
                break;
            case 7:
                cv = calcSpectTemp(adc->dAINValues[i]);
                sprintf_s(lblstr,"%6.2f",cv);
                ui->lbl_ch8Calc->setText(lblstr);
                break;
            }
        }
    }




}


