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