A1210_Desktop/secondwindows.cpp

359 lines
12 KiB
C++
Raw Normal View History

#include "secondwindows.h"
#include "ui_secondwindows.h"
#include "setpribor.h"
#include "enums.h"
#include "QDebug"
#include "comWorks.h"
#include "qvalidator.h"
#include "cstring"
#include "QThread"
#include "QInputDialog"
#include <vector>
#include <QSettings>
#include <modbushandler.h>
extern const char *STRINGS_OUTUNITS[];
extern const char *STRINGS_UNITS[]; // массив с единицами измерений
SecondWindows::SecondWindows(MainWindow *parent) ://конструктор
QMainWindow(parent), //наследует qt класс
ui(new Ui::SecondWindows) //наследует уи
{
ui->setupUi(this);
this->setAttribute(Qt::WA_DeleteOnClose, true); //что бы сработал деструктор при закрытии
modebus =parent->modebus; //забираем модбас папочки
conf = parent->conf;
connect(modebus, SIGNAL(dataRecivedNotify(DataStruct)),this, SLOT(dataSetter(DataStruct)));
//по получению данных проверяем адрес раскидываем их по переменным
//и обновляем экран
QWidget::setWindowTitle("А1210");
QWidget::setFixedSize( 315, 358 );
OffsetKuDisplay=0;
isConnected = false;
extern const uint32_t BAUDRATE[];
for(uint i = 0; i<10; i++){ui->comboBoxSpeed->addItem(QString::number(BAUDRATE[i]));
}
// Возьмем порты у папочки
foreach(const auto com, parent->comList){ //для каждого доступного порта
ui->comboBoxPort->addItem(com); // Добавляем в список доступных
}//
//формирую данные для комбобокса бита четности
ui->comboBoxBit->addItem("Нет"); // Добавляем в список доступных
ui->comboBoxBit->addItem("Четности"); // Добавляем в список доступных
ui->comboBoxBit->addItem("Нечетности"); // Добавляем в список доступных
// значения для полей из сохраненных значений
ui->comboBoxPort->setCurrentIndex(parent->portComboboxIndex);
ui->comboBoxPort->setDisabled(1);
ui->comboBoxSpeed->setCurrentIndex(conf->value("section2/keyCurrentSpeed").toInt());
ui->comboBoxBit->setCurrentIndex(conf->value("section2/keyCurrentBit").toInt());
ui->lineEditAddr->setText(conf->value("section2/keyAdress").toString());
}
SecondWindows::~SecondWindows()
{ qDebug()<<"сработал деструктор второго окна";
conf->setValue("section2/keyCurrentSpeed", ui->comboBoxSpeed->currentIndex());
conf->setValue("section2/keyCurrentBit", ui->comboBoxBit->currentIndex());
conf->setValue("section2/keyAdress", ui->lineEditAddr->text());
modebus->removeFromReqList(adrPri);
delete ui;
}
void SecondWindows::dataSetter(DataStruct data)
{
if(adrPri==data.adress){
state=data;
refreshDisplay();
}
}
//todo: заблокировать элементы управления без подключения
void SecondWindows::on_pushButtonConnect_clicked()
{
adrPri=ui->lineEditAddr->text().toInt(); //todo:добавить валидатор для адреса
if(isConnected==false){
PrborConnectonAtr thisPribor;
thisPribor.port=ui->comboBoxPort->currentText();
thisPribor.adress=ui->lineEditAddr->text().toInt();
thisPribor.speed=(ui->comboBoxSpeed->currentText().toInt());
thisPribor.parity=(Parity)ui->comboBoxBit->currentIndex();
modebus->addToReqList(thisPribor); //добавляем прибор в список опрашиваемых
ui->pushButtonConnect->setText("Отключение");
//блокируем элементы
ui->lineEditAddr->setDisabled(true);
ui->comboBoxPort->setDisabled(true);
ui->comboBoxBit->setDisabled(true);
ui->comboBoxSpeed->setDisabled(true);
isConnected=true;
}
else if(isConnected==true){
modebus->removeFromReqList(adrPri);
//удаляем прибор с данным адресом из списка
//опустошаем форму
ui->labelKu->setText("XXXXX");
ui->labelNch->setText("XX");
ui->labelVch->setText("XX");
ui->labelSens->setText("XXXXX");
ui->labelPlavGround->setText("XX");
ui->labelUnitSens->setText("XXXXXX");
//разблокируем элементы
ui->lineEditAddr->setDisabled(false);
ui->comboBoxPort->setDisabled(false);
ui->comboBoxBit->setDisabled(false);
ui->comboBoxSpeed->setDisabled(false);
ui->pushButtonConnect->setText("Подключение");
isConnected=false;
}
}
void SecondWindows::refreshDisplay(){
//делаем дополнение до 6 знаков
if(state.sens==1000) { ui->labelSens->setText(QString::number(state.sens,'f', 1));}
else if(state.sens<1000&&state.sens>=100) {ui->labelSens->setText(QString::number(state.sens,'f', 2));}
else if(state.sens<100&&state.sens>=10){ui->labelSens->setText(QString::number(state.sens,'f', 3));}
else {ui->labelSens->setText(QString::number(state.sens,'f', 4));}
//с автоподгонкой всё начинает прыгать. Я думаю всё прокатит если её применять поьлко по изменеию содержимого
//ui->labelSens->adjustSize(); //подгоняем размер по содержимому
switch (state.fn) {
case Lp100:
ui->labelNch->setText("0.1");
break;
case Lp300:
ui->labelNch->setText("0.3");
break;
case Lp1000:
ui->labelNch->setText("1");
break;
case Lp3000:
ui->labelNch->setText("3");
break;
case Lp10000:
ui->labelNch->setText("10");
break;
case Lp30000:
ui->labelNch->setText("30");
break;
case Lp100000:
ui->labelNch->setText("100");
break;
default:
ui->labelNch->setText("#####");
break;
}
switch (state.fv) {
case Hp0_2 :
ui->labelVch->setText("0.2");
break;
case Hp1:
ui->labelVch->setText("1");
break;
case Hp2:
ui->labelVch->setText("2");
break;
case Hp10:
ui->labelVch->setText("10");
break;
default:
ui->labelVch->setText("#####");
break;
}
////////////////////////////////////
///// вывод юнитов и нормирование///
////////////////////////////////////
////Аналогично прибору считаем смещение по массиву значений
///
if (state.sens>=0.0001&&state.sens<0.001) {OffsetKuDisplay=0;} // такие значения не допустимы
else if (state.sens>=0.001&&state.sens<0.01){OffsetKuDisplay=0;}
else if (state.sens>=0.01&&state.sens<0.1){OffsetKuDisplay=3; }
else if (state.sens>=0.1&&state.sens<1){OffsetKuDisplay=6;}
else if (state.sens>=1&&state.sens<10){OffsetKuDisplay=9;}
else if (state.sens>=10&&state.sens<100){OffsetKuDisplay=12;}
else if (state.sens>=100&&state.sens<1000){OffsetKuDisplay=15;}
else if (state.sens<=1000){OffsetKuDisplay=18;}
char * result = (char *)malloc(strlen(STRINGS_OUTUNITS[state.ku+OffsetKuDisplay]) + strlen(STRINGS_UNITS[state.unit]) + 1); // +1 for the null-terminator
strcpy(result, STRINGS_OUTUNITS[state.ku+OffsetKuDisplay]);
strcat(result, STRINGS_UNITS[state.unit]);
ui->labelKu->setText(result);
ui->labelKu->adjustSize();
free(result); /// освободил память
switch (state.pz) { //todo тут нужно нормирование
case 0 :
ui->labelPlavGround->setText("ОЗ");
break;
case 1:
ui->labelPlavGround->setText("ПЗ");
break;
default:
ui->labelPlavGround->setText("#####");
break;
}
switch (state.unit) { //todo тут нужно нормирование
case H :
ui->labelUnitSens->setText("пКл/Н");
// ui->labelUnitKu->setText("xВ/Н"); // Заменил на нормирование с прибора
break;
case PA:
ui->labelUnitSens->setText("пКл/Па");
// ui->labelUnitKu->setText("xВ/Па");
break;
case MS2:
ui->labelUnitSens->setText("пКл/мс2");
// ui->labelUnitKu->setText("xВс2");
break;
default:
ui->labelUnitSens->setText("#####");
break;
}
//ui->labelUnitSens->adjustSize();
switch (state.overload) { //todo тут нужно нормирование
case Norm :
ui->labelOverload->setText("");
break;
case Overload:
ui->labelOverload->setText("ПЕРЕГРУЗКА");
break;
default:
ui->labelOverload->setText("#####");
break;
}
};
void SecondWindows::on_labelKu_wheelDown()
{ //смотрим на текущее состояние дел
state.ku=typeIKU((uint16_t)state.ku-1);
modebus->writeDataToPribor(state);
//writePalam(serial, adrPri, ku, newVal); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelDown";
}
void SecondWindows::on_labelKu_wheelUp()
{
state.ku=typeIKU((uint16_t)state.ku+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelUp";
}
void SecondWindows::on_labelVch_wheelDown()
{
state.fv=typeIFV((uint16_t)state.fv-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelUp";
}
void SecondWindows::on_labelVch_wheelUp()
{
state.fv=typeIFV((uint16_t)state.fv+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelUp";
}
void SecondWindows::on_labelNch_wheelDown()
{
state.fn=typeIFN((uint16_t)state.fn-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void SecondWindows::on_labelNch_wheelUp()
{
state.fn=typeIFN((uint16_t)state.fn+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void SecondWindows::on_labelPlavGround_wheelDown()
{
state.pz=typePlavGround((uint16_t)state.pz-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void SecondWindows::on_labelPlavGround_wheelUp()
{
state.pz=typePlavGround((uint16_t)state.pz+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void SecondWindows::on_labelUnitSens_wheelDown()
{
state.unit=typeUnit((uint16_t)state.unit-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void SecondWindows::on_labelUnitSens_wheelUp()
{
state.unit=typeUnit((uint16_t)state.unit+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void SecondWindows::on_labelSens_clicked()
{
bool ok;
state.sens = QInputDialog::getDouble(this, tr("Введите значение"),
tr("Введите значение чувствительности датчика"), state.sens, 0.001, 1000, 4, &ok,
Qt::WindowFlags(), 1);
if (ok){modebus->writeDataToPribor(state);}
}