#include "qserialcommthrd.h"
#include <QMessageBox>
#define PI 3.1415926535897932
#define READ_TMP_BUF 1024000
#define WRT_MAXLEN_PERTIME 2048
QSerialCommThrd::QSerialCommThrd(QObject *parent) : QObject(parent)
{
m_llReadLen =0;
m_llRecvTotal =0;
m_iReadPos =0;
m_iWritePos =0;
m_pszData = new char[READ_TMP_BUF+1]; //读数据用
m_data = new unsigned char[WRT_MAXLEN_PERTIME+1]; //解析数据用数据指针
m_readBuff = new unsigned char[BUFF_MAX_LEN];
m_serial = new QSerialPort();
connect(m_serial, &QSerialPort::errorOccurred, this, &QSerialCommThrd::handleError);
connect(m_serial, &QSerialPort::readyRead, this, &QSerialCommThrd::readData);
m_pFileCsv = new QFile();
}
QSerialCommThrd::~QSerialCommThrd()
{
if(m_readBuff){
delete []m_readBuff;
}
if(m_pszData){
delete []m_pszData;
}
if(m_data){
delete []m_data;
}
}
void QSerialCommThrd::OpenSerial(QString strCom,QString strFile)
{
if(m_serial->isOpen()){
m_serial->close();
}
m_serial->setPortName(strCom);
m_serial->setBaudRate(921600);
m_serial->setDataBits(QSerialPort::Data8);
m_serial->setParity(QSerialPort::NoParity);
m_serial->setStopBits(QSerialPort::OneStop);
m_serial->setFlowControl(QSerialPort::NoFlowControl);
if (!m_serial->open(QIODevice::ReadWrite)) {
QMessageBox::critical(nullptr,tr("open serial"),tr("打开串口错误."));
return ;
}
memset(m_readBuff,0,BUFF_MAX_LEN);
m_llReadLen =0;
m_llRecvTotal =0;
if(m_fileDrilling.isOpen()){
m_fileDrilling.close();
}
m_fileDrilling.setFileName(strFile);
bool bOpen = m_fileDrilling.open(QIODevice::WriteOnly);
if(!bOpen){
QMessageBox::warning(nullptr,tr("测试"),tr("创建数据文件错误!"),QMessageBox::Ok);
}
m_iReadPos =0;
m_iWritePos =0;
}
void QSerialCommThrd::OnCloseSerial()
{
m_serial->close();
m_fileDrilling.close();
}
void QSerialCommThrd::OnRecvSendData(QByteArray dataArray)
{
if(m_serial->isOpen()){
m_serial->write(dataArray);
m_serial->flush();
}
}
void QSerialCommThrd::handleError(QSerialPort::SerialPortError error)
{
if (error == QSerialPort::ResourceError) {
// QMessageBox::critical(this, tr("Critical Error"), m_serial->errorString());
m_serial->close();
}
}
void QSerialCommThrd::readData(){
qint64 length = m_serial->bytesAvailable();
QByteArray info = m_serial->readAll();
if(length >0)
{
SaveComData(info);
return;
if(length +m_iWritePos > BUFF_MAX_LEN)
{
memcpy(m_pszData,info.data(),length);
int part = BUFF_MAX_LEN -m_iWritePos;
memcpy(m_readBuff+m_iWritePos,m_pszData,part);
memcpy(m_readBuff,m_pszData+part,length -part);
m_iWritePos = length -part;
}else{
memcpy(m_readBuff+m_iWritePos,info.data(),length);
m_iWritePos += length;
m_iWritePos %= BUFF_MAX_LEN;
}
m_llRecvTotal += length;
}
}
void QSerialCommThrd::AnalysisData()
{
//MSG_ACCELERATION 包最小长度20字节
if(m_llReadLen +20 <= m_llRecvTotal)
{
int iRdPos = m_iReadPos;
int iWrtPos = m_iWritePos;
int len=0;
if(iRdPos <= iWrtPos){
if(iRdPos + WRT_MAXLEN_PERTIME <= iWrtPos){
memcpy(m_data,m_readBuff+iRdPos,WRT_MAXLEN_PERTIME);
len = WRT_MAXLEN_PERTIME;
}else{
len = iWrtPos - iRdPos;
memcpy(m_data,m_readBuff+iRdPos,len);
}
m_iReadPos += len;
}else{
if(iRdPos + WRT_MAXLEN_PERTIME <= BUFF_MAX_LEN){
len = WRT_MAXLEN_PERTIME;
m_iReadPos += len;
}else{
len = BUFF_MAX_LEN - iRdPos;
m_iReadPos =0;
}
memcpy(m_data,m_readBuff+iRdPos,len);
}
SaveData(m_data,len);
m_iReadPos %= BUFF_MAX_LEN;
m_llReadLen +=len;
}
}
void QSerialCommThrd::SaveData(unsigned char* pdata,int len)
{
if(m_fileDrilling.isOpen() && (len >0)){
m_fileDrilling.write((const char*)pdata,len);
m_fileDrilling.flush();
}
}
void QSerialCommThrd::SaveComData(const QByteArray byteArray)
{
if(m_fileDrilling.isOpen()){
m_fileDrilling.write(byteArray);
m_fileDrilling.flush();
}
}
int QSerialCommThrd::NewTxtFile(int iFileID)
{
if(m_pFileCsv)
{
m_pFileCsv->close();
QString strFile =m_strLoadFile+QString::asprintf("_%d.txt",iFileID);
m_pFileCsv->setFileName(strFile);
bool bOk = m_pFileCsv->open(QIODevice::WriteOnly | QIODevice::NewOnly |QIODevice::Text);
if(!bOk)
{
//QMessageBox::critical(nullptr, tr("创建文件"), tr("创建CSV文件错误"));
return -1;
}
//char szTitle[512] ={"帧序号,横滚角(°),俯仰角(°),方位角(°),横滚角速度(rad/s),俯仰角速度(rad/s),方位角速度(rad/s),X轴方向加速度(m/s^2),Y轴方向加速度(m/s^2),Z轴方向加速度(m/s^2),时间戳(us),时间戳差值\n"};
char szTitle[512] ={"帧序号 横滚角(°) 俯仰角(°) 方位角(°) 横滚角速度(rad/s) 俯仰角速度(rad/s) 方位角速度(rad/s) X轴方向加速度(m/s^2) Y轴方向加速度(m/s^2) Z轴方向加速度(m/s^2) 时间戳(us) 时间戳差值\n"};
m_pFileCsv->write(szTitle,strlen(szTitle));
}
return 0;
}
void QSerialCommThrd::OnGetLoadFile(QString strFile)
{
m_bFirstPt =true;
m_llLastTimestamp = 0;
m_iFrmID =0;
m_iOutRowID =0;
m_llFileSize =0;
m_llFileSize =0;
m_iOutFileID =1;
m_strLoadFile = strFile;
LoadHistData(strFile);
}
void QSerialCommThrd::LoadHistData(QString strFile)
{
char szErrInfo[512] ={0};
QFile fileLoad(strFile);
bool bOpen = fileLoad.open(QIODevice::ReadOnly|QIODevice::ExistingOnly);
if(!bOpen){
strcpy(szErrInfo,"打开数据文件错误.");
emit transInfo(szErrInfo);
return;
}
m_llFileSize = fileLoad.size();
emit transFileSize(&m_llFileSize);
if(NewTxtFile(m_iOutFileID) <0){
strcpy(szErrInfo,"创建输出文件错误.");
emit transInfo(szErrInfo);
return;
}
qint64 fileSize = fileLoad.size();
uint8_t frm_head =0,ftmType =0;
char szData[512] ={0};
ST_SENSOR_REC* pstDrillRec = nullptr;
ST_MSG_AHRS_DATA* pstAhrsData = nullptr;
ST_MSG_ACCEL_DATA* pstAccData = nullptr;
pstDrillRec = new ST_SENSOR_REC();
if(NULL ==pstDrillRec){
strcpy(szErrInfo,"new ST_SENSOR_REC sstruct error.");
emit transInfo(szErrInfo);
return;
}
pstAhrsData = new ST_MSG_AHRS_DATA();
if(NULL ==pstAhrsData){
strcpy(szErrInfo,"new ST_MSG_AHRS_DATA sstruct error.");
emit transInfo(szErrInfo);
return;
}
pstAccData = new ST_MSG_ACCEL_DATA();
if(NULL ==pstAccData){
strcpy(szErrInfo,"new ST_MSG_ACCEL_DATA sstruct error.");
emit transInfo(szErrInfo);
return;
}
pstDrillRec->pAccel = pstAccData;
pstDrillRec->pAhrs = pstAhrsData;
memset(pstAccData,0,sizeof(ST_MSG_ACCEL_DATA));
qint64 readlen =0;
qint64 len = 0;
qint64 datalen =0;
int tick=0;
char szErr[256] ={"数据处理中......"};
emit transInfo(szErr);
while(len <= fileSize)
{
readlen= fileLoad.read(szData,1);
frm_head = szData[0];
if(frm_head != 0xFC){
len++;
continue;
}
readlen=