#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTimer>#include <QTime>#include "dialog_settings.h"#include "grafick.h"#include "qcustomplot.h"#include "sitting.h"namespace Ui{class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: packet_big packet_one= {254, 232, 0, 0, 0, 0, 0, 0, 0}; explicit MainWindow(QWidget *parent = 0); ~MainWindow();signals: void on_off(int baudrate); void off();//включение таймера и всего по нажатию пуск void on();//отключение таймера и всего по нажатию пуск void sendArray(QByteArray data);//отправка данных void pomp_on(packet_big packet_one);//Сигнал о включении клапана void pomp_off(packet_big packet_one);//Сигнал о выключении клапана void sig_start_timer_if_temp();//Сигнал о старте тааймера после достижения определенной температуры и нажатия кнопки void signalInsertGraph(double dItem);//Если кнопка нажата испускаем сигнал с температурой для отрисовки графика void signalEndTimerTimeout(unsigned char temp_pomp_sig);//отпрвка в окно с графиком температуры охлаждения void signalEndReactiom();//Если температура упала до выставленного значения, закончить void signalSendTempAndTime(int temp,int time);//отпрвка в окно с графиком температуры реакции и времени реакцииpublic slots: void nasos_on();//включить насос void nasos_of();//выключить насос void settings_menu();//окно настроек Com порта void sitting_menu_iter();//окно настроек автоматизации void disp_lcd_time();//отображение таймера void disp_lcd_temp();//отображение температуры void vizvat_taimer();//Запуск таймера void disp_lcd_temp_timer();//Мигание таймера раз в сек. void save_str(QByteArray data);//Прием и сохранения данных с Com порта void put_in_array(packet_big data);//отправка на com порт void end_timer();//Выключение таймера возможно обтеденить с taimer_stop void lov_temp();//выключение нагревание после срабатывания таймера void renderWindowschedule();//отображение окна с графиком void VizovSignalEndTimerTimeout();//испускаем сигнал void sendSignalTempAndTime();//испускаем сигнал void main_slot_step_cooling(double step);//Сохраняем настройки значений void main_slot_threshold_cooling(double threshold);//Сохраняем настройки значений void clear_graf();//очистка окна с графикомprivate slots: void slot_Button_clicked();//нажатие кнопки void taimer_stop();private: Ui::MainWindow *ui; QTimer * timer; //Адресная переменная таймера QTimer * updater; Dialog_Settings *info; Grafick *graf; Sitting *sitting_iter; int num_time=0;//переменная выставленного времени int num_temp=0;//переменная выставленной температуры int num_tmp_temp=0;//флаг для вызова таймера один раз bool flag_but_on=0;//Флаг нажатой кнопки bool flag_end_reaktion=false;//флаг конца реакции double double_displey=0;//значение текущей температуры собраное из двух байт double step_cooling=0.5;//Значение шага старта таймера double threshold_cooling=32;//Порог остановки охлаждения QPixmap myPixmap_on; QPixmap myPixmap_of; QPixmap myPixmap_red; bool bViewGraph;};#endif // MAINWINDOW_H
#include "mainwindow.h"#include "ui_mainwindow.h"#include "dialog_settings.h"#include "packet.h"#include "grafick.h"#include "qcustomplot.h"#include "sitting.h"#include <QPixmap>#include <QMessageBox>#include <QString>#include <QDesktopWidget>#include <QScreen>#include <QMetaEnum>#include <QPalette>#include <errno.h>#include <qdebug.h>//bool flag_end_reaktion=true;MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); myPixmap_on=QPixmap("C:/if_Circle_Green_34211.png"); myPixmap_of=QPixmap("C:/if_Circle_Grey_34212.png"); myPixmap_red=QPixmap("C:/if_Circle_Red_34214.png"); info = new Dialog_Settings(this); //Создаем окно с настройками Com порта, info->setVisible(false); //но не отображаем. graf = new Grafick(this); //Создаем окно с настройками Com порта, graf ->setVisible(false); // sitting_iter = new Sitting(this); //Создаем окно с настройками Com порта, sitting_iter->setVisible(false); //но не отображаем. ui->lcdNumber_3->display("00:00"); ui->lcdNumber_4->display("00:00"); ui->label_4->setPixmap(myPixmap_red); ui->label_3->setPixmap(myPixmap_of); ui->spinBox->setMaximum(250); ui->spinBox_2->setMaximum(500); //Таймер updater = new QTimer(this); connect(updater,SIGNAL(timeout()), this, SLOT(disp_lcd_temp_timer())); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), timer, SLOT(stop())); connect(timer, SIGNAL(timeout()), this, SLOT(nasos_on())); connect(timer, SIGNAL(timeout()), updater, SLOT(stop())); connect(timer, SIGNAL(timeout()), this, SLOT(end_timer())); connect(timer, SIGNAL(timeout()), this, SLOT(lov_temp())); connect(timer, SIGNAL(timeout()), this, SLOT(VizovSignalEndTimerTimeout())); //к сигналу timer timeout(), подсоеденить сигнал, который будет передавать температуру охлаждения, а в графике записывать в значение endReactiontime connect(ui->action_Com,SIGNAL(triggered(bool)),this,SLOT(settings_menu())); connect(ui->action_3,SIGNAL(triggered(bool)),this,SLOT(close())); connect(ui->action,SIGNAL(triggered(bool)),this,SLOT(renderWindowschedule())); connect(ui->action_5,SIGNAL(triggered(bool)),this,SLOT(sitting_menu_iter())); connect(this,SIGNAL(on()),this,SLOT(renderWindowschedule())); connect(this,SIGNAL(on()),this,SLOT(clear_graf())); connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(nasos_on())); connect(ui->pushButton_4,SIGNAL(clicked()),this,SLOT(nasos_of())); connect(ui->pushButton_5,SIGNAL(clicked()),this,SLOT(slot_Button_clicked())); connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(disp_lcd_time())); connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(disp_lcd_temp())); connect(this,SIGNAL(sig_start_timer_if_temp()),this,SLOT(vizvat_taimer())); connect(this,SIGNAL(sig_start_timer_if_temp()),graf,SLOT(startReaction_funkc())); connect(this, SIGNAL(signalEndTimerTimeout(unsigned char)), graf, SLOT(readTempPomp(unsigned char))); connect(this, SIGNAL(signalSendTempAndTime(int,int)), graf, SLOT(readCurrentTenpAndTime(int ,int ))); connect(this, SIGNAL(signalEndReactiom()), graf, SLOT(endReactiom())); connect(this,SIGNAL(off()),this,SLOT(taimer_stop())); connect(this,SIGNAL(on()),this,SLOT(sendSignalTempAndTime())); connect(this,SIGNAL(pomp_off(packet_big)),this,SLOT(put_in_array(packet_big))); connect(this,SIGNAL(pomp_on(packet_big)),this,SLOT(put_in_array(packet_big))); connect(info, SIGNAL(duble_send_signal(QByteArray)), this, SLOT(save_str(QByteArray))); connect(this,SIGNAL(sendArray(QByteArray)),info,SIGNAL(writeData(QByteArray))); connect(this, SIGNAL(signalInsertGraph(double)), graf, SLOT(insertItem(double))); connect(sitting_iter,SIGNAL(emit_step_cooling(double)),this,SLOT(main_slot_step_cooling(double))); connect(sitting_iter,SIGNAL(emit_threshold_cooling(double)),this,SLOT(main_slot_threshold_cooling(double))); bViewGraph=false;}MainWindow::~MainWindow(){ delete ui; qDebug("del");}void MainWindow::nasos_on()//включить насос{ ui->label_3->setPixmap(myPixmap_on); ui->label_4->setPixmap(myPixmap_of); packet_one.on_of_pomp=1; packet_one.pask(); emit pomp_on(packet_one); qDebug("idx1");}void MainWindow::nasos_of()//выключить насос{ ui->label_4->setPixmap(myPixmap_red); ui->label_3->setPixmap(myPixmap_of); packet_one.on_of_pomp=0; packet_one.pask(); emit pomp_off(packet_one); qDebug("idx2");}void MainWindow::settings_menu()//окно настроек Com порта{ info->setVisible(true);}void MainWindow::disp_lcd_time()//отображение таймера{ num_time=ui->spinBox_2->value(); ui->lcdNumber_4->display(QTime::fromMSecsSinceStartOfDay(num_time*60000).toString("hh:mm")); packet_one.timer_ex=num_time; packet_one.pask(); emit pomp_off(packet_one);}void MainWindow::disp_lcd_temp()//отображение температуры{ num_temp=ui->spinBox->value(); ui->lcdNumber->display(num_temp); packet_one.current_temp_reactor=num_temp; packet_one.pask(); emit pomp_off(packet_one);}void MainWindow::vizvat_taimer()//Запуск таймера{ qDebug("TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimer"); updater->setSingleShot(false); timer->setSingleShot(true); updater->start(1000); timer->start(num_time*60000);}void MainWindow::disp_lcd_temp_timer()//Мигание таймера раз в сек.{ QString text = QTime::fromMSecsSinceStartOfDay(timer->interval() - timer->remainingTime()).toString("hh:mm"); if (((((timer->interval() - timer->remainingTime())/1000)) % 2) != 0) text[2] = ' '; ui->lcdNumber_3->display(text);}void MainWindow::slot_Button_clicked(){ if(flag_but_on==0) { flag_but_on=1; qDebug("flag_but_on_1"); ui->pushButton_5->setText("СТОП"); bViewGraph=true; emit on(); } else if(flag_but_on==1) { flag_but_on=0; qDebug("flag_but_off_2"); ui->pushButton_5->setText("ПУСК"); ui->lcdNumber_3->display("00:00"); QPalette Pal = ui->lcdNumber_3->palette(); Pal.setColor(QPalette::Normal, QPalette::WindowText, Qt::black); Pal.setColor(QPalette::Normal, QPalette::Window, Qt::black); ui->lcdNumber_3->setPalette(Pal); num_tmp_temp=0; bViewGraph=false; emit off(); }}void MainWindow::taimer_stop()//остановка таймера{ qDebug("stopstopstopstopstopstopstopstopstop"); //if(updater) updater->stop(); // if(timer) timer->stop();}void MainWindow::save_str(QByteArray data){//Прием и сохранения данных с Com порта packet_big tmp; memcpy((void*)&tmp, (void*)data.data(), sizeof(packet_big));//тут только почему void? У меня проблемы с пониманием приведения типа к void if(!tmp.test_pask()){ packet_one=tmp; qDebug()<<" ONE byte: "<<packet_one.start_byte_one<<"\n" <<"TWO byte: " << packet_one.start_byte_two <<"\n" <<"TEMP byte: "<< packet_one.temp_pomp<<"\n" <<"ON-OF byte: "<<packet_one.on_of_pomp<<"\n" <<"packet_one.ex_temp_reactor_one: "<<packet_one.ex_temp_reactor_one<<"\n" <<"packet_one.ex_temp_reactor_two: "<<packet_one.ex_temp_reactor_two<<"\n" <<"CRC8 byte: "<<packet_one.CRC8<<"\n" <<"Temp_curent: "<<packet_one.current_temp_reactor<<"\n" <<"num_temp " <<num_temp<<"\n" <<"Timer: "<<packet_one.timer_ex; } unsigned short mass_byte = ((unsigned short)packet_one.ex_temp_reactor_two << 8) | packet_one.ex_temp_reactor_one; if(((double)mass_byte )/10>=double_displey-5&&((double)mass_byte)/10<=double_displey+5||double_displey==0){ double_displey=( (double)mass_byte )/10; } ui->lcdNumber_5->display(packet_one.temp_pomp); ui->lcdNumber_2->display(double_displey); if(bViewGraph){//сигнал с температурой если нажата кнопка emit signalInsertGraph(double_displey); } if(packet_one.on_of_pomp==0){ ui->label_4->setPixmap(myPixmap_red); ui->label_3->setPixmap(myPixmap_of); } else if(packet_one.on_of_pomp==1){ ui->label_3->setPixmap(myPixmap_on); ui->label_4->setPixmap(myPixmap_of); } if(flag_but_on==1 && (double_displey >= ((double)num_temp - step_cooling) && double_displey <= ((double)num_temp + (step_cooling + 0,5))) && num_tmp_temp == 0){ //костыль на отсечение битых данных, проверят нажатали кнопка, запущен ли был таймер один раз, и проходит //температура к формуле : выставленная температура -step_cooling и выставленная температура +(step_cooling+1) qDebug()<<"START TIMER **********************************************"; qDebug()<<"double_displey - "<<double_displey; qDebug()<<"step_cooling - "<<step_cooling; qDebug()<<"num_tmp_temp - "<<num_tmp_temp; qDebug("TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimer\n"); qDebug()<<"flag_but_on==1 " <<flag_but_on; qDebug()<<"((double)double_displey>=((double)packet_one.current_temp_reactor-step_cooling) " <<(double_displey>=((double)packet_one.current_temp_reactor-step_cooling)); qDebug()<<"flag_but_on==1 " <<(double_displey<=((double)packet_one.current_temp_reactor+step_cooling)); qDebug()<<"num_tmp_temp " <<num_tmp_temp; qDebug()<<"num_temp " <<num_temp; qDebug()<<"**************************************************"; num_tmp_temp=1; emit sig_start_timer_if_temp(); } else{ qDebug()<<"NOT START TIMER ---------------------------------"; qDebug()<<"double_displey - "<<double_displey; qDebug()<<"step_cooling - "<<step_cooling; qDebug()<<"num_tmp_temp - "<<num_tmp_temp; qDebug()<<"num_temp " <<num_temp; qDebug()<<"------------------------------------------------"; } if(double_displey<threshold_cooling&&flag_end_reaktion==true){//если меньше значения, то испускаем сигнал об конце рекции qDebug()<<"555555555555555555555555555"; flag_end_reaktion=false; emit signalEndReactiom(); }}void MainWindow::put_in_array(packet_big data)//отправка на com порт{ QByteArray tmp; unsigned char* masstmp = (unsigned char* )&data; qDebug()<<" QQQQQQQQQQQQQQQQQQQQQ 333 "<<packet_one.on_of_pomp; for(unsigned int i=0; i<sizeof(data); i++) { tmp[i]=masstmp[i]; } emit sendArray(tmp);}void MainWindow::end_timer(){//Выключение таймера возможно обтеденить с taimer_stop ui->lcdNumber_3->display(QTime::fromMSecsSinceStartOfDay(num_time*60000).toString("hh:mm")); QPalette Pal = ui->lcdNumber_3->palette(); Pal.setColor(QPalette::Normal, QPalette::WindowText, Qt::red); Pal.setColor(QPalette::Normal, QPalette::Window, Qt::black); ui->lcdNumber_3->setPalette(Pal);}void MainWindow::lov_temp(){//выключение нагревание после срабатывания таймера num_temp=13; ui->lcdNumber->display(num_temp); packet_one.current_temp_reactor=num_temp; packet_one.pask(); flag_end_reaktion=true; qDebug()<<"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"<<flag_end_reaktion; emit pomp_off(packet_one);}void MainWindow::renderWindowschedule(){//Создаем окно с настройками Com порта, graf ->setVisible(true);//}void MainWindow::sitting_menu_iter(){//окно настроек автоматизации sitting_iter ->setVisible(true);//}void MainWindow::VizovSignalEndTimerTimeout(){//испускаем сигнал emit signalEndTimerTimeout(packet_one.temp_pomp);}void MainWindow::sendSignalTempAndTime(){//испускаем сигнал emit signalSendTempAndTime(num_temp,num_time);}void MainWindow::main_slot_step_cooling(double step){//Сохраняем настройки значений step_cooling=step;}void MainWindow::main_slot_threshold_cooling(double threshold){//Сохраняем настройки значений threshold_cooling=threshold;}void MainWindow::clear_graf(){//очистка окна с графиком qDebug()<<"-----------------------------------DESTROI----------------"; delete graf; graf = new Grafick(this); //Создаем окно с настройками Com порта, graf ->setVisible(true); //}
void MainWindow::renderWindowschedule(){//Создаем окно с настройками Com порта, graf ->setVisible(true);//}
void MainWindow::clear_graf(){//очистка окна с графиком qDebug()<<"-----------------------------------DESTROI----------------"; delete graf; graf = new Grafick(this); //Создаем окно с настройками Com порта, graf ->setVisible(true); //}