A1210_Desktop/secondwindows.cpp

359 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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);}
}