123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739 |
- #include "dialog.h"
- #include "ui_dialog.h"
- #include <QTimer> //定时器类
- #include <windows.h>
- #include<iostream>
- #include<qcursor.h>
- #include "infoserialize/infoserialize.h"
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QJsonValue>
- Dialog::Dialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::Dialog)
- {
- // setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); // 去除边框和标题栏
- // 设置对话框属性
- // setWindowFlags(Qt::Dialog | Qt::WindowMinimizeButtonHint);
- QPushButton *minimizeButton = new QPushButton("隐藏", this);
- connect(minimizeButton, &QPushButton::clicked, this, &Dialog::on_minimizeButton_clicked);
- ui->setupUi(this);
- serailPort = new SerailPort();
- // serailPort->setUi(ui->RecvLineEdit);
- //
- // MyThread* mythread = new MyThread();
- // mythread->moveToThread(mythread);
- // mythread->start(); //调用子线程
- //从配置文件中恢复上次打开时的配置数据
- infoserialize myinfoserialize;
- QFile file("D:/irdet/cfg/prjpara.cfg");//.cfg文件为二进制文件
- if(!file.open(QIODevice::ReadOnly))
- {
- return ;
- }
- QDataStream output(&file);
- output >> myinfoserialize;
- file.close();
- QString qstrip = ui->IPLineEdit->text();
- QString qstraccount = ui->AcccountLineEdit->text();
- QString qstrpwd = ui->PwdLineEdit->text();
- ui->IPLineEdit->setText(myinfoserialize.qstrip);
- ui->AcccountLineEdit->setText(myinfoserialize.qstraccount);
- ui->PwdLineEdit->setText(myinfoserialize.qstrpwd);
- ui->SavePicDirLineEdit->setText(myinfoserialize.qstrdir);
- QStringList srtlistPorts = serailPort->getAllPorts();
- ui->PortcomboBox->addItems(srtlistPorts);
- QStringList srtlistBautRate = serailPort->getAllBautRate();
- ui->BautRatecomboBox->addItems(srtlistBautRate);
- //ui->BautRatecomboBox->setCurrentText("9600");
- ui->BautRatecomboBox->setCurrentText(myinfoserialize.srtBautRate);
- QStringList srtlistDataBit = serailPort->getAllDataBit();
- ui->DataBitcomboBox->addItems(srtlistDataBit);
- //ui->DataBitcomboBox->setCurrentText("8");
- ui->DataBitcomboBox->setCurrentText(myinfoserialize.srtDataBit);
- QStringList srtlistParityRate = serailPort->getAllParityRate();
- ui->ParityRatecomboBox->addItems(srtlistParityRate);
- ui->ParityRatecomboBox->setCurrentText(myinfoserialize.srtParity);
- QStringList srtlistStopRate = serailPort->getAllStopRate();
- ui->StopRatecomboBox->addItems(srtlistStopRate);
- ui->ParityRatecomboBox->setCurrentText(myinfoserialize.srtStop);
- ui->SendLineEdit->setText("SET@1=4000 #");
- ui->RecvLineEdit_2->setText("25000");
- ui->RecvLineEdit_3->setText("5000");
- ui->RecvLineEdit_4->setText("1000");
- connect(serailPort->serial, &QSerialPort::readyRead, serailPort, &SerailPort::readyRead);
- irdetnetproc();
- // //创建套接字对象
- // m_server = new QTcpServer(this);
- // //将套接字设置为监听模式
- // m_server->listen(QHostAddress::Any, 8018);
- // //通过信号接收客户端请求
- // connect(m_server, &QTcpServer::newConnection,
- // this, &Dialog::slotNewConnection);
- }
- void Dialog:: irdetnetproc()
- {
- //1.创建server对象
- QTcpServer* server=new QTcpServer(this);
- //2.设置服务器监听listen(ipAddr,port),这里跟红外检测算法服务通讯
- bool res=server->listen(QHostAddress::Any,8018);//返回监听成功与否,可能存在端口占用情况
- qDebug() << "this is listen ret:" << res;
- //3.基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
- connect(server,&QTcpServer::newConnection,[=]()
- {
- ptcpSocket=server->nextPendingConnection();//接收新的客户端连接,用于实际的收发处理
- qDebug() << "this is listen tcpSocket:" << ptcpSocket;
- //4.收发处理,
- //4.1 当收到数据请求时,tcpSocket会发射readyread信号
- connect(ptcpSocket,&QTcpSocket::readyRead,[=]()
- {
- //收到信息请求
- QByteArray data = ptcpSocket->readAll();
- qDebug()<<"Datas from the remote client:"<<data;
- //透传红外算法检测结果数据
- if(nullptr != ptcpSocket1)
- {
- ptcpSocket1->write(data);
- ptcpSocket1->flush(); // 确保数据被发送出去
- }
- });
- // //4.2 写数据
- // QByteArray sWriteMsg="Hello Client, i is irdet";
- // ptcpSocket->write(sWriteMsg);
- });
- QTcpServer* server1=new QTcpServer(this);
- //2.设置服务器监听listen(ipAddr,port),这里跟上位机通讯
- bool res1=server1->listen(QHostAddress::Any,9032);//返回监听成功与否,可能存在端口占用情况
- qDebug() << "this is listen ret:" << res;
- //3.基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
- connect(server1,&QTcpServer::newConnection,[=]()
- {
- ptcpSocket1=server1->nextPendingConnection();//接收新的客户端连接,用于实际的收发处理
- qDebug() << "this is listen tcpSocket:" << ptcpSocket1;
- //4.收发处理,
- //4.1 当收到数据请求时,tcpSocket会发射readyread信号
- connect(ptcpSocket1,&QTcpSocket::readyRead,[=]()
- {
- //收到信息请求
- QByteArray data = ptcpSocket1->readAll();
- qDebug()<<"Datas from the remote client:"<<data;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(data);
- if (!jsonDoc.isNull()) {
- QJsonObject jsonObj = jsonDoc.object();
- QString interfaceType = jsonObj.value("interface").toString();
- if (interfaceType == "GrabPicture") {
- //解析出position
- QJsonObject paramObj = jsonObj.value("param").toObject();
- strposition = paramObj.value("position").toString();
- on_SendCmdButton_clicked();// 调用函数
- } else {
- qDebug() << "Unhandled interface type:" << interfaceType;
- }
- } else {
- qDebug() << "Received invalid JSON data";
- }
- });
- // //4.2 写数据
- // QByteArray sWriteMsg="Hello Client, i is irdet";
- // ptcpSocket->write(sWriteMsg);
- });
- }
- Dialog::~Dialog()
- {
- delete ui;
- }
- void Dialog::closeEvent ( QCloseEvent* e )
- {
- if( QMessageBox::question(this,
- tr("Quit"),
- tr("Are you sure to quit this application?"),
- QMessageBox::Yes, QMessageBox::No )
- == QMessageBox::Yes){
- e->accept();//不会将事件传递给组件的父组件
- if(nullptr != phkcamera)
- {
- phkcamera->logout();
- delete phkcamera;
- }
- //保存本次配置
- //QString strPortName = ui->PortcomboBox->currentText();
- QString srtBautRate = ui->BautRatecomboBox->currentText();
- QString srtDataBit = ui->DataBitcomboBox->currentText();
- QString srtParity = ui->ParityRatecomboBox->currentText();
- QString srtStop = ui->StopRatecomboBox->currentText();
- QString qstrip = ui->IPLineEdit->text();
- QString qstraccount = ui->AcccountLineEdit->text();
- QString qstrpwd = ui->PwdLineEdit->text();
- QString qstrdir = ui->SavePicDirLineEdit->text();
- infoserialize myinfoserialize;
- myinfoserialize.qstrip = qstrip;
- myinfoserialize.qstraccount = qstraccount;
- myinfoserialize.qstrpwd = qstrpwd;
- myinfoserialize.qstrdir = qstrdir;
- myinfoserialize.srtBautRate = srtBautRate;
- myinfoserialize.srtDataBit = srtDataBit;
- myinfoserialize.srtParity = srtParity;
- myinfoserialize.srtStop = srtStop;
- QFile file("./prjpara.cfg");
- if(!file.open(QIODevice::WriteOnly))
- {
- return ;
- }
- QDataStream input(&file);
- input << myinfoserialize;
- file.close();
- qDebug()<<"ok";
- }
- else
- e->ignore();
- }
- //void Dialog::on_pushButton_clicked()
- //{
- //}
- /*************************************
- 打开串口
- *************************************/
- void Dialog::on_OpenPortButton_clicked()
- {
- bool bPortStatus = serailPort->getPorStatus();
- //如果当前串口是打开状态则关闭
- if(bPortStatus)
- {
- serailPort->serial->close();
- serailPort->setPorStatus(false);
- //关闭串口成功后,使能参数选择框
- ui->PortcomboBox->setEnabled(true);
- ui->BautRatecomboBox->setEnabled(true);
- ui->DataBitcomboBox->setEnabled(true);
- ui->ParityRatecomboBox->setEnabled(true);
- ui->StopRatecomboBox->setEnabled(true);
- ui->OpenPortButton->setText("打开串口");
- return;
- }
- //设置串口名字
- QString strPortName = ui->PortcomboBox->currentText();
- serailPort->serial->setPortName(strPortName);
- //设置波特率
- QString srtBautRate = ui->BautRatecomboBox->currentText();
- int iBautRate = srtBautRate.toInt();
- serailPort->serial->setBaudRate(iBautRate);
- //设置数据位
- QString srtDataBit = ui->DataBitcomboBox->currentText();
- int iDataBit = srtDataBit.toInt();
- switch (iDataBit)
- {
- case 5:
- serailPort->serial->setDataBits(QSerialPort::Data5);
- break;
- case 6:
- serailPort->serial->setDataBits(QSerialPort::Data6);
- break;
- case 7:
- serailPort->serial->setDataBits(QSerialPort::Data7);
- break;
- case 8:
- serailPort->serial->setDataBits(QSerialPort::Data8);
- break;
- default:
- break;
- }
- //设置校验位
- QString srtParity = ui->ParityRatecomboBox->currentText();
- int iParityBitInx = ui->ParityRatecomboBox->currentIndex();
- //int iParityBit = srtParity.toInt();
- //"None", "Even", "Odd", "Mark", "Space"
- switch (iParityBitInx)
- {
- case 0://无校验
- serailPort->serial->setParity(QSerialPort::NoParity);
- break;
- case 1://偶校验
- serailPort->serial->setParity(QSerialPort::EvenParity);
- break;
- case 2://奇校验
- serailPort->serial->setParity(QSerialPort::OddParity);
- break;
- case 3://校验位始终为1
- serailPort->serial->setParity(QSerialPort::MarkParity);
- break;
- case 4://校验位始终为0
- serailPort->serial->setParity(QSerialPort::SpaceParity);
- break;
- default:
- serailPort->serial->setParity(QSerialPort::UnknownParity);
- break;
- }
- //停止位
- QString srtStop = ui->StopRatecomboBox->currentText();
- int iStopIndex = ui->StopRatecomboBox->currentIndex();
- //int iStop = srtStop.toInt();
- switch (iStopIndex)
- {
- case 0:
- serailPort->serial->setStopBits(QSerialPort::OneStop);
- break;
- case 1:
- serailPort->serial->setStopBits(QSerialPort::OneAndHalfStop);
- break;
- case 2:
- serailPort->serial->setStopBits(QSerialPort::TwoStop);
- break;
- }
- serailPort->serial->setFlowControl(QSerialPort::NoFlowControl);//设置流控
- //打开串口
- if(!serailPort->serial->QSerialPort::open(QIODevice::ReadWrite))
- {
- if(serailPort->serial->isOpen())
- {
- QMessageBox::information(this,"提示","打开串口",QMessageBox::Ok);
- }
- QMessageBox::information(this,"错误提示","无法打开串口",QMessageBox::Ok);
- return;
- }
- //打开串口成功后,去使能参数选择框
- ui->PortcomboBox->setEnabled(false);
- ui->BautRatecomboBox->setEnabled(false);
- ui->DataBitcomboBox->setEnabled(false);
- ui->ParityRatecomboBox->setEnabled(false);
- ui->StopRatecomboBox->setEnabled(false);
- serailPort->setPorStatus(true);
- ui->OpenPortButton->setText("关闭串口");
- }
- void Dialog::on_OpenButton_clicked()
- {
- QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- phkcamera = new hkcamera();
- QString qstrip = ui->IPLineEdit->text();
- QString qstraccount = ui->AcccountLineEdit->text();
- QString qstrpwd = ui->PwdLineEdit->text();
- BOOL bconnect = phkcamera->connect(qstrip, 8000, qstraccount, qstrpwd);
- if(!bconnect){
- QApplication::restoreOverrideCursor();
- QMessageBox::critical(this,"错误","连接相机失败");//默认是模态的
- return;
- }
- HWND hWnd = (HWND)ui->DisplayLabel->winId(); //成功时,即可实时显示在该label上
- BOOL bdisplaypic = phkcamera->displaypic(hWnd);
- if(!bdisplaypic){
- QApplication::restoreOverrideCursor();
- QMessageBox::critical(this,"错误","连接相机成功,但预览失败");//默认是模态的
- return;
- }
- ui->OpenButton->setEnabled(false);
- ui->CloseButton->setEnabled(true);
- ui->SavePicButton->setEnabled(true);
- QApplication::restoreOverrideCursor();
- //QMessageBox::information(this,"成功","预览成功");//默认是模态的
- return;
- }
- void Dialog::on_SavePicButton_clicked()
- {
- //以当前时间作为文件名
- QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间
- QString strtime = datetime.toString("yyyyMMddhhmmss");//格式化时间
- QString qstrdir = ui->SavePicDirLineEdit->text();
- qstrdir = QDir::fromNativeSeparators(qstrdir);
- while(qstrdir.endsWith('/')) //此处检测 /
- {
- qstrdir.chop(1); //删除最后一字节
- }
- QString qstrfilename = qstrdir + "/" + strtime + ".jpg";
- phkcamera->savepic(qstrfilename);
- }
- void Dialog::on_CloseButton_clicked()
- {
- phkcamera->stopdisplaypic();
- // if(nullptr != phkcamera)
- // {
- // phkcamera->logout();
- // delete phkcamera;
- // phkcamera = nullptr;
- // }
- ui->OpenButton->setEnabled(true);
- ui->CloseButton->setEnabled(false);
- }
- void Dialog::grabPicandRes()
- {
- QString qstrdirname = "D:/irdet/grabpic";
- //抓取图片
- //以当前时间作为文件名
- QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间
- QString strtime = datetime.toString("yyyyMMddHHmmss");//格式化时间
- qint64 timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); //毫秒级
- QString msecsStr = QString::number(timestamp % 1000).rightJustified(3, '0');// 添加毫秒部分(最后三位)
- strtime += msecsStr;
- QString qstrfilename = qstrdirname + "/" + strtime + ".bmp";
- phkcamera->savepic(qstrfilename);
- //组装json格式的响应数据
- QJsonObject resultObj;
- resultObj["result"] = true;
- resultObj["msg"] = "操作成功";
- QJsonObject dataObj;
- dataObj["myGrabPicPath"] = qstrfilename;
- resultObj["data"] = dataObj;
- // 将整个响应包装在param中,但通常我们会将response作为独立的对象发送
- // 这里为了符合你的原始格式要求,我们仍然放在param中
- QJsonObject responseObj;
- responseObj["interface"] = "GrabPicture"; // 注意这里应该是正确的英文拼写
- responseObj["param"] = resultObj;
- QJsonDocument jsonDoc(responseObj);
- QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented); // 使用缩进格式化JSON,便于调试
- //发送数据
- if(nullptr != ptcpSocket1)
- {
- ptcpSocket1->write(jsonData);
- ptcpSocket1->flush(); // 确保数据被发送出去
- }
- }
- void Dialog::on_SendCmdButton_clicked()
- {
- //采集一帧图片并返回上位机
- grabPicandRes();
- QString qstrsendpower = ui->SendLineEdit->text();
- printf("\r\n");
- std::cout <<qstrsendpower.toStdString()<< endl;//必须加endl才能输出
- printf("\r\n");
- //创建新文件夹
- QDir dir;
- //以当前时间作为文件名
- QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间
- QString strtime = datetime.toString("yyyyMMddhhmmss");//格式化时间
- QString qstrdir = ui->SavePicDirLineEdit->text();
- qstrdir = QDir::fromNativeSeparators(qstrdir);
- while(qstrdir.endsWith('/')) //此处检测 /
- {
- qstrdir.chop(1); //删除最后一字节
- }
- QString qstrdirname = qstrdir + "/" + strtime;
- qDebug()<<qstrdirname;
- bool success = dir.mkdir(qstrdirname);
- if (!success) {
- qDebug() << "Failed to create directory!";
- QMessageBox::critical(this, tr("错误!"), tr("创建文件夹失败!"));
- return;
- }
- strnewidr = qstrdirname;
- //发送启动远程控制指令
- serailPort->sendtext("RUN@1=1#");
- //延迟1秒发送设置功率指令
- Sleep(1000);
- serailPort->sendtext(qstrsendpower);
- //获取加热时长,启动定时器超时后停止加热
- QString qstrheattimer = ui->RecvLineEdit_2->text();
- int iheatduration = qstrheattimer.toInt();
- hstopheattimerid = startTimer(iheatduration); //参数1 间隔 单位 毫秒
- //获取加热和降温时长,启动定时器超时后停止所有定时器
- QString qstrcooltimer = ui->RecvLineEdit_3->text();
- int ikillduration = iheatduration + qstrcooltimer.toInt();
- hkilltimerid = startTimer(ikillduration); //参数1 间隔 单位 毫秒
- //获取采样时长,并启动定时器
- QString qstsampletimer = ui->RecvLineEdit_4->text();
- int isampleduration = qstsampletimer.toInt();
- htimersampleid = startTimer(isampleduration); //参数1 间隔 单位 毫秒
- }
- void Dialog::timerEvent(QTimerEvent * ev)
- {
- //采样
- if(ev->timerId() == htimersampleid){
- qint64 timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); //毫秒级
- qint64 difference = timestamp - qiheatms;
- qDebug()<<"sample timer time out"<<difference;
- // qDebug()<<"difference"<<difference;
- //抓取图片
- //以当前时间作为文件名
- QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间
- QString strtime = datetime.toString("yyyyMMddHHmmss");//格式化时间
- QString msecsStr = QString::number(timestamp % 1000).rightJustified(3, '0');// 添加毫秒部分(最后三位)
- strtime += msecsStr;
- QString qstrdir = ui->SavePicDirLineEdit->text();
- qstrdir = QDir::fromNativeSeparators(qstrdir);
- while(qstrdir.endsWith('/')) //此处检测 /
- {
- qstrdir.chop(1); //删除最后一字节
- }
- if((difference > 200) && (difference < 1200)){
- strtime = "F" + strtime;
- }
- // QString qstrfilename = qstrdir + "/" + strtime + ".bmp";
- QString qstrfilename = strnewidr + "/" + strtime + ".bmp";
- qDebug()<<qstrfilename;
- phkcamera->savepic(qstrfilename);
- // //4.2 写数据
- // if(nullptr != ptcpSocket)
- // {
- // ptcpSocket->write(qstrfilename.toLatin1());
- // }
- }
- //停止加热
- if(ev->timerId() == hstopheattimerid)
- {
- qDebug()<<"stop heat timer time out";
- //发送停止加热指令
- serailPort->sendtext("RUN@1=0#");
- // //停止定时器
- killTimer(hstopheattimerid);
- qiheatms = QDateTime::currentDateTime().toMSecsSinceEpoch(); //毫秒级
- // //4.2 写数据
- // if(nullptr != ptcpSocket)
- // {
- // ptcpSocket->write(qstrfilename.toLatin1());
- // }
- // m_client->w
- }
- //停止所有定时器
- if(ev->timerId() == hkilltimerid)
- {
- qDebug()<<"stop all timer time out";
- //停止所有定时器
- killTimer(htimersampleid);
- killTimer(hkilltimerid);
- //4.2 写数据
- if(nullptr != ptcpSocket)
- {
- QString strsend = strposition + "!" + strnewidr;
- ptcpSocket->write(strsend.toLatin1());
- ptcpSocket->flush(); // 确保数据被发送出去
- }
- }
- }
- //void Dialog::slotNewConnection()
- //{
- // if(m_client == NULL)
- // {
- // //处理客户端的连接请求
- // m_client = m_server->nextPendingConnection();
- // //发送数据
- // m_client->write("服务器连接成功!!!");
- // //连接信号, 接收客户端数据
- // connect(m_client, &QTcpSocket::readyRead,
- //this, &Dialog::slotReadyRead);
- // }
- //}
- //void Dialog::slotReadyRead()
- //{
- // //接收数据
- // QByteArray array = m_client->readAll();
- // QMessageBox::information(this, "Client Message", array);
- //}
|