153 lines
3.4 KiB
C++
153 lines
3.4 KiB
C++
#include "CCtrlNikiraPMA.h"
|
|
#include <QRegularExpression>
|
|
CtrlNikiraPMA::CtrlNikiraPMA()
|
|
{
|
|
m_iBaudRate = 115200;
|
|
m_pSerialPort = new QSerialPort;
|
|
}
|
|
|
|
CtrlNikiraPMA::~CtrlNikiraPMA()
|
|
{
|
|
delete m_pSerialPort;
|
|
}
|
|
|
|
double CtrlNikiraPMA::ConvertDateToEpoch(const QString& qstrDateTime)
|
|
{
|
|
QDateTime dateTime = QDateTime::fromString(qstrDateTime, "yyyyMMdd-hh:mm:ss.zzz");
|
|
if (!dateTime.isValid())
|
|
{
|
|
throw std::invalid_argument("Invalid date format");
|
|
}
|
|
|
|
|
|
return dateTime.toMSecsSinceEpoch() / 1000.0;
|
|
}
|
|
|
|
QVector<double> CtrlNikiraPMA::ParseData(const QString& qstrData)
|
|
{
|
|
return QVector<double>();
|
|
}
|
|
|
|
QString CtrlNikiraPMA::FindCompleteFrame()
|
|
{
|
|
|
|
int firstValidCharPos = -1;
|
|
for (int i = 0; i < m_qbRecv.size(); ++i)
|
|
{
|
|
if (m_qbRecv[i] != '\x00' && m_qbRecv[i] != '\r')
|
|
{
|
|
firstValidCharPos = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (firstValidCharPos == -1)
|
|
{
|
|
return QString();
|
|
}
|
|
|
|
QByteArray validData = m_qbRecv.mid(firstValidCharPos);
|
|
|
|
int endPos = validData.lastIndexOf("OK\r");
|
|
if (endPos == -1)
|
|
{
|
|
return QString();
|
|
}
|
|
|
|
|
|
// 查找时间戳开头,确保是从时间戳开始到 OK\r 结束
|
|
QRegularExpression timeStampRegex(R"(\d{8}-\d{2}:\d{2}:\d{2}\.\d{3})");
|
|
QRegularExpressionMatch match = timeStampRegex.match(QString::fromLatin1(validData));
|
|
|
|
int startPos = match.capturedStart();
|
|
if (!match.hasMatch() || startPos >= endPos)
|
|
{
|
|
return QString();
|
|
}
|
|
|
|
|
|
QString completeFrame = QString::fromLatin1(validData.mid(startPos, endPos - startPos + 3));
|
|
|
|
|
|
m_qbRecv.remove(0, firstValidCharPos + endPos + 3);
|
|
//qDebug() << m_qbRecv;
|
|
//qDebug() << completeFrame;
|
|
return completeFrame;
|
|
|
|
////QRegularExpression frameRegex(R"((\d{8}-\d{2}:\d{2}:\d{2}\.\d{3},(-?\d+(\.\d+)?)(,-?\d+(\.\d+)?)*,OK\r))");
|
|
//QRegularExpression frameRegex("(\\d{8}-\\d{2}:\\d{2}:\\d{2}\\.\\d{3}.*?OK)");
|
|
//qDebug() << m_qbRecv;
|
|
//QRegularExpressionMatch match = frameRegex.match(QString::fromUtf8(m_qbRecv));
|
|
//if (match.hasMatch())
|
|
//{
|
|
// QString completeFrame = match.captured(1);
|
|
// m_qbRecv.remove(0, match.capturedEnd(1));
|
|
// //qDebug() << "Removed"<< m_qbRecv <<endl;
|
|
// return completeFrame;
|
|
//}
|
|
//return QString();
|
|
}
|
|
|
|
|
|
|
|
int CtrlNikiraPMA::Initialize(std::string ucPortNumber)
|
|
{
|
|
QString qstrPortName = QString::fromStdString(ucPortNumber);
|
|
|
|
m_pSerialPort->setPortName(qstrPortName);
|
|
m_pSerialPort->setReadBufferSize(512);
|
|
|
|
bool bRes = m_pSerialPort->setBaudRate(m_iBaudRate);
|
|
if (!bRes)
|
|
{
|
|
qDebug() << "Err:setBaudRate Failed.Exit Code:1";
|
|
return 1;
|
|
}
|
|
|
|
bRes = m_pSerialPort->open(QIODevice::ReadWrite);
|
|
if (!bRes)
|
|
{
|
|
qDebug() << "nikira,Err:open Failed.Exit Code:2";
|
|
return 2;
|
|
}
|
|
|
|
m_qbRecv.clear();
|
|
|
|
return 0;
|
|
}
|
|
|
|
QString CtrlNikiraPMA::GetLastValidDataFrame(double& dCH4, double& dH2O)
|
|
{
|
|
m_qbRecv.clear();
|
|
int iFlag = 1;
|
|
//qDebug() << "enter GetLastValidDataFrame";
|
|
while (iFlag)
|
|
{
|
|
//qDebug() << "enter GetLastValidDataFrame while";
|
|
m_pSerialPort->waitForReadyRead(1000);
|
|
QByteArray data = m_pSerialPort->readAll();
|
|
m_qbRecv.append(data);
|
|
//qDebug() <<"Append:" << m_qbRecv << endl;
|
|
QString qstrFrame = FindCompleteFrame();
|
|
if (!qstrFrame.isEmpty())
|
|
{
|
|
//if (qstrFrame.endsWith("OK\\r"))
|
|
//{
|
|
QStringList values = qstrFrame.split(',');
|
|
if (values.size() >= 5)
|
|
{
|
|
QString methane = values[2];
|
|
QString waterVapor = values[3];
|
|
|
|
dCH4 = methane.toDouble();
|
|
dH2O = waterVapor.toDouble();
|
|
iFlag = 0;
|
|
}
|
|
//qDebug() <<"FULL:" << qstrFrame << endl;
|
|
return qstrFrame;
|
|
//}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|