#include "rigconfig.h"
#include "ui_rigconfig.h"
#include "appglobal.h"
#include "configparams.h"
#include "utils/supportfunctions.h"
#include "rigcontrol.h"
#include <QSettings>
#include <QMessageBox>


rigConfig::rigConfig(QWidget *parent) : baseConfig(parent),  ui(new Ui::rigConfig)
{
  ui->setupUi(this);
  connect(ui->enableCATCheckBox,SIGNAL(clicked()),SLOT(slotEnableCAT()));
  connect(ui->enablePTTCheckBox,SIGNAL(clicked()),SLOT(slotEnablePTT()));
  connect(ui->enableXMLRPCCheckBox,SIGNAL(clicked()),SLOT(slotEnableXMLRPC()));
  connect(ui->restartPushButton,SIGNAL(clicked()),SLOT(slotRestart()));
  connect(ui->RTSCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT0()));
  connect(ui->DTRCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT1()));
  connect(ui->nRTSCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT2()));
  connect(ui->nDTRCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT3()));
  rigController=NULL;
  cp=NULL;
}


rigConfig::~rigConfig()
{
  delete ui;
}

void rigConfig::attachRigController(rigControl *rigCtrl)
{
  rigController=rigCtrl;
}

void rigConfig::readSettings()
{
  cp=rigController->params();
  QSettings qSettings;
  qSettings.beginGroup(cp->configLabel);
  cp->serialPort=qSettings.value("serialPort","/dev/ttyS0").toString();
  cp->radioModel=qSettings.value("radioModel","dummy").toString();
  cp->civAddress=qSettings.value("civAddress","").toString();
  cp->baudrate=qSettings.value("baudrate",9600).toInt();
  cp->parity=qSettings.value("parity","None").toString();
  cp->stopbits=qSettings.value("stopbits",1).toInt();
  cp->databits=qSettings.value("databits",8).toInt();
  cp->handshake=qSettings.value("handshake","None").toString();
  cp->enableCAT=qSettings.value("enableCAT",0).toBool();
  cp->enableSerialPTT=qSettings.value("enableSerialPTT",0).toBool();
  cp->pttSerialPort=qSettings.value("pttSerialPort","/dev/ttyS0").toString();
  cp->activeRTS=qSettings.value("activeRTS",1).toBool();
  cp->activeDTR=qSettings.value("activeDTR",0).toBool();
  cp->nactiveRTS=qSettings.value("nactiveRTS",1).toBool();
  cp->nactiveDTR=qSettings.value("nactiveDTR",0).toBool();
  cp->enableXMLRPC=qSettings.value("enableXMLRPC",0).toBool();
  cp->XMLRPCPort=qSettings.value("XMLRPCPort","7362").toInt();
  cp->txOnDelay=qSettings.value("txOnDelay",0.0).toDouble();
  cp->pttType=(ptt_type_t)qSettings.value("pttType",(int)RIG_PTT_RIG).toInt();
  qSettings.endGroup();
  setParams();
}

void rigConfig::writeSettings()
{
  QSettings qSettings;
  getParams();
  qSettings.beginGroup(cp->configLabel);
  qSettings.setValue("serialPort",cp->serialPort);
  qSettings.setValue("radioModel",cp->radioModel);
  qSettings.setValue("civAddress",cp->civAddress);
  qSettings.setValue("baudrate",cp->baudrate);
  qSettings.setValue("parity",cp->parity);
  qSettings.setValue("stopbits",cp->stopbits);
  qSettings.setValue("databits",cp->databits);
  qSettings.setValue("handshake",cp->handshake);
  qSettings.setValue("enableCAT",cp->enableCAT);
  qSettings.setValue("enableSerialPTT",cp->enableSerialPTT);
  qSettings.setValue("pttSerialPort",cp->pttSerialPort);
  qSettings.setValue("activeRTS",cp->activeRTS);
  qSettings.setValue("activeDTR",cp->activeDTR);
  qSettings.setValue("nactiveRTS",cp->nactiveRTS);
  qSettings.setValue("nactiveDTR",cp->nactiveDTR);
  qSettings.setValue("pttType",(int) cp->pttType);
  qSettings.setValue("enableXMLRPC",cp->enableXMLRPC);
  qSettings.setValue("XMLRPCPort",cp->XMLRPCPort);
  qSettings.setValue("txOnDelay",cp->txOnDelay);
  qSettings.endGroup();
}

void rigConfig::getParams()
{
  scatParams *cpCopy=new scatParams;
  *cpCopy=*cp;
  getValue(cp->serialPort,ui->serialPortLineEdit);
  if(ui->radioModelComboBox->count()!=0) getValue(cp->radioModel,ui->radioModelComboBox);
  getValue(cp->civAddress,ui->civAddressLineEdit);
  getValue(cp->baudrate,ui->baudrateComboBox);
  getValue(cp->parity,ui->parityComboBox);
  getValue(cp->stopbits,ui->stopbitsComboBox);
  getValue(cp->databits,ui->databitsComboBox);
  getValue(cp->handshake,ui->handshakeComboBox);
  getValue(cp->enableCAT,ui->enableCATCheckBox);
  getValue(cp->enableSerialPTT,ui->enablePTTCheckBox);
  getValue(cp->pttSerialPort,ui->pttSerialPortLineEdit);
  getValue(cp->activeRTS,ui->RTSCheckBox);
  getValue(cp->activeDTR,ui->DTRCheckBox);
  getValue(cp->nactiveRTS,ui->nRTSCheckBox);
  getValue(cp->nactiveDTR,ui->nDTRCheckBox);
  if(ui->catVoiceRadioButton->isChecked()) cp->pttType=RIG_PTT_RIG;
  if(ui->catDataRadioButton->isChecked()) cp->pttType=RIG_PTT_RIG_MICDATA;
  if(ui->rtsRadioButton->isChecked()) cp->pttType=RIG_PTT_SERIAL_RTS;
  if(ui->dtrRadioButton->isChecked()) cp->pttType=RIG_PTT_SERIAL_DTR;
  getValue(cp->txOnDelay,ui->txOnDelayDoubleSpinBox);
  getValue(cp->enableXMLRPC,ui->enableXMLRPCCheckBox);
  getValue(cp->XMLRPCPort,ui->XMLRPCPortLineEdit);
  changed=false;
  if( cpCopy->serialPort!=cp->serialPort
      || cpCopy->radioModel!=cp->radioModel
      || cpCopy->civAddress!=cp->civAddress
      || cpCopy->baudrate!=cp->baudrate
      || cpCopy->stopbits!=cp->stopbits
      || cpCopy->databits!=cp->databits
      || cpCopy->handshake!=cp->handshake
      || cpCopy->enableCAT!=cp->enableCAT
      || cpCopy->enableSerialPTT!=cp->enableSerialPTT
      || cpCopy->pttSerialPort!=cp->pttSerialPort
      || cpCopy->activeRTS!=cp->activeRTS
      || cpCopy->activeDTR!=cp->activeDTR
      || cpCopy->nactiveRTS!=cp->nactiveRTS
      || cpCopy->nactiveDTR!=cp->nactiveDTR
      || cpCopy->pttType!=cp->pttType
      || cpCopy->enableXMLRPC!=cp->enableXMLRPC
      || cpCopy->XMLRPCPort!=cp->XMLRPCPort
      )
    changed=true;
  delete cpCopy;
}


void rigConfig::setParams()
{
  if(rigController->getRadioList(ui->radioModelComboBox)) setValue(cp->radioModel,ui->radioModelComboBox);
  setValue(cp->serialPort,ui->serialPortLineEdit);
  setValue(cp->civAddress,ui->civAddressLineEdit);
  setValue(cp->baudrate,ui->baudrateComboBox);
  setValue(cp->parity,ui->parityComboBox);
  setValue(cp->stopbits,ui->stopbitsComboBox);
  setValue(cp->databits,ui->databitsComboBox);
  setValue(cp->handshake,ui->handshakeComboBox);
  setValue(cp->enableCAT,ui->enableCATCheckBox);
  setValue(cp->enableSerialPTT,ui->enablePTTCheckBox);
  setValue(cp->pttSerialPort,ui->pttSerialPortLineEdit);
  if(cp->activeRTS) cp->nactiveRTS=false;
  if(cp->activeDTR) cp->nactiveDTR=false;

  setValue(cp->activeRTS,ui->RTSCheckBox);
  setValue(cp->activeDTR,ui->DTRCheckBox);
  setValue(cp->nactiveRTS,ui->nRTSCheckBox);
  setValue(cp->nactiveDTR,ui->nDTRCheckBox);
  switch(cp->pttType)
    {
    case RIG_PTT_RIG:
      setValue(true,ui->catVoiceRadioButton);
    break;
    case RIG_PTT_RIG_MICDATA:
      setValue(true,ui->catDataRadioButton);
    break;
    case RIG_PTT_SERIAL_RTS:
      setValue(true,ui->rtsRadioButton);
    break;
    case RIG_PTT_SERIAL_DTR:
      setValue(true,ui->dtrRadioButton);
    break;
    default:
      setValue(true,ui->catVoiceRadioButton);
    break;
    }
  if(cp->enableCAT && cp->enableSerialPTT)
    {
      if(cp->serialPort==cp->pttSerialPort)
        {
          cp->enableSerialPTT=false;
        }
    }
  setValue(cp->enableSerialPTT,ui->enablePTTCheckBox);
  setValue(cp->txOnDelay,ui->txOnDelayDoubleSpinBox);
  setValue(cp->enableXMLRPC,ui->enableXMLRPCCheckBox);
  setValue(cp->XMLRPCPort,ui->XMLRPCPortLineEdit);
}



void rigConfig::slotEnableCAT()
{
  if(ui->enableCATCheckBox->isChecked() && ui->enablePTTCheckBox->isChecked())
    {
      if(ui->pttSerialPortLineEdit->text()==ui->serialPortLineEdit->text())
        {
          QMessageBox::critical(this,"Configuration error",
                                "The PTT serialport must be different from the CAT serial port if both are enabled");
          ui->enablePTTCheckBox->setChecked(false);
        }

    }
  if(ui->enableCATCheckBox->isChecked())
    {
      ui->enableXMLRPCCheckBox->setChecked(false);
      rigController->init();
    }
  else
    {
      rigController->disable();
    }
  getParams();
}



void rigConfig::slotEnablePTT()
{
  if(ui->enableCATCheckBox->isChecked() && ui->enablePTTCheckBox->isChecked())
    {
      if(ui->pttSerialPortLineEdit->text()==ui->serialPortLineEdit->text())
        {
          QMessageBox::critical(this,"Configuration error",
                                "The PTT serialport must be different from the CAT serial port if both are enabled");
          ui->enablePTTCheckBox->setChecked(false);
          return;
        }

    }
  if(ui->enablePTTCheckBox->isChecked())
    {
      ui->enableXMLRPCCheckBox->setChecked(false);
    }
  getParams();
}

void rigConfig::slotEnableXMLRPC()
{
  ui->enableCATCheckBox->setChecked(false);
  ui->enablePTTCheckBox->setChecked(false);
}

void rigConfig::slotRestart()
{
  getParams();
  if(ui->enableCATCheckBox->isChecked())
    {
      if(rigController->init())
        {
          ui->restartPushButton->setStyleSheet("background-color: green");
        }
      else
        {
          ui->restartPushButton->setStyleSheet("background-color: red");
        }
    }
}


void rigConfig::slotCheckPTT0()
{
  checkPTT(0,ui->RTSCheckBox->isChecked());
}
void rigConfig::slotCheckPTT1()
{checkPTT(1,ui->DTRCheckBox->isChecked());
}
void rigConfig::slotCheckPTT2()
{
  checkPTT(2,ui->nRTSCheckBox->isChecked());
}
void rigConfig::slotCheckPTT3()
{
  checkPTT(3,ui->nDTRCheckBox->isChecked());
}

void rigConfig::checkPTT(int p,bool b)
{
  if(!b) return;
  switch (p)
    {
    case 0:
      setValue(false,ui->nRTSCheckBox);
    break;
    case 1:
      setValue(false,ui->nDTRCheckBox);
    break;
    case 2:
      setValue(false,ui->RTSCheckBox);
    break;
    case 3:
      setValue(false,ui->DTRCheckBox);
    break;
    }
}

