A1210_Desktop/mainwindow.cpp

474 lines
15 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 "mainwindow.h"
#include "ui_mainwindow.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 "secondwindows.h"
const char *STRINGS_OUTUNITS[] = {"0.0001мВ/",
"0.0002мВ/",
"0.0005мВ/",
"0.001мВ/", //3
"0.002мВ/",
"0.005мВ/",
"0.01мВ/",//6
"0.02мВ/",
"0.05мВ/",
"0.1мВ/",//9
"0.2мВ/",
"0.5мВ/",
"В/",//12
"В/",
"В/",
"10мВ/",//15
"20мВ/",
"50мВ/",
"100мВ/",//18
"200мВ/",
"500мВ/",
"1В/",//21
"2В/",
"5В/",
"10В/",//24
"20В/",
"50В/",
"100В/",//27
"200В/",
"500В/",
"1000В/", //30
};
const char *STRINGS_UNITS[]={"мс2","Па","Н"}; // массив с единицами измерений
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
conf = new QSettings();
ui->setupUi(this);
//Перенос хэндлера в друглй поток- перечтают работать сигналы
// modeBusThread = new QThread(this);
modebus = new ModBusHandler();
// modebus ->moveToThread(modeBusThread);
// modeBusThread->start();
connect(modebus, SIGNAL(dataRecivedNotify(DataStruct)),this, SLOT(dataSetter(DataStruct)));
//по получению данных проверяем адрес раскидываем их по переменным
//и обновляем экран
QWidget::setWindowTitle("А1210");
QWidget::setFixedSize( 314, 372 );
OffsetKuDisplay=0;
isConnected = false;
// Перечислим порты в консоль
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ //для каждого доступного порта
QSerialPort port; //
port.setPort(info); //
if(port.open(QIODevice::ReadWrite)){// если порт доступен
ui->comboBoxPort->addItem(info.portName()); // Добавляем в список доступных
comList.push_back(info.portName());
}
}//конец foreach
//формирую комбобокс для установки скорости
extern const uint32_t BAUDRATE[];
for(uint i = 0; i<10; i++){ui->comboBoxSpeed->addItem(QString::number(BAUDRATE[i]));
}
//формирую данные для комбобокса бита четности
ui->comboBoxBit->addItem("Нет"); // Добавляем в список доступных
ui->comboBoxBit->addItem("Четности"); // Добавляем в список доступных
ui->comboBoxBit->addItem("Нечетности"); // Добавляем в список доступных
// значения для полей из сохраненных значений
ui->comboBoxPort->setCurrentIndex(conf->value("section1/keyCurrentPort").toInt());
ui->comboBoxSpeed->setCurrentIndex(conf->value("section1/keyCurrentSpeed").toInt());
ui->comboBoxBit->setCurrentIndex(conf->value("section1/keyCurrentBit").toInt());
ui->lineEditAddr->setText(conf->value("section1/keyAdress").toString());
//передаем текущие значения полей в глобальные переменные
adrValue=ui->lineEditAddr->text();
bitComboboxIndex=ui->comboBoxBit->currentIndex();
portComboboxIndex=ui->comboBoxPort->currentIndex();
speedComboboxIndex=ui->comboBoxSpeed->currentIndex();
}//конец конструктора главного окна
MainWindow::~MainWindow()
{
qDebug()<<"сработал деструктор первого окна";
//сохранение значения полей
conf->setValue("section1/keyCurrentPort", ui->comboBoxPort->currentIndex());
conf->setValue("section1/keyCurrentSpeed", ui->comboBoxSpeed->currentIndex());
conf->setValue("section1/keyCurrentBit", ui->comboBoxBit->currentIndex());
conf->setValue("section1/keyAdress", ui->lineEditAddr->text());
// modeBusThread->quit();
// modeBusThread->wait(1000);
delete ui;
}
void MainWindow::dataSetter(DataStruct data)
{
if(adrPri==data.adress){
state=data;
refreshDisplay();
}
}
//todo: заблокировать элементы управления без подключения
void MainWindow::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->pushButtonSetPri->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->pushButtonSetPri->setDisabled(false);
ui->comboBoxBit->setDisabled(false);
ui->comboBoxSpeed->setDisabled(false);
ui->pushButtonConnect->setText("Подключение");
isConnected=false;
}
}
void MainWindow::on_pushButtonAddPri_clicked()
{
SecondWindows *w2 = new SecondWindows(this);
w2->show();
}
void MainWindow::on_pushButtonSetPri_clicked()
{
SetPribor *w2 = new SetPribor(this); //передаем в новый обьект указатель на существующий для доступа к нему
w2->exec();
/*
SetPribor setpribor;
setpribor.setModal(true);
setpribor.exec();
*/
}
void MainWindow::getSens(){
// sens=readSens(serial, adrPri);
};
void MainWindow::getState(){
// state = readSet(serial, adrPri);
};
void MainWindow::setState(){
}
void MainWindow::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 MainWindow::on_labelKu_wheelDown()
{ //смотрим на текущее состояние дел
state.ku=typeIKU((uint16_t)state.ku-1);
modebus->writeDataToPribor(state);
//writePalam(serial, adrPri, ku, newVal); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelDown";
}
void MainWindow::on_labelKu_wheelUp()
{
state.ku=typeIKU((uint16_t)state.ku+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelUp";
}
void MainWindow::on_labelVch_wheelDown()
{
state.fv=typeIFV((uint16_t)state.fv-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelUp";
}
void MainWindow::on_labelVch_wheelUp()
{
state.fv=typeIFV((uint16_t)state.fv+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
qDebug()<<"WheelUp";
}
void MainWindow::on_labelNch_wheelDown()
{
state.fn=typeIFN((uint16_t)state.fn-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void MainWindow::on_labelNch_wheelUp()
{
state.fn=typeIFN((uint16_t)state.fn+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void MainWindow::on_labelPlavGround_wheelDown()
{
state.pz=typePlavGround((uint16_t)state.pz-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void MainWindow::on_labelPlavGround_wheelUp()
{
state.pz=typePlavGround((uint16_t)state.pz+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void MainWindow::on_labelUnitSens_wheelDown()
{
state.unit=typeUnit((uint16_t)state.unit-1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void MainWindow::on_labelUnitSens_wheelUp()
{
state.unit=typeUnit((uint16_t)state.unit+1);
modebus->writeDataToPribor(state); // и тут ему говорим - отправь на запись такое то значение КУ
}
void MainWindow::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);}
}
void MainWindow::on_comboBoxPort_currentIndexChanged(int )
{
portComboboxIndex=ui->comboBoxPort->currentIndex();
}
void MainWindow::on_comboBoxSpeed_currentIndexChanged(int )
{
speedComboboxIndex=ui->comboBoxSpeed->currentIndex();
}
void MainWindow::on_comboBoxBit_currentIndexChanged(int )
{
bitComboboxIndex=ui->comboBoxBit->currentIndex();
}
void MainWindow::on_lineEditAddr_textEdited(const QString &)
{
adrValue=ui->lineEditAddr->text();
}