#include "canidcalc.h"
#include "ui_canidcalc.h"

CanIdCalc::CanIdCalc(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CanIdCalc)
{
    ui->setupUi(this);
    CanId.ID_All = 0;
    CanIdModbus.ID_All = 0;
    ui->StrAdrBox->setValue(0);
    on_DataTypeBox_currentIndexChanged(0);
}

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

void CanIdCalc::on_DataTypeBox_currentIndexChanged(int index)
{
    isModbus = false;
    ui->SensorTypeBox->clear();
    ui->SensorTypeBox->setEnabled(true);
    ui->SensorIdBox->setEnabled(true);
    ui->SensorTypeLabel->show();
    ui->SensorTypeBox->show();
    ui->StrAdrLabel->hide();
    ui->StrAdrBox->hide();
    ui->SensorTypeLabel->setText("Sensor Type");
    ui->SensorIdLabel->setText("Sensor ID");
    ui->SensorIdBox->setMaximum(2047);
    ui->SensorIdBox->setValue(CanId.Fields.SensorID);
    CanId.Fields.DataType = index;
    CanIdModbus.Fields.DataType = index;
    switch (index) {
    case 0:
        ui->SensorTypeBox->addItem("Статус");
        ui->SensorTypeBox->addItem("Запрос на вкл/выкл");
        ui->SensorTypeBox->addItem("Рестарт устройств");
        ui->SensorTypeBox->addItem("Установка времени");
        break;
    case 1:
        ui->SensorTypeBox->addItem("Аварии");
        ui->SensorTypeBox->addItem("Предупреждения");
        ui->SensorTypeBox->addItem("Управляющие сигналы");
        ui->SensorTypeBox->addItem("Флаги");
        ui->SensorTypeBox->addItem("Рестарт устройства");
        ui->SensorTypeBox->addItem("Изменение режима работы устройства");
        ui->SensorTypeBox->addItem("Перечень параметров");
        break;
    case 2:
        ui->SensorTypeBox->addItem("Универсальный запрос");
        ui->SensorTypeBox->addItem("Уставки");
        ui->SensorTypeBox->addItem("Напряжение");
        ui->SensorTypeBox->addItem("Ток");
        ui->SensorTypeBox->addItem("Температура");
        break;
    case 3:
    case 4:
    case 5:
    case 6:
        isModbus = true;
        ui->SensorTypeLabel->hide();
        ui->SensorTypeBox->hide();
        ui->StrAdrLabel->show();
        ui->StrAdrBox->show();
        ui->SensorIdLabel->setText("Кол-во регистров");
        ui->SensorIdBox->setMaximum(255);
        ui->SensorIdBox->setValue(CanIdModbus.Fields.CountReg);
        on_StrAdrBox_valueChanged(ui->StrAdrBox->value());
        break;
    case 7:
        CanId.Fields.DataType = 0xF;
        ui->SensorTypeBox->addItem("Пульс");
        ui->SensorTypeBox->setEnabled(false);
        ui->SensorIdBox->setEnabled(false);
        ui->SensorIdBox->setValue(0);
        break;
    }
    id_Calc();
}

void CanIdCalc::on_SensorTypeBox_currentIndexChanged(int index)
{
    CanId.Fields.SensorType = index;
    id_Calc();
}

void CanIdCalc::on_SensorIdBox_valueChanged(int arg1)
{
    CanId.Fields.SensorID = arg1;
    CanIdModbus.Fields.CountReg = arg1;
    id_Calc();
}

void CanIdCalc::on_DeviceIdBox_valueChanged(int arg1)
{
    CanId.Fields.Device = arg1;
    CanIdModbus.Fields.Device = arg1;
    id_Calc();
}

void CanIdCalc::id_Calc()
{
    if(isModbus)
    {
        ui->ResultLine->setText(QStringLiteral("%1").arg(CanIdModbus.ID_All, 8, 16, QLatin1Char('0')).toUpper());
    }
    else
    {
        ui->ResultLine->setText(QStringLiteral("%1").arg(CanId.ID_All, 8, 16, QLatin1Char('0')).toUpper());
    }
}

void CanIdCalc::on_StrAdrBox_valueChanged(int arg1)
{
    CanIdModbus.Fields.StrAdr = arg1;
    id_Calc();
}

void CanIdCalc::on_routeBox_stateChanged(int arg1)
{
    switch (arg1) {
    case Qt::Unchecked:
        ui->routeBox->setText("Master");
        CanId.Fields.Route = 0;
        CanIdModbus.Fields.Route = 0;
        break;
    case Qt::Checked:
        ui->routeBox->setText("Slave");
        CanId.Fields.Route = 1;
        CanIdModbus.Fields.Route = 1;
        break;
    }
    id_Calc();
}