diff --git a/Header_Files/udpserver.h b/Header_Files/udpserver.h index 7e359ad..9de782f 100644 --- a/Header_Files/udpserver.h +++ b/Header_Files/udpserver.h @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include "ximeaimager.h" #include "sbgrecorder.h" @@ -22,6 +24,28 @@ extern "C" #include } +class Record300TcTemperature : public QObject +{ +Q_OBJECT + +public: + Record300TcTemperature(); + + void stopRecordTemperature(); + +private: + bool m_bIsRecord; + + QSerialPort * m_serial; + + float parseMessage(QByteArray * data); +public slots: + void recordTemperature(QString filePath); + +signals: + +}; + class UdpServer:public QObject { Q_OBJECT @@ -48,6 +72,9 @@ class UdpServer:public QObject void sender(int status); + QThread * m_recordTempThread; + Record300TcTemperature * m_300tcTemperature; + signals: void systemStart(); void systemStop(); @@ -56,6 +83,7 @@ signals: void startDeleteFileSignal(); void recordXimeaOnlySignal(double,QString); + void record300tcTemperatureSignal(QString); public slots: void onRecordFinished(); diff --git a/Source_Files/udpserver.cpp b/Source_Files/udpserver.cpp index 121a645..4a010bd 100644 --- a/Source_Files/udpserver.cpp +++ b/Source_Files/udpserver.cpp @@ -65,6 +65,17 @@ UdpServer::UdpServer() system("sudo gpio write 10 0"); + m_recordTempThread=new QThread(); + m_300tcTemperature = new Record300TcTemperature(); + m_300tcTemperature->moveToThread(m_recordTempThread); + m_recordTempThread->start(); + connect(this, SIGNAL(record300tcTemperatureSignal(QString)),m_300tcTemperature, SLOT(recordTemperature(QString))); + + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString Temperature300tcCSVPath = QDir::cleanPath(QString::fromStdString("/media/nvme/300TC/programRunLog/300tcTemperature") + QDir::separator() + "300tcTemperature_" + currentTime + ".csv"); + emit record300tcTemperatureSignal(Temperature300tcCSVPath); + std::cout<<"UdpServer::UdpServer--------:System ready!"<stopRecordTemperature(); if(m_sbgRecorder->getSbgState()>=1) { @@ -350,3 +361,199 @@ void UdpServer::onRecordFinished() { std::cout<<"UdpServer::onRecordFinished----------------:影像停止采集"< fileInfo = getFileInfo(filePath); + bool ret = createDir(fileInfo[0]); + + ofstream temperatureFile300Tc(filePath.toStdString().c_str(),ios::app); + int counter = 0; + + m_serial=new QSerialPort(); + + if(m_serial->isOpen())//如果串口已经打开了 先给他关闭了 + { + m_serial->clear(); + m_serial->close(); + } + + QString portname = "ttyUSB2"; + + m_serial->setPortName(portname); + m_serial->open(QIODevice::ReadWrite); + + bool x=m_serial->setBaudRate(9600); + + QByteArray requestData; + while (m_bIsRecord) + { + counter++; + if(m_serial->waitForReadyRead(30000)) + { + requestData = m_serial->readAll(); + + float temp = parseMessage(&requestData); + if (temp == -10000) + { + continue; + } + + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy/MM/dd hh:mm:ss"); + + temperatureFile300Tc << currentTime.toStdString() << "," << temp << "\n"; + +// if(temp > 80) +// { +// system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 9,0"); +// } +// if(temp > 90) +// { +// system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 2"); +// } +// + if (counter % 60 == 0) + { + temperatureFile300Tc.flush(); + } + sleep(1); + } + else + { +// std::cout<<"Record300TcTemperature::recordTemperature--Wait response timeout."<toHex(); + +// for (int i = 0; i < data->length(); ++i) +// { +// qDebug() << i << ":" << (int)data->at(i); +// } + + QByteArray target = QByteArray::fromHex("5a5a"); // The pattern to search for + + int offset_tmp = data->indexOf(target); + QList offsets; + + while (offset_tmp != -1) + { + offsets.append(offset_tmp); + offset_tmp = data->indexOf(target, offset_tmp + target.size()); + } + + if (offsets.isEmpty()) + { +// qDebug() << "5A5A not found in the data."; + return -10000; + } +// qDebug() << "5A5A found at offsets:" << offsets; + + for (int i = 0; i < offsets.length(); ++i) + { + int offset = offsets.at(i); + + int messageClass = data->at(offset + 2); + int messageCount = data->at(offset + 3) + 5; +// qDebug() << "messageCount:" << messageCount; + if (offset + messageCount - 1 > data->length() - 1) + { + qDebug() << i << ": Some data of this frame is missing! Discarding the frame."; + continue; + } + + + int checksum = 0; + QList numbers; + for (int j = 0; j < messageCount - 1; ++j) + { + if (i==offsets.length()-1 && j== messageCount-1) + { + int sdf=1; + } + + int index = offset + j; + + if (index >= data->length())//Some data of this frame is missing! Discarding the frame. + { + checksum = -1; + break; + } + int tmp = static_cast(data->at(index)); + numbers.append(tmp); + checksum += tmp; + } +// qDebug() << "jiaqilai:" << numbers; + + if (checksum == -1) + { + qDebug() << "Some data of this frame is missing! Discarding the frame."; + continue; + } + + if ((checksum & 0xFF) != data->at(offset + messageCount - 1)) + { + qDebug() << "Checksum mismatch! Discarding the frame."; + continue; + } + + //parse data + switch (messageClass) + { + case 0x15: + Lux = (float)((data->at(offset + 4)<<24)|(data->at(offset + 5)<<16)|(data->at(offset + 6)<<8)|data->at(offset + 7)) / 100; +// qDebug() << "lux: " << Lux; + break; + case 0x45: + T = (float)((data->at(offset + 4)<<8)|data->at(offset + 5)) / 100; + P = (float)((data->at(offset + 6)<<24)|(data->at(offset + 7)<<16)|(data->at(offset + 8)<<8)|data->at(offset + 9)) / 100; + Hum = (float)((data->at(offset + 10)<<8) | data->at(offset + 11)) / 100; + H = (float)((data->at(offset + 12)<<8)|data->at(offset + 13)); + + hasTemperature = true; + +// qDebug() << "T: " << T; +// qDebug() << "P: " << P; +// qDebug() << "Hum: " << Hum; +// qDebug() << "H: " << H; + break; + default : // 可选的 + ; + + } + } + if (hasTemperature) + { + return T; + } + else + { + return -10000; + } +} diff --git a/Source_Files/ximeaimager.cpp b/Source_Files/ximeaimager.cpp index 2b65f66..56dd8c2 100644 --- a/Source_Files/ximeaimager.cpp +++ b/Source_Files/ximeaimager.cpp @@ -944,10 +944,12 @@ void RecordXimeaTemperature::recordTemperature(QString filePath= nullptr) float temp = m_imager->getTemperature(); if(temp > 80 && m_ximeaImager->getImagerState() == 104) { + ximeaTemperatureFile.flush(); system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 9,0"); } if(temp > 90) { + ximeaTemperatureFile.flush(); system("/home/300tc/projects/udpClient/udpClient 127.0.0.1 2"); }