|
|
|
|
|
#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));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|