#include "dialog.h" #include "ui_dialog.h" #include //定时器类 #include #include #include #include "infoserialize/infoserialize.h" #include #include #include 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:"<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:"<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 <SavePicDirLineEdit->text(); qstrdir = QDir::fromNativeSeparators(qstrdir); while(qstrdir.endsWith('/')) //此处检测 / { qstrdir.chop(1); //删除最后一字节 } QString qstrdirname = qstrdir + "/" + strtime; qDebug()<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"<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()<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); //}