You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wheeldetect/src/RasterSDG20/Analysis/RasterAnalysis.cpp

268 lines
5.0 KiB
C++

#include "Rasteranalysis.h"
QRasterAnalysis::QRasterAnalysis(QObject *parent)
: QObject(parent), m_tsk(true), _initdone(false)
{
this->requestData.clear();
analysisTsk = new QMyThread(this);
analysisTsk->setUser(true);
analysisTsk->loadfunc(this, &QRasterAnalysis::analysis_task);
analysisTsk->start();
}
QRasterAnalysis::~QRasterAnalysis()
{
if (analysisTsk)
{
if (analysisTsk->isRunning())
{
m_tsk = false;
analysisTsk->stop();
analysisTsk->quit();
analysisTsk->wait();
}
}
}
/*<2A><>ʼ<EFBFBD><CABC>*/
void QRasterAnalysis::init(bool AutoEcho /*= false*/, bool LogData /*= false*/)
{
if (_initdone)
{
return;
}
_AutoEcho = AutoEcho;
_LogData = LogData;
_initdone = true;
}
/*<2A><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>*/
void QRasterAnalysis::SendFrame(Raster_ComFrame m_ComFrame)
{
quint8 *pTxContent, *checksum;
quint16 TxLen;
quint16 crc_sum;
if (!_initdone)
{
init();
}
pTxContent = (quint8 *)malloc(BUFFLEN);
TxLen = 0;
pTxContent[TxLen++] = 0xCA;
pTxContent[TxLen++] = 0x01;
pTxContent[TxLen++] = m_ComFrame.cmd >> 8;
pTxContent[TxLen++] = m_ComFrame.cmd & 0xFF;
pTxContent[TxLen++] = m_ComFrame.len >> 8;
pTxContent[TxLen++] = m_ComFrame.len & 0xFF;
if (m_ComFrame.len)
{
memcpy(&pTxContent[TxLen], m_ComFrame.pData, m_ComFrame.len);
TxLen += m_ComFrame.len;
}
crc_sum = Get_Crc8(&pTxContent[2], TxLen - 2);
pTxContent[TxLen++] = crc_sum >> 8;
pTxContent[TxLen++] = crc_sum & 0xFF;
sendData2COM(TxLen, pTxContent);//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
free(pTxContent);
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źŵ<C5BA><C5B5><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ͳ<EFBFBD>ȥ*/
void QRasterAnalysis::sendData2COM(int size, quint8 *data)
{
QByteArray m_data;
for (int i = 0; i < size; i++)
{
m_data.append(data[i]);
}
emit (pullData2COM(m_data));//<2F><><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>ȥ
}
/*<2A><><EFBFBD>ݽ<EFBFBD><DDBD>ղۺ<D5B2><DBBA><EFBFBD>*/
void QRasterAnalysis::recvDataByCOM(QByteArray data)
{
mMtLock.lock();
requestData.append(data);
mMtLock.unlock();
}
/*<2A><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>߳<EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD><E0B4B4><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void QRasterAnalysis::analysis_task(void)
{
quint8 RxDataIndex;
quint8 RxIndex = 0;
quint16 RxTimeOut = 0;
quint16 RxSum, CalSum;
quint16 RxLen;
quint8 *pRxContent;
Raster_ComFrame m_RxFrame;
pRxContent = (quint8 *)malloc(BUFFLEN);
RxDataIndex = 0;
RxIndex = 0;
CalSum = 0;
while (m_tsk)
{
if (RxTimeOut != 0)
{
RxTimeOut--;
}
else
{
//<2F><><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1>ν<EFBFBD><CEBD><EFBFBD>
RxIndex = 0;
RxDataIndex = 0;
CalSum = 0;
}
quint8 recvdatatemp = 0;
while (this->takeData(recvdatatemp, 1))
{
RxTimeOut = RX_TIMEOUT;
switch (RxIndex)
{
case RX_HEAD1:
{
if (recvdatatemp == 0xF4)
{
RxIndex++;
RxDataIndex = 0;
pRxContent[RxDataIndex++] = recvdatatemp;
}
}
break;
case RX_DEVICE:
m_RxFrame.adr = recvdatatemp;
RxIndex++;
pRxContent[RxDataIndex++] = recvdatatemp;
break;
case RX_CMD:
RxIndex++;
pRxContent[RxDataIndex++] = recvdatatemp;
m_RxFrame.cmd = recvdatatemp;
break;
//-----------------------<2D><><EFBFBD><EFBFBD>Ϊ<EFBFBD>̶<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>------------------------
case RX_LEN1:
{
pRxContent[RxDataIndex++] = recvdatatemp;
RxIndex++;
m_RxFrame.len = recvdatatemp;
if (m_RxFrame.len == 0)//<2F><><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>Ϊ0ʱ<30><CAB1>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
{
RxIndex++;
}
else
{
RxLen = m_RxFrame.len;
}
}
break;
case RX_DATA:
{
pRxContent[RxDataIndex++] = recvdatatemp;
if (!(--RxLen))
{
RxIndex++;
}
}
break;
case RX_SUM1:
{
RxSum = recvdatatemp << 8;
RxIndex++;
}
break;
case RX_SUM2:
{
RxSum += recvdatatemp;
CalSum = Get_Crc8(pRxContent, (m_RxFrame.len + CMDLEN_LEN));
if (RxSum == CalSum)
{
m_RxFrame.pData = pRxContent + CMDLEN_LEN;/*<2A><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ȷ <20><>ִ<EFBFBD><D6B4><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
if (_analysiseupdateFun)
_analysiseupdateFun(m_RxFrame);
else
{
int a = 0;
}
RxTimeOut = 0;//
RxIndex = 0;
RxDataIndex = 0;
}
else
{
RxIndex = 0;
RxDataIndex = 0;
CalSum = 0;
RxTimeOut = 0;
}
break;
}
default:
{
RxIndex = 0;
RxDataIndex = 0;
CalSum = 0;
RxTimeOut = 0;
}
break;
}
}
analysisTsk->msleep(10);
}
if (NULL != pRxContent){
free(pRxContent);
pRxContent = NULL;
}
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
bool QRasterAnalysis::takeData(quint8 &data, int nLen /*= 1*/)
{
mMtLock.lock();
bool bFlag = false;
if (nLen <= getRxDataSize()) {
QByteArray m_temp = requestData.left(nLen);
char *temp = m_temp.data();
quint8 m_data = *temp;
data = *temp;
requestData.remove(0, nLen);
bFlag = true;
}
mMtLock.unlock();
return bFlag;
}
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>fifo<66>еĴ<D0B5>С*/
int QRasterAnalysis::getRxDataSize(void)
{
return this->requestData.size();
}
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>fifo<66>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>*/
QByteArray QRasterAnalysis::getRxBufData(void)
{
return requestData;
}
/*<2A><><EFBFBD><EFBFBD>fifo<66>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>*/
bool QRasterAnalysis::cleanRxDataBuf(void)
{
requestData.clear();
return true;
}
/*CRC8У<38><D0A3>
ptr:ҪУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
len:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:CRC8<EFBFBD><EFBFBD>*/
quint16 Get_Crc8(quint8 *ptr, quint16 len)
{
quint16 crc=0;
quint16 sum=0;
while (len--)
{
crc = crc + (*ptr++);
}
crc = (0xFFFF - crc);
sum = crc >> 8;
return (sum+(crc << 8));
}