A1210_Desktop/secondwindows.cpp

436 lines
13 KiB
C++
Raw Permalink 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());
ui->comboBoxPlavGround->addItem("ОЗ");
ui->comboBoxPlavGround->addItem("ПЗ");
ui->comboBoxNch->addItem("0.1");
ui->comboBoxNch->addItem("0.3");
ui->comboBoxNch->addItem("1");
ui->comboBoxNch->addItem("3");
ui->comboBoxNch->addItem("10");
ui->comboBoxNch->addItem("30");
ui->comboBoxNch->addItem("100");
ui->comboBoxVch->addItem("0.2");
ui->comboBoxVch->addItem("1");
ui->comboBoxVch->addItem("2");
ui->comboBoxVch->addItem("10");
ui->comboBoxUnitSens->addItem("пКл/м/с2");
ui->comboBoxUnitSens->addItem("пКл/мм/с");
ui->comboBoxUnitSens->addItem("пКл/Па");
ui->comboBoxUnitSens->addItem("пКл/кПа");
ui->comboBoxUnitSens->addItem("пКл/МПа");
ui->comboBoxUnitSens->addItem("пКл/Н");
ui->comboBoxUnitSens->addItem("пКл/кН");
ui->comboBoxUnitSens->addItem("пКл/мВ");
hideInteface();
}
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::hideInteface()
{
ui->label_4->hide();
ui->comboBoxPlavGround->hide();
ui->label_8->hide();
ui->label_11->hide();
ui->label_13->hide();
ui->label_14->hide();
ui->label_16->hide();
ui->labelSens->hide();
ui->labelOverload->hide();
ui->comboBoxKu->hide();
ui->comboBoxNch->hide();
ui->comboBoxVch->hide();
ui->comboBoxUnitSens->hide();
ui->comboBoxPlavGround->hide(); // может со второго раза??
}
void SecondWindows::showInteface()
{
ui->label_4->show();
ui->comboBoxPlavGround->show();
ui->label_8->show();
ui->label_11->show();
ui->label_13->show();
ui->label_14->show();
ui->label_16->show();
ui->labelSens->show();
ui->labelOverload->show();
ui->comboBoxKu->show();
ui->comboBoxVch->show();
ui->comboBoxNch->show();
ui->comboBoxUnitSens->show();
}
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);
showInteface();
isConnected=true;
}
else if(isConnected==true){
modebus->removeFromReqList(adrPri);
//удаляем прибор с данным адресом из списка
//опустошаем форму
ui->labelSens->setText("XXXXX");
//разблокируем элементы
ui->lineEditAddr->setDisabled(false);
ui->comboBoxPort->setDisabled(false);
ui->comboBoxBit->setDisabled(false);
ui->comboBoxSpeed->setDisabled(false);
ui->pushButtonConnect->setText("Подключение");
hideInteface();
ui->comboBoxPlavGround->hide();
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->comboBoxNch->setCurrentIndex(0);
break;
case Lp300:
ui->comboBoxNch->setCurrentIndex(1);
break;
case Lp1000:
ui->comboBoxNch->setCurrentIndex(2);
break;
case Lp3000:
ui->comboBoxNch->setCurrentIndex(3);
break;
case Lp10000:
ui->comboBoxNch->setCurrentIndex(4);
break;
case Lp30000:
ui->comboBoxNch->setCurrentIndex(5);
break;
case Lp100000:
ui->comboBoxNch->setCurrentIndex(6);
break;
default:
// ui->labelNch->setText("#####");
break;
}
switch (state.fv) {
case Hp0_2 :
ui->comboBoxVch->setCurrentIndex(0);
break;
case Hp1:
ui->comboBoxVch->setCurrentIndex(1);
break;
case Hp2:
ui->comboBoxVch->setCurrentIndex(2);
break;
case Hp10:
ui->comboBoxVch->setCurrentIndex(3);
break;
default:
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]);
free(result); /// освободил память
//шляпа для комбобокса
ui->comboBoxKu->clear();
for(int i=0; i<=12; i++){
QString StringForComboBox;
StringForComboBox.append(STRINGS_OUTUNITS[i+OffsetKuDisplay]);
StringForComboBox.append(STRINGS_UNITS[state.unit]);
ui->comboBoxKu->addItem(StringForComboBox);
};
ui->comboBoxKu->setCurrentIndex(state.ku);
switch (state.pz) { //todo тут нужно нормирование
case 0 :
ui->comboBoxPlavGround->setCurrentIndex(0);
break;
case 1:
ui->comboBoxPlavGround->setCurrentIndex(1);
break;
default:
break;
}
switch (state.unit) { //todo тут нужно нормирование
case Accel:
ui->comboBoxUnitSens->setCurrentIndex(0);
// ui->labelUnitKu->setText("xВ/Н"); // Заменил на нормирование с прибора
break;
case Velocity:
ui->comboBoxUnitSens->setCurrentIndex(1);
// ui->labelUnitKu->setText("xВ/Па");
break;
case Pascal:
ui->comboBoxUnitSens->setCurrentIndex(2);
break;
// ui->labelUnitKu->setText("xВс2");
case k_Pascal:
ui->comboBoxUnitSens->setCurrentIndex(3);
break;
case M_Pascal:
ui->comboBoxUnitSens->setCurrentIndex(4);
break;
case Nython:
ui->comboBoxUnitSens->setCurrentIndex(5);
break;
case k_Nuthon:
ui->comboBoxUnitSens->setCurrentIndex(6);
break;
case mV:
ui->comboBoxUnitSens->setCurrentIndex(7);
break;
default:
break;
}
switch (state.overload) {
case Norm :
ui->labelOverload->setText("");
break;
case Overload:
ui->labelOverload->setText("ПЕРЕГРУЗКА");
break;
default:
ui->labelOverload->setText("#####");
break;
}
};
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, SENS_REQ_TYPE);}
}
void SecondWindows::on_comboBoxUnitSens_activated(int index)
{
if(index==0)state.unit=Accel;
if(index==1)state.unit=Velocity; //тут были непонятки, скорее всего сработает без этого
if(index==2)state.unit=Pascal;
if(index==3)state.unit=k_Pascal;
if(index==4)state.unit=M_Pascal; //тут были непонятки, скорее всего сработает без этого
if(index==5)state.unit=Nython;
if(index==6)state.unit=k_Nuthon;
if(index==7)state.unit=mV; //тут были непонятки, скорее всего сработает без этого
modebus->writeDataToPribor(state, STATE_REQ_TYPE);
}
void SecondWindows::on_comboBoxKu_activated(int index)
{
state.ku=typeIKU(index);
modebus->writeDataToPribor(state, STATE_REQ_TYPE);
}
void SecondWindows::on_comboBoxVch_activated(int index)
{
state.fv=typeIFV(index);
modebus->writeDataToPribor(state, STATE_REQ_TYPE);
}
void SecondWindows::on_comboBoxNch_activated(int index)
{
state.fn=typeIFN(index);
modebus->writeDataToPribor(state, STATE_REQ_TYPE);
}
void SecondWindows::on_comboBoxPlavGround_activated(int index)
{
state.pz=typePlavGround(index);
modebus->writeDataToPribor(state, STATE_REQ_TYPE);
}