diff --git a/src/ConfigUtil/ConfigUtil.cpp b/src/ConfigUtil/ConfigUtil.cpp index 98082dc..5fc8615 100644 --- a/src/ConfigUtil/ConfigUtil.cpp +++ b/src/ConfigUtil/ConfigUtil.cpp @@ -73,7 +73,6 @@ bool ConfigUtil::readSocketServerConfig(const QString &configFile, QString &erro mset->beginGroup("socket_server"); config.server_ip = mset->value("server_ip", "").toString(); config.server_port = mset->value("server_port", "").toInt(); - config.delayed_upload = mset->value("delayed_upload", "").toInt(); mset->endGroup(); } catch (const std::exception &e) { diff --git a/src/qt_source/mainwindow.cpp b/src/qt_source/mainwindow.cpp index 112783e..4a85ef0 100644 --- a/src/qt_source/mainwindow.cpp +++ b/src/qt_source/mainwindow.cpp @@ -21,6 +21,7 @@ MainWindow::MainWindow(QWidget *parent) layout()->addWidget(this->statusBar); this->setWindowTitle("Matrix_RFID 车号识别程序(勿关!!)"); + this->configPath_ = "./config/config.ini"; if (!this->mkLogDir()) { @@ -29,7 +30,15 @@ MainWindow::MainWindow(QWidget *parent) // 配置文件读取 QString errorMessage = ""; - if (!ConfigUtil::readBaseConfig(g_config_path, errorMessage, this->baseConfig_)) + if (!ConfigUtil::readBaseConfig(this->configPath_, errorMessage, this->baseConfig_)) + { + this->logError(errorMessage); + } + if (!ConfigUtil::readInterfaceConfig(this->configPath_, errorMessage, this->interfaceConfig_)) + { + this->logError(errorMessage); + } + if (!ConfigUtil::readSocketServerConfig(this->configPath_, errorMessage, this->socketServerConfig_)) { this->logError(errorMessage); } @@ -40,13 +49,27 @@ MainWindow::MainWindow(QWidget *parent) // 初始化界面上的串口打开参数 this->initComboBox(); + this->serial_ = new QSerialPort; + + m_pSystemTray=new QSystemTrayIcon(this); connect(this->ui->openComButton, &QPushButton::clicked, this, &MainWindow::openComClicked); - connect(this->ui->testButton, &QPushButton::clicked, this, &MainWindow::readTestInfo); - // 最小化信号槽 + connect(this, &MainWindow::getRfid_signals, this, &MainWindow::getQueueDataThread); + + connect(this, &MainWindow::upRfid_signals, this, &MainWindow::upRfid); + + connect(this->ui->testButton, &QPushButton::clicked, this, &MainWindow::readTestInfo); + // 识别状态改变 + connect(this, &MainWindow::IdentifyType, this, &MainWindow::IdentifyTypeUpdate); + //最小化信号槽 connect(m_pSystemTray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason))); + + this->logRfidRecvName = "./Logs/rfid_data.txt"; + this->recvLog.setFileName(logRfidRecvName); + this->recvLog.open(QIODevice::ReadWrite | QIODevice::Append); + //初始最小化 //this->showMinimized();//最小化 // 设置最大展示数据行数 @@ -57,52 +80,91 @@ MainWindow::MainWindow(QWidget *parent) this->ui->resultTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); this->ui->resultTable->verticalHeader()->setMinimumWidth(50); -// if (!this->baseConfig_.upResult) -// { -// QIcon icon("./Fail.ico"); -// QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 -// this->ui->upflagLabel->setPixmap(m_pic); -// }else{ -// QIcon icon("./Succ.ico"); -// QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 -// this->ui->upflagLabel->setPixmap(m_pic); -// } + if (!this->baseConfig_.upResult) + { + QIcon icon("./Fail.ico"); + QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 + this->ui->upflagLabel->setPixmap(m_pic); + }else{ + QIcon icon("./Succ.ico"); + QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 + this->ui->upflagLabel->setPixmap(m_pic); + } - // 初始化LED指示灯 - this->upResultType(this->baseConfig_.upResult); + if (this->baseConfig_.useSocketServer) + { + // 创建线程 + QThread *threadWork = new QThread; // 任务线程 - this->readComThread = new ReadComThread(&this->queueTrainInfo_, this); - this->readComThread->start(); + this->tcpClient = new TcpClient(this); + this->tcpClient->moveToThread(threadWork); - this->upResultThread = new UpResultThread(&this->queueTrainInfo_, this); + connect(this, &MainWindow::connect_socket, this->tcpClient, &TcpClient::connectToServer); + + // 子线程反馈 socket 到主线程 + connect(this->tcpClient, &TcpClient::socketComplete, this, [=](QTcpSocket* tcp, QString ip, quint16 port){ + this->tcp_ = tcp; + }); + + // 接收子线程的消息提示 + connect(this->tcpClient, &TcpClient::sendTcpInfoSignals, this, [=](const QString& info){ + this->logInfo(info); + this->statusInfo->setText(info); + if (info == "链接服务端超时" + || info == "未连接Socket服务器" + || info == "链接服务端失败" + || info == "服务端断开连接" + || info == "链接服务端失败") + { + this->videoHasTrain = false; + } + }); + // 接收子线程的TCP消息内容展示 + connect(this->tcpClient, &TcpClient::getTcpInfoSignals, this, [=](const QString& info){ + this->logInfo(info); + }); + + emit connect_socket(this->socketServerConfig_.server_ip, this->socketServerConfig_.server_port); + + connect(this->tcpClient, &TcpClient::comeTrainSignals, this, [=](bool type) { + if (type) + { + this->logInfo("视频车号识别-来车了"); + this->videoHasTrain = true; + emit IdentifyType(); + } + else + { + this->logInfo("视频车号识别-火车离开了"); + this->videoHasTrain = false; + if (this->needIdentify) + emit IdentifyType(); + } + }); + connect(this->tcpClient, &TcpClient::getDirectionSignals, this, [=](int direction) { + if (this->iDirection != direction) + { + this->logInfo("获得方向判定:" + QString(direction > -1 ? (direction > 0 ? "需识别" : "待定") : "无需上传")); + this->iDirection = direction; + } + }); + } + + ui->openComButton->click(); + + this->upResultThread = new UpResultThread(&this->queueTrainInfo_, &this->iDirection, this); this->upResultThread->start(); - connect(this, &MainWindow::openCom_signals, this->readComThread, &ReadComThread::openCom); - connect(this, &MainWindow::readTestRfid_signals, this->readComThread, &ReadComThread::readTestInfo); - - connect(this->readComThread, &ReadComThread::openComSuccess, this, &MainWindow::openComResult); - connect(this->readComThread, &ReadComThread::closeComSuccess, this, &MainWindow::closeComResult); - connect(this->readComThread, &ReadComThread::comeTrain, this, &MainWindow::comeTrain); - connect(this->readComThread, &ReadComThread::upResultType, this, &MainWindow::upResultType); - // 状态栏信息变化 - connect(this->readComThread, &ReadComThread::statusInfoUpdate, this, &MainWindow::statusInfoUpdate); - - connect(this->readComThread, &ReadComThread::DebugSignals, this, &MainWindow::DebugSlots); - connect(this->readComThread, &ReadComThread::InfoSignals, this, &MainWindow::InfoSlots); - connect(this->readComThread, &ReadComThread::WarnSignals, this, &MainWindow::WarnSlots); - connect(this->readComThread, &ReadComThread::ErrorSignals, this, &MainWindow::ErrorSlots); - connect(this->upResultThread, &UpResultThread::DebugSignals, this, &MainWindow::DebugSlots); connect(this->upResultThread, &UpResultThread::InfoSignals, this, &MainWindow::InfoSlots); connect(this->upResultThread, &UpResultThread::WarnSignals, this, &MainWindow::WarnSlots); connect(this->upResultThread, &UpResultThread::ErrorSignals, this, &MainWindow::ErrorSlots); - - ui->openComButton->click(); } MainWindow::~MainWindow() { this->logInfo("-- 程序退出 --"); + this->initParam(); delete ui; } @@ -122,8 +184,16 @@ void MainWindow::logError(const QString& message) { LogError << message.toStdString(); ui->textBrowser->append(QString("[Error] [") + this->getSystemTime() + QString::fromStdString("] ") + message); } -void MainWindow::statusInfoUpdate(const QString &info) { - this->statusInfo->setText(info); + +void MainWindow::initParam() { + this->rfidSourceInfo = ""; + this->trainTime = ""; + if (this->recvLog.isOpen()) this->recvLog.close(); + this->vecTrain.clear(); + this->needIdentify = false; + this->rnameRfidLog(); + this->queue_.clear(); + this->iDirection = 0; } /** @@ -142,6 +212,80 @@ bool MainWindow::mkLogDir() return true; } +bool MainWindow::mkRfidLog() +{ + try { + QFileInfo fileInfo(this->logRfidRecvName); + if(fileInfo.isFile()) + { + return true; + } + this->recvLog.setFileName(this->logRfidRecvName); + if (!this->recvLog.isOpen()) + { + this->recvLog.open(QIODevice::ReadWrite | QIODevice::Append); + } + return true; + } catch (const std::exception &e) { + this->logError("创建、打开RFID原始数据日志文件失败,详细:"); + this->logError(e.what()); + } + return false; +} + +void MainWindow::deleteOldFiles(const QString &path, int days) +{ + QDir dir(path); + foreach(QFileInfo fi, dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot)) + { + if((fi.lastModified().addDays(days) < QDateTime::currentDateTime())) + { + QFile::remove(fi.absoluteFilePath()); + } + } +} + +bool MainWindow::rnameRfidLog() +{ + try { + this->recvLog.close(); + QFile logFile(this->logRfidRecvName); + QFileInfo fileInfo(logFile); + if (fileInfo.size() == 0) return false; + + QString newLogFileName = fileInfo.path() + "/"; + newLogFileName.append(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss")); + newLogFileName.append(".txt"); + + if (!logFile.rename(newLogFileName)) + { + this->logError("读取RFID原始数据,存储重命名失败!"); + return false; + } + + this->deleteOldFiles(fileInfo.path(), 3); + } catch (const std::exception &e) { + this->logError("读取RFID原始数据,存储重命名失败!"); + return false; + } + return true; +} + +void MainWindow::saveRfidLog(const QString &value) +{ + try { + QString logValue = value + "\n"; + if (!this->recvLog.isOpen()) + { + this->recvLog.open(QIODevice::ReadWrite | QIODevice::Append); + } + this->recvLog.write(logValue.toUtf8()); + this->recvLog.flush(); + } catch (const std::exception &e) { + this->logError("保存RFID原数据失败"); + } +} + /** * 获取本地所有串口 * @return @@ -158,13 +302,12 @@ QList MainWindow::getComList() { /** * 初始化 comboxBox 组件的值 */ -void MainWindow::initComboBox() -{ +void MainWindow::initComboBox() { // ui->BTBox->setEditable(true); - ui->BTBox->setStyleSheet("QComboBox {background-color: rgb(255, 255, 255);} QComboBox QAbstractItemView::item {min-height: 30px; background-color: rgb(255, 255, 255); color: rgb(225, 225, 225);}"); + ui->BTBox->setStyleSheet("QComboBox {background-color: rgb(255, 255, 255);} QComboBox QAbstractItemView::item {min-height: 30px; background-color: rgb(225, 225, 225);}"); ui->BTBox->setView(new QListView()); ui->comBox->setEditable(true); - ui->comBox->setStyleSheet("QComboBox {background-color: rgb(255, 255, 255);} QComboBox QAbstractItemView::item {min-height: 30px; background-color: rgb(255, 255, 255); color: rgb(225, 225, 225);}"); + ui->comBox->setStyleSheet("QComboBox {background-color: rgb(255, 255, 255);} QComboBox QAbstractItemView::item {min-height: 30px; background-color: rgb(225, 225, 225);}"); ui->comBox->setMaxVisibleItems(5); ui->comBox->setView(new QListView()); ui->comBox->addItems(this->comList); @@ -182,6 +325,9 @@ void MainWindow::initComboBox() ui->BTBox->setCurrentText(QString::number(this->baseConfig_.baud)); ui->truckEdit->setText(QString::number(this->baseConfig_.trackName)); + + this->rfidHasTrain = false; + this->videoHasTrain = false; } /** @@ -243,6 +389,8 @@ void MainWindow::closeEvent(QCloseEvent *event) // 验证账号和密码是否正确 if (password == "matrix") { + this->initParam(); + this->tcp_->close(); event->accept(); // 关闭窗口 exit(0); } else { @@ -310,8 +458,31 @@ void MainWindow::openComClicked() { if (ui->openComButton->text() == "打开串口") { - this->auto_reconnect_serial_ = true; - emit openCom_signals(true); + this->serial_ = this->comDetect_.openCom(ui->comBox->currentText(), ui->BTBox->currentIndex()); + if (this->serial_ != nullptr) + { + QString logs; + logs.append("串口打开成功\n"); + logs.append("串口号:" + ui->comBox->currentText() + "\n"); + logs.append("波特率:" + ui->BTBox->currentText() + "\n"); + if (this->baseConfig_.havaMagnetSteel) + logs.append("磁钢顺序:" + this->baseConfig_.magnetSteelOrder); + this->isOpenCom = true; + this->logInfo(logs); + this->ui->openComButton->setText("关闭串口"); + this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " + "background-color: rgba(74, 221, 108, 225);\ " + "border:1px solid rgba(168, 168, 168, 105);"); + connect(this->serial_,&QSerialPort::readyRead,this,&MainWindow::readCom); // + + connect(this->serial_, &QSerialPort::errorOccurred, this, &MainWindow::serialPort_error); + + } + else + { + this->isOpenCom = false; + this->logInfo("串口打开失败!"); + } } else { @@ -320,11 +491,16 @@ void MainWindow::openComClicked() // 验证账号和密码是否正确 if (password == "matrix") { - this->auto_reconnect_serial_ = false; - if (this->comDetect_.closeCom()) { - emit openCom_signals(false); + if (this->needIdentify == true) this->needIdentify = false; + this->isOpenCom = false; + this->logInfo("串口已关闭!"); + this->initParam(); + this->ui->openComButton->setText("打开串口"); + this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " + "background-color: red;\ " + "border:1px solid rgba(168, 168, 168, 105);"); } } else { QMessageBox::warning(this, "验证失败", "密码不正确!"); @@ -332,57 +508,195 @@ void MainWindow::openComClicked() } } -void MainWindow::openComResult(const bool &success) +/** + * 串口异常退出的槽函数 + * @param error + */ +void MainWindow::serialPort_error(QSerialPort::SerialPortError error) { - this->ui->openComButton->setText("关闭串口"); - if (success) - { - this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " - "background-color: rgba(74, 221, 108, 225);\ " - "border:1px solid rgba(168, 168, 168, 105);"); - } - else - { - this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " - "background-color: red;\ " - "border:1px solid rgba(168, 168, 168, 105);"); - - this->logInfo("10秒钟后自动尝试重连串口..."); -// if (auto_reconnect_serial_) emit openCom_signals(true, 10 * 1000); - } -} - -void MainWindow::closeComResult(const bool &success) -{ - if (success) + if (error != QSerialPort::NoError) { + //关闭串口 + this->serial_->close(); this->ui->openComButton->setText("打开串口"); - this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " + this->logError("串口异常退出,疑似接口松动"); + this->ui->LEDlabel->setStyleSheet("border-radius: 16px; \ " "background-color: red;\ " "border:1px solid rgba(168, 168, 168, 105);"); } - else - { - this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " - "background-color: rgba(74, 221, 108, 225);\ " - "border:1px solid rgba(168, 168, 168, 105);"); +} + +void MainWindow::readCom() +{ + try { + if (this->serial_->waitForReadyRead(10)) { + QByteArray data = this->serial_->readAll(); // 读取数据 + if(!data.isEmpty()) + { + this->queue_.push(QString(data)); + emit getRfid_signals(); + } +// this->serial_->clear(); + data.clear(); + } + else + { + this->logError("等待读取超时"); + } + } catch(...) { + this->logError("读取串口数据异常!"); } } -void MainWindow::comeTrain(const bool &success) { - this->resultTableModel_->clear(); - this->resultTableModel_ = this->getStandardItemModel(); +/** + * @brief:从queue中获取数据 + * @param:空 + * @return:空 + */ +void MainWindow::getQueueDataThread() +{ + if (this->queue_.isEmpty()) return; + + QString strRfidInfo = this->queue_.getTop(); + this->queue_.pop(); + this->saveRfidLog(strRfidInfo); + this->tmpRfid.append(strRfidInfo); + if (this->tmpRfid.right(1) != "&") + { + return; + } + + this->tmpRfid = this->tmpRfid.replace("&", ""); + QStringList rfidSubList = this->tmpRfid.split("@"); + this->tmpRfid = ""; + + auto split_lambda = [=](QString strFirst, QString strOther){ + if (strFirst == "0") + { + this->rfidHasTrain = false; + this->logInfo("RFID-火车离开了"); + // 关功放信号 + // 需要结合 “来车状态”广播消息,确认是否真的车离开了; TODO:没有真离开,则向串口发送 @on& 避免关功放 + emit IdentifyType(); + } + else + { + // TODO: 此处按照4个磁钢来配置,可能存在一定限制; 另外逻辑需要优化 + if (strOther == "000000" // 第一次检测来车时(前提是上一次功放已关闭) + && (strFirst == this->baseConfig_.magnetSteelOrder.left(1) + || strFirst == this->baseConfig_.magnetSteelOrder.mid(1, 1))) + { + this->rfidHasTrain = true; + this->logInfo("RFID-来车了"); + emit IdentifyType(); + } + } + }; + + for (const auto & i : rfidSubList) + { + if (i.size() == 26 || i.size() == 24) + { + // 车厢信息 + QString strTrainInfo = i.left(14); + + if (vecTrain.empty() || !vecTrain.contains(strTrainInfo)) + { + bool isNoCarriage = false; + int carT = strTrainInfo.mid(3, 2).simplified().toInt(&isNoCarriage); + if (isNoCarriage && carT >= 10) continue; + // 因信号不稳定 增加一行过滤 出现文字中带有字母及数字以外的字符时,过滤 + if (!strTrainInfo.contains(QRegExp("^[A-Z0-9\\s]+$"))) continue; + // 因信号不稳定 增加一行过滤 出现读到的数据里 空格替代了实际字符的情况 + if (strTrainInfo.mid(7, 7).simplified().size() < 7) continue; + vecTrain.append(strTrainInfo); + int train_order = vecTrain.size(); + this->resultTableModel_->setItem(train_order - 1, 0, new QStandardItem(strTrainInfo)); + this->logInfo(QString("第%1节 %2").arg(train_order).arg(strTrainInfo)); + // 将接收到的RFID使用@符拼接起来,以待后续上传web + this->rfidSourceInfo.append("@" + i); + QString rfidinfo = this->rfidSourceInfo; + this->rfidSourceInfo = ""; + emit upRfid_signals(rfidinfo); + + } + } + else if (i.size() == 7) + { + // 不使用磁钢的情况下 过滤掉磁钢信号 + if (!this->baseConfig_.havaMagnetSteel) continue; + // 磁钢信号 + QString strFirst = i.left(1); + QString strOther = i.mid(1, i.size() - 1); + // 将接收到的RFID使用@符拼接起来,以待后续上传web + this->rfidSourceInfo.append("@" + i); + split_lambda(strFirst, strOther); + } + else if (i.size() == 14) // 特殊情况,来车信号少了&符 + { + // 不使用磁钢的情况下 过滤掉磁钢信号 + if (!this->baseConfig_.havaMagnetSteel) continue; + for (int j = 0; j < i.size(); j+=7) { + QString rfid_cg = i.mid(j, 7); + QString strFirst = rfid_cg.left(1); + QString strOther = rfid_cg.mid(1, 6); + // 将接收到的RFID使用@符拼接起来,以待后续上传web + this->rfidSourceInfo.append("@" + rfid_cg); + split_lambda(strFirst, strOther); + } + } + } } -void MainWindow::upResultType(const bool &type) { - if (type) { - QIcon icon("./Succ.ico"); - QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 - this->ui->upflagLabel->setPixmap(m_pic); - } else { +void MainWindow::upRfid(QString rfidInfo) +{ + if (!this->baseConfig_.upResult) return; + if (!this->needIdentify && this->baseConfig_.havaMagnetSteel) + { QIcon icon("./Fail.ico"); QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 this->ui->upflagLabel->setPixmap(m_pic); + return; + }else{ + QIcon icon("./Succ.ico"); + QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(32, 32)));//size自行调整 + this->ui->upflagLabel->setPixmap(m_pic); + } + + QString info = this->vecTrain.back(); + int order = this->vecTrain.size(); + + info = info.mid(1,info.size() - 1); + + TrainInfo trainInfo; + trainInfo.carriageType = info.left(6).simplified().toStdString(); + trainInfo.carriageNum = info.mid(6, info.size() - 6).simplified().toStdString(); + trainInfo.strOrder = QString::number(order).toStdString(); + trainInfo.trainTime = this->trainTime.toStdString(); + trainInfo.collectTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz").toStdString(); + trainInfo.strRfidInfo = rfidInfo.toStdString(); + + this->queueTrainInfo_.push(trainInfo); +} + +void MainWindow::IdentifyTypeUpdate() { + if (this->rfidHasTrain || this->videoHasTrain) + { + if (!this->needIdentify) + { + this->logInfo("来车了"); + this->mkRfidLog(); + this->vecTrain.clear(); + this->needIdentify = true; + this->trainTime = this->getSystemTime(); + this->resultTableModel_->clear(); + this->resultTableModel_ = this->getStandardItemModel(); + } + } + else if (!this->rfidHasTrain && !this->videoHasTrain) + { + this->initParam(); + this->logInfo("火车离开了"); } } @@ -406,16 +720,32 @@ void MainWindow::ErrorSlots(const QString &info) { void MainWindow::readTestInfo() { - if (this->ui->openComButton->text() == "关闭串口") + + if (this->isOpenCom) { logWarn("请先关闭串口后进行测试操作!"); return; } QString filePath = QFileDialog::getOpenFileName(this, "选择一个文件", QDir::currentPath(), "(*.*)"); if(filePath.isEmpty()){ -// QMessageBox::warning(this, "打开文件", "选择文件不能为空"); + QMessageBox::warning(this, "打开文件", "选择文件不能为空"); return; } - - emit this->readTestRfid_signals(filePath); + // 创建一个QFile对象并打开要读取的文本文件 + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + logError("无法打开测试文件:" + filePath); + return; + } + logInfo("开始读取测试数据..."); + // 将文件内容读入到QStringList中 + QTextStream in(&file); + while(!in.atEnd()) { + QString line = in.readLine(); + this->queue_.push(line); + emit getRfid_signals(); + } + // 关闭文件 + file.close(); + logInfo("---读取测试数据完毕---"); } \ No newline at end of file diff --git a/src/qt_source/mainwindow.h b/src/qt_source/mainwindow.h index f585011..c0ab5ed 100644 --- a/src/qt_source/mainwindow.h +++ b/src/qt_source/mainwindow.h @@ -49,11 +49,10 @@ #include #include #include "common.h" - +#include "ConfigUtil.h" #include "ComDetect.h" - -#include "UpResultThread.h" -#include "ReadComThread.h" +#include "TcpClient.h" +#include "../threads/UpResultThread.h" QT_BEGIN_NAMESPACE @@ -74,10 +73,16 @@ public: void logWarn(const QString& message); void logError(const QString& message); // 创建日志目录 - bool mkLogDir(); + static bool mkLogDir(); + bool mkRfidLog(); + void deleteOldFiles(const QString &path, int days); + bool rnameRfidLog(); + void saveRfidLog(const QString &value); void initParam(); + + QString getSystemTime(); // 获const 取串口列表& @@ -92,7 +97,7 @@ public: private: UpResultThread *upResultThread; - ReadComThread *readComThread; + QString trainTime; QString logRfidRecvName; QFile recvLog; @@ -100,14 +105,15 @@ private: QString configPath_; // ai_matrix::BaseConfig baseConfig_; ai_matrix::InterfaceConfig interfaceConfig_; - + ai_matrix::SServerConfig socketServerConfig_; std::string webToken; //授权信息 + QSerialPort *serial_; //串口 + // 表格model QStandardItemModel *resultTableModel_ = nullptr; // 打开com口标志 bool isOpenCom = false; - bool auto_reconnect_serial_ = false; // Com口数据读取类 ComDetect comDetect_; // com口列表 @@ -116,15 +122,24 @@ private: QStringList vecTrain; MQueue queue_{}; // RFID读取的数据队列 MQueue queueTrainInfo_{}; // RFID读取的磁钢信息队列 - QString rfidSourceInfo; QString tmpRfid; //临时存储的RFID原始数据,用于防止接收的数据不完整 + // 识别方向正确标志 + bool needIdentify = false; + // 视频识别有火车标志(使用socket服务时才有用) + bool videoHasTrain = false; + // RFID识别有火车标志 + bool rfidHasTrain = false; + // 是否是需要识别的方向 -1:不识别 0:未确定 1:识别 + int iDirection = 0; // 获取当前时间 QDateTime currentTime_ = QDateTime::currentDateTime(); -private: + TcpClient* tcpClient; +private: + QTcpSocket* tcp_ = nullptr; QStatusBar* statusBar; QLabel *statusInfo; @@ -141,19 +156,19 @@ private: void creat_menu(); signals: - void openCom_signals(const bool &type, const int &msec = 0); - void readTestRfid_signals(const QString &filePath); - + void getRfid_signals(); + void upRfid_signals(QString rfidInfo); + void connect_socket(QString ip, int port); + void IdentifyType(); private slots: void openComClicked(); - void openComResult(const bool &success); - void closeComResult(const bool &success); - void upResultType(const bool &type); - void comeTrain(const bool &success); + void readCom(); + void getQueueDataThread(); + void upRfid(QString rfidInfo); + void serialPort_error(QSerialPort::SerialPortError error); void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason); void readTestInfo(); - - void statusInfoUpdate(const QString &info); + void IdentifyTypeUpdate(); void DebugSlots(const QString &info); void InfoSlots(const QString &info); diff --git a/src/serial/ComDetect.cpp b/src/serial/ComDetect.cpp index 2389211..51bf9a3 100644 --- a/src/serial/ComDetect.cpp +++ b/src/serial/ComDetect.cpp @@ -19,7 +19,6 @@ QSerialPort* ComDetect::openCom(const QString &com, int baud) { try { - this->serial_ = new QSerialPort; this->serial_->setPortName(com); if (baud == 9600) @@ -54,7 +53,7 @@ QSerialPort* ComDetect::openCom(const QString &com, int baud) } catch (const std::exception &e) { - LogError << e.what(); + std::cout << e.what() << std::endl; return nullptr; } diff --git a/src/serial/ComDetect.h b/src/serial/ComDetect.h index 0103b4a..253b598 100644 --- a/src/serial/ComDetect.h +++ b/src/serial/ComDetect.h @@ -10,7 +10,6 @@ #include #include #include "MQueue.h" -#include "common.h" class ComDetect { public: diff --git a/src/threads/UpResultThread.cpp b/src/threads/UpResultThread.cpp index ed186bd..8d3407b 100644 --- a/src/threads/UpResultThread.cpp +++ b/src/threads/UpResultThread.cpp @@ -26,7 +26,7 @@ void UpResultThread::run() { while (true) { - QThread::sleep(1); +// if ((*this->iDirection == 0 && this->queueTrainInfo_->size() <= 4) || *this->iDirection < 0) continue; while (!this->queueTrainInfo_->isEmpty()) { @@ -36,7 +36,7 @@ void UpResultThread::run() //this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败!"); } } - + QThread::sleep(1); } } @@ -72,7 +72,7 @@ bool UpResultThread::upWeb(TrainInfo &trainInfo) httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort); cli.set_connection_timeout(3, 0); - cli.set_read_timeout(2, 0); + cli.set_read_timeout(3, 0); httplib::Headers header; httplib::Params params; header.emplace("blade-auth", this->webToken);