#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cmath>
#include <QMessageBox>
#include <QFile>
#include <QFileDialog>
#include <QProcess>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_comboBox_currentIndexChanged(int index)
{
    // nastaveni defaultnich adres
    if (index == 0){ // Router
        if (ui->lineEdit->text()=="0x0000"){
            ui->lineEdit->setText("0x0003");
        }
        if (ui->lineEdit_2->text()=="0x0099"){
            ui->lineEdit_2->setText("0x0039");
        }
        // povoleni nastaveni packet count
        ui->spinBox_4->setEnabled(true);

        // povoleni nastaveni packet interval
        ui->spinBox_6->setEnabled(true);

        // povoleni nastaveni packet size
        ui->spinBox->setEnabled(true);

    }else{  // Coordinator
        if (ui->lineEdit->text()=="0x0003"){
            ui->lineEdit->setText("0x0000");
        }
        if (ui->lineEdit_2->text()=="0x0039"){
            ui->lineEdit_2->setText("0x0099");
        }
        // zamezeni nastaveni packet count
        ui->spinBox_4->setEnabled(false);

        // zamezeni nastaveni packet interval
        ui->spinBox_6->setEnabled(false);

        // zamezeni nastaveni packet size
        ui->spinBox->setEnabled(false);
    }
}

/*
metoda, ktera podle zadaneho adresare provede vytvoreni hlavickovych
souboru parameters.h, provede prikaz make a odesle vytvoreni blank.hex pres COM port
*/
int MainWindow::odeslat(int set){

    // vycisteni okna pro vypisy
    ui->plainTextEdit->clear();

    QFileDialog files(this,tr("Project directory"),".",tr(""));
    // definice dialogoveho okna
    if (set==0) // set==0 -> stisknuto tlacitko START ; set==1 -> stisknuto tlacitko STOP -> vypisy se nezobrazujou
        mPath=files.getExistingDirectory(this,tr("Project director"),".");
    // spusteni dialogoveho okna a ziskani slozky kam ulozit soubor .h
    if(mPath=="")
    {   // v pripade kliknuti na STORNO v dialogovem okne pro vyber adresare se neprovede nic
        return 1;
    }
    QFile soubor(mPath+"/parameters.h");
    // vytvoreni souboru parameters.h
    if (set==0)
        ui->plainTextEdit->insertPlainText(mPath+"/parameters.h\n");
    // kontrolni vypis do textoveho pole
    QByteArray pom;
    soubor.remove();
    // smazani pripadneho predchoziho souboru

    soubor.open(QIODevice::WriteOnly);
    // otevreni + vytvoreni souboru

    // zapis do souboru
    //soubor.write("#ifndef _CONFIGURATION_H_\n#define _CONFIGURATION_H_\n#include <BoardConfig.h>\n");

    // zapis definic do souboru parameters.h
    soubor.write("#define CS_DEVICE_TYPE ");
    if (ui->comboBox->currentIndex()==0){
        soubor.write("DEVICE_TYPE_ROUTER\n");
    }else{
        soubor.write("DEVICE_TYPE_COORDINATOR\n");
    }

    soubor.write("#define CS_NWK_ADDR ");
    soubor.write(pom.append(ui->lineEdit->text()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define CS_UID ");
    soubor.write(pom.append(ui->lineEdit_2->text()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define CS_CHANNEL_MASK 0x");
    QString hex;
    uint cis = pow(2,ui->comboBox_2->currentIndex()+1);
    soubor.write(pom.append(hex.setNum(cis,16)));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define CS_RF_TX_POWER ");
    soubor.write(pom.append(ui->comboBox_3->currentText()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define CS_EXT_PANID ");
    soubor.write(pom.append(ui->lineEdit_3->text()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define APS_PAYLOAD ");
    soubor.write(QByteArray().setNum(ui->spinBox->value()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define USART_TX_BUFFER_SIZE ");
    soubor.write(QByteArray().setNum(ui->spinBox_2->value()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define APP_USART_CHANNEL USART_CHANNEL_");
    soubor.write(QByteArray().setNum(ui->spinBox_3->value()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define APP_USART_BAUDRATE USART_BAUDRATE_");
    soubor.write(pom.append(ui->comboBox_4->currentText()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define APP_USART_DATA USART_DATA");
    soubor.write(pom.append(ui->comboBox_5->currentText()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define APP_USART_STOPBIT USART_STOPBIT_");
    soubor.write(pom.append(ui->comboBox_8->currentText()));
    pom.clear();
    soubor.write("\n");

    soubor.write("#define APP_USART_PARITY USART_PARITY_");
    if (ui->comboBox_6->currentIndex()==0){
        soubor.write("NONE\n");
    }else if (ui->comboBox_6->currentIndex()==1){
        soubor.write("ODD\n");
    }else if (ui->comboBox_6->currentIndex()==2){
        soubor.write("EVEN\n");
    }else{
        soubor.write("MARK\n");
    }

    soubor.write("#define PACKET_COUNT ");
    if (set==0) // pokud je stisknuto START -> nastavi packe count na hodnotu nastavenou
        soubor.write(QByteArray().setNum(ui->spinBox_4->value()));
    else // pokud je stiknuto STOP -> packet count nastaven na 0
        soubor.write("0");
    pom.clear();
    soubor.write("\n");

    soubor.write("#define PACKET_INTERVAL ");
    soubor.write(QByteArray().setNum(ui->spinBox_6->value()));
    pom.clear();
    soubor.write("\n");

    soubor.flush();
    soubor.close();

    if (set==0)
        ui->plainTextEdit->insertPlainText("Header files created\n");

    if (set==0)
        ui->plainTextEdit->insertPlainText("Start making files...\n");

    // prikaz "make -C %1 clean" se spusti v terminalu
    mProc.start(QString("make -C %1 clean").arg(mPath));
    mProc.waitForFinished();
    mProc.start(QString("make -C %1").arg(mPath)); // vytvoreni Blank.hex
    mProc.waitForFinished();

    QByteArray errorStd=mProc.readAllStandardError();

    // v pripade, ze doslo pri kompilaci k chybe se vypise chybovy vystup
    if (mProc.exitCode()!=0){
        if (set==0)
            ui->plainTextEdit->insertPlainText(errorStd);
        return 1;
    }
    if (set==0)
        ui->plainTextEdit->insertPlainText("Making complete\n");

    QFile soubor2("./Blank.hex");
    if(soubor2.exists()) soubor2.remove();
    soubor2.setFileName(mPath+"/Blank.hex");
    if(!soubor2.exists())
    {
        if (set==0){
            QMessageBox::critical(this, tr("File"), tr("Hex file does not exist!!!"));
            ui->plainTextEdit->insertPlainText("Hex file does not exist!!!\n");
        }
        return 1;
    }
    soubor2.copy("./Blank.hex");
    if (set==0)
        ui->plainTextEdit->insertPlainText("Start sending files...\n");

    // odesilani souboru Blank.hex pres COM port
    mProc.start(QString("avrdude -c mib510 -p m1281 -P %1 -U flash:w:Blank.hex").arg(ui->comboBox_7->currentText()));
    if (set==0)
        ui->plainTextEdit->insertPlainText(errorStd);
    mProc.waitForFinished(100000);
    if (set==0)
        ui->plainTextEdit->insertPlainText("Finished\n");
    return 0;
}



void MainWindow::on_pushButton_clicked() // tlacitko START
{
    if (odeslat(0)==0) ui->pushButton_2->setEnabled(true);
}

void MainWindow::on_pushButton_2_clicked() // tlacitko STOP
{
    ui->pushButton_2->setEnabled(false);
    if (odeslat(1)==0) ui->plainTextEdit->insertPlainText("Stopped\n");
}
