2026-04-30 08:23:12 +00:00
|
|
|
|
/**
|
|
|
|
|
|
******************************************************************************
|
|
|
|
|
|
* @file communication.c
|
|
|
|
|
|
* @author TMC Scan Team
|
|
|
|
|
|
* @version V1.0.0
|
|
|
|
|
|
* @date 09/06/2019
|
|
|
|
|
|
* @brief
|
|
|
|
|
|
******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
|
|
|
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
|
|
|
|
* TIME. AS A RESULT, TMC SHALL NOT BE HELD LIABLE FOR ANY
|
|
|
|
|
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
|
|
|
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
|
|
|
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
|
|
|
|
*
|
|
|
|
|
|
* <h2><center>© COPYRIGHT 2016 TMC</center></h2>
|
|
|
|
|
|
******************************************************************************
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
|
|
#include "global.h"
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t gReceiveBuf[MAX_RECEIVE_DATA_LEN]; //USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUF<55><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>256<35>ֽ<EFBFBD>
|
|
|
|
|
|
uint16_t gReceiveLen = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|
|
|
|
|
uint8_t gOutputBuf[MAX_SEND_DATA_LEN]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUF<55><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>2070<37>ֽ<EFBFBD>
|
|
|
|
|
|
uint16_t gOutputLen = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|
|
|
|
|
uint8_t gPackType = PACK_TYPEA;
|
|
|
|
|
|
uint8_t gReceiveKey = 0;
|
|
|
|
|
|
extern uint32_t gFunTrace;
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t RN[30]={0};//random number
|
|
|
|
|
|
uint8_t HEXDIGIT[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
|
|
|
|
|
|
uint8_t BinToCode16(uint8_t *bin,uint8_t *c16,uint8_t len);
|
|
|
|
|
|
|
|
|
|
|
|
#define PACKMAX 250
|
|
|
|
|
|
#define MAXCRYPTWORD ((PACKMAX-6)/4)
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t PackData[PACKMAX];
|
|
|
|
|
|
uint8_t lenPack = 0;
|
|
|
|
|
|
uint8_t packStatus = PACK_RECEIVE_START;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function ClearOutputLen
|
|
|
|
|
|
* @brief clear output len to zero
|
|
|
|
|
|
* @return <EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
void ClearOutputLen()
|
|
|
|
|
|
{
|
|
|
|
|
|
gOutputLen = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function SetOutputData
|
|
|
|
|
|
* @brief set output data into output buffer
|
|
|
|
|
|
* @param[in] pSrcData <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>Դ<EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
* @param[in] uLen <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return <EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
void SetOutputData(uint8_t *pSrcData, uint16_t uLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if((gOutputLen + uLen) > MAX_SEND_DATA_LEN)
|
|
|
|
|
|
{
|
|
|
|
|
|
while(1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if((gOutputLen + uLen) <= MAX_SEND_DATA_LEN)break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(gOutputBuf + gOutputLen, (const uint8_t *)pSrcData, uLen);
|
|
|
|
|
|
gOutputLen += uLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief CryptCmd
|
|
|
|
|
|
* @retval None
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t CryptCmd(uint8_t *cmd,uint8_t len, uint8_t *C)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t T[PACKMAX], *p, lent=0,mlen;
|
|
|
|
|
|
unsigned short P[PACKMAX/2];
|
|
|
|
|
|
|
|
|
|
|
|
if(len>MAXCRYPTWORD)len = MAXCRYPTWORD;
|
|
|
|
|
|
for (int i = 0; i < len; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
C[i] = cmd[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < len; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
P[i] = C[i] * (i + 3) + RN[i%10] * (i + 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
p = (uint8_t *)&P[0];
|
|
|
|
|
|
|
|
|
|
|
|
BinToCode16(p, T, len*2);
|
|
|
|
|
|
|
|
|
|
|
|
mlen = 0;
|
|
|
|
|
|
for (int i = 0; i < len*2; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
C[mlen++] = T[i * 2];
|
|
|
|
|
|
C[mlen++] = T[i * 2 + 1];
|
|
|
|
|
|
}
|
|
|
|
|
|
C[mlen] = 0;
|
|
|
|
|
|
return mlen;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief PackOutputData
|
|
|
|
|
|
* @retval None
|
|
|
|
|
|
*/
|
|
|
|
|
|
void PackOutputData(uint8_t type)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t pack[PACKMAX],i,lenm,C[PACKMAX];
|
|
|
|
|
|
pack[0] = 0x5B;
|
|
|
|
|
|
pack[1] = type;
|
|
|
|
|
|
pack[2] = 0;
|
|
|
|
|
|
if(type==PACK_TYPEA)
|
|
|
|
|
|
{
|
|
|
|
|
|
pack[3] = gOutputLen;
|
|
|
|
|
|
for(i=0;i<gOutputLen;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
pack[i+4] = gOutputBuf[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
pack[gOutputLen+4] = BccCheck(&pack[1], gOutputLen + 3);
|
|
|
|
|
|
pack[gOutputLen+5] = 0x5D;
|
|
|
|
|
|
lenm = gOutputLen+6;
|
|
|
|
|
|
} else if(type==PACK_TYPEB)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
} else if(type==PACK_TYPEC)
|
|
|
|
|
|
{
|
|
|
|
|
|
lenm = CryptCmd(gOutputBuf,gOutputLen,C);
|
|
|
|
|
|
pack[3] = lenm;
|
|
|
|
|
|
for(i=0;i<lenm;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
pack[i+4] = C[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
pack[lenm+4] = BccCheck(&pack[1], lenm + 3);
|
|
|
|
|
|
pack[lenm+5] = 0x5D;
|
|
|
|
|
|
lenm = lenm+6;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else return;
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(gOutputBuf,pack,lenm);
|
|
|
|
|
|
gOutputLen = lenm;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function ReportData
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ͬ<EFBFBD><EFBFBD>ͨ<EFBFBD>Žӿڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return <EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
void ReportData(int barType)
|
|
|
|
|
|
{
|
2026-05-07 15:06:17 +00:00
|
|
|
|
// PackOutputData(gPackType);
|
2026-04-30 08:23:12 +00:00
|
|
|
|
AppUSBSendData(gOutputBuf, gOutputLen);
|
|
|
|
|
|
ClearOutputLen();
|
|
|
|
|
|
SetSysPackType();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function HIDPOSDataSend
|
|
|
|
|
|
* @brief HIDPOSģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD>ʽ
|
|
|
|
|
|
* @param[in] pSrc ָ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param[in] uLen <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return <EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
void HIDPOSDataSend(uint8_t *pSrc, uint16_t uLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t dataoffset = 0;
|
|
|
|
|
|
uint8_t buffer[HIDPOS_BUFLEN];
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>56<35><36><EFBFBD>ֽڣ<D6BD><DAA3>ְ<EFBFBD><D6B0><EFBFBD>
|
|
|
|
|
|
while(uLen > NOTAILLEN)
|
|
|
|
|
|
{
|
|
|
|
|
|
buffer[0] = HIDPOS_SEND_DATA_HEAD;
|
|
|
|
|
|
buffer[1] = HIDPOS_SEND_DATA_MAX_LEN;
|
|
|
|
|
|
Memcpy(&buffer[2], &pSrc[dataoffset], NOTAILLEN);
|
|
|
|
|
|
|
|
|
|
|
|
for(i = 58; i < HIDPOS_BUFLEN - 1; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
buffer[i] = 0x00;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buffer[HIDPOS_BUFLEN - 1] = HIDPOS_RECEIVE_DATA_TAIL_CONTINUE;
|
|
|
|
|
|
AppUSBSendData(buffer, HIDPOS_BUFLEN);
|
|
|
|
|
|
dataoffset += NOTAILLEN;
|
|
|
|
|
|
uLen -= NOTAILLEN;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
buffer[0] = HIDPOS_SEND_DATA_HEAD;
|
|
|
|
|
|
buffer[1] = uLen;
|
|
|
|
|
|
Memcpy(&buffer[2], &pSrc[dataoffset], uLen);
|
|
|
|
|
|
|
|
|
|
|
|
for(i = (uLen + 2); i < HIDPOS_BUFLEN; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
buffer[i] = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AppUSBSendData(buffer, HIDPOS_BUFLEN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function CheckRecieveData
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĺϷ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param[in] pSrc Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param[in] len Դ<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return RECIEVE_OVERMAXLEN <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD>磬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_RECEIVE_DATA_LEN<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* HIDPOS_RECIEVE_REPORTID_ERROR <EFBFBD>ϱ<EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* HIDPOS_RECIEVE_DATALEN_ERROR <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* HIDPOS_RECIEVE_PACKAGEEND_ERROR <EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t CheckRecieveData(HIDPOSReciveData *pOnePackegedata, uint32_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>HIDPOSЭ<53>飬<EFBFBD><E9A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺϷ<DDBA><CFB7><EFBFBD>
|
|
|
|
|
|
if(pOnePackegedata->reportID != HIDPOS_RECEIVE_DATA_HEAD) //<2F><>ͷ
|
|
|
|
|
|
{
|
|
|
|
|
|
return HIDPOS_RECIEVE_REPORTID_ERROR;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(pOnePackegedata->endPackage == HIDPOS_RECEIVE_DATA_TAIL_CONTINUE) //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pOnePackegedata->dataLen != HIDPOS_RECEIBE_DATA_MAX_LEN) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>60
|
|
|
|
|
|
{
|
|
|
|
|
|
return HIDPOS_RECIEVE_DATALEN_ERROR;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return HIDPOS_RECIEVE_CONTINUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pOnePackegedata->endPackage == HIDPOS_RECEIVE_DATA_TAIL_FINISH) //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pOnePackegedata->dataLen > HIDPOS_RECEIBE_DATA_MAX_LEN) //<2F><><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>60
|
|
|
|
|
|
{
|
|
|
|
|
|
return HIDPOS_RECIEVE_DATALEN_ERROR;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return RECIEVE_FINISH;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return HIDPOS_RECIEVE_PACKAGEEND_ERROR;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function VSPRecieveData
|
|
|
|
|
|
* @brief USB<EFBFBD>ӿ<EFBFBD>VSP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t VSPRecieveData(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t len = 0;
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
len = usbVspRecvChars(gReceiveBuf, MAX_RECEIVE_DATA_LEN);
|
|
|
|
|
|
|
|
|
|
|
|
if(len > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
gReceiveLen = len;
|
|
|
|
|
|
return RECIEVE_FINISH;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return RECEIVE_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function HIDPOSRecieveData
|
|
|
|
|
|
* @brief HIDPOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD>յ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĺϷ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return USB_RECIEVE_RIGHT <EFBFBD><EFBFBD>ȷ<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* HIDPOS_RECIEVE_REPORTID_ERROR <EFBFBD>ϱ<EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* HIDPOS_RECIEVE_DATALEN_ERROR <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* HIDPOS_RECIEVE_PACKAGEEND_ERROR <EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t HIDPOSRecieveData(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t status;
|
|
|
|
|
|
uint8_t buffer[HIDPOS_BUFLEN]; //<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>HIDPOS<4F><53><EFBFBD><EFBFBD>Э<EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>ݰ<EFBFBD><DDB0>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD>ΪHIDPOS_BUFLEN
|
|
|
|
|
|
uint32_t len = 0;
|
|
|
|
|
|
HIDPOSReciveData *pReceivedata = (HIDPOSReciveData *)buffer;
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
len = usbHidPosRecvChars(buffer, HIDPOS_BUFLEN);
|
|
|
|
|
|
|
|
|
|
|
|
if(len > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
//step1<70><31><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>ĺϷ<C4BA><CFB7><EFBFBD>
|
|
|
|
|
|
status = CheckRecieveData(pReceivedata, len);
|
|
|
|
|
|
|
|
|
|
|
|
if((status != RECIEVE_FINISH) && (status != HIDPOS_RECIEVE_CONTINUE))
|
|
|
|
|
|
{
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if((gReceiveLen + pReceivedata->dataLen) > MAX_RECEIVE_AVAILABLE_DATA_LEN) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
gReceiveLen = 0;
|
|
|
|
|
|
return RECIEVE_OVERMAXLEN;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(gReceiveBuf + gReceiveLen, pReceivedata->dataBlock, pReceivedata->dataLen);
|
|
|
|
|
|
gReceiveLen += pReceivedata->dataLen;
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return RECEIVE_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief Code16ToBin
|
|
|
|
|
|
* @retval
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t Code16ToBin(uint8_t *c16,uint8_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t i,c;
|
|
|
|
|
|
for( i=0;i<len;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
c = c16[i*2];
|
|
|
|
|
|
if(c>='0' && c<='9')c -='0';
|
|
|
|
|
|
else if(c>='A' &&c<='F') c -=('A'-10);
|
|
|
|
|
|
else if(c>='a' &&c<='f') c -=('a'-10);
|
|
|
|
|
|
else return 0;
|
|
|
|
|
|
c16[i] = (c<<4);
|
|
|
|
|
|
c = c16[i*2+1];
|
|
|
|
|
|
if(c>='0' && c<='9')c -='0';
|
|
|
|
|
|
else if(c>='A' &&c<='F') c -=('A'-10);
|
|
|
|
|
|
else if(c>='a' &&c<='f') c -=('a'-10);
|
|
|
|
|
|
else return 0;
|
|
|
|
|
|
c16[i]+= c;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief BinToCode16
|
|
|
|
|
|
* @retval
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t BinToCode16(uint8_t *bin,uint8_t *c16,uint8_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t i,c;
|
|
|
|
|
|
for(i=0;i<len;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
c = (bin[i]>>4)&0x0f;
|
|
|
|
|
|
c16[i*2] = HEXDIGIT[c];
|
|
|
|
|
|
c = bin[i]&0x0f;
|
|
|
|
|
|
c16[i*2+1] = HEXDIGIT[c];
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
c16[len*2] = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief DecodeACommand
|
|
|
|
|
|
* @retval
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t DecodeACommand(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t i;
|
|
|
|
|
|
|
|
|
|
|
|
lenPack = (PackData[2]<<8)|PackData[3];
|
|
|
|
|
|
|
|
|
|
|
|
if(lenPack>246)
|
|
|
|
|
|
{
|
|
|
|
|
|
lenPack = 0;
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
for(i=0;i<lenPack;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
PackData[i] = PackData[i+4];
|
|
|
|
|
|
}
|
|
|
|
|
|
PackData[lenPack] = 0;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief DecodeBCommand
|
|
|
|
|
|
* @retval
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t DecodeBCommand(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t i,*p,S[10],T[20];
|
|
|
|
|
|
uint16_t *p16;
|
|
|
|
|
|
|
|
|
|
|
|
p = &PackData[4];
|
|
|
|
|
|
for(i=0;i<10;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
S[i] = p[i*3];
|
|
|
|
|
|
T[i*2] = p[i*3+1];
|
|
|
|
|
|
T[i*2+1] = p[i*3+2];
|
|
|
|
|
|
}
|
|
|
|
|
|
lenPack = 0;
|
|
|
|
|
|
if(!Code16ToBin(S,5))return 0;
|
|
|
|
|
|
if(!Code16ToBin(T,10))return 0;
|
|
|
|
|
|
for(i=0;i<5;i++)RN[i] = S[i];
|
|
|
|
|
|
for(i=10;i<20;i++)RN[i] = RN[i-10];
|
|
|
|
|
|
for(i=20;i<30;i++)RN[i] = RN[i-20];
|
|
|
|
|
|
|
|
|
|
|
|
for(i=0;i<5;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
p16 = (uint16_t *)&T[i*2];
|
|
|
|
|
|
PackData[i] = (*p16 - RN[i%10]*(i+2))/(i+3);
|
|
|
|
|
|
}
|
|
|
|
|
|
PackData[5] = 0;
|
|
|
|
|
|
lenPack = 5;
|
|
|
|
|
|
gReceiveKey = 1;
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief DecodeCCommand
|
|
|
|
|
|
* @retval
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t DecodeCCommand(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t i,*p,T[PACKMAX],rlen;
|
|
|
|
|
|
uint16_t *p16;
|
|
|
|
|
|
|
|
|
|
|
|
lenPack = 0;
|
|
|
|
|
|
rlen = (PackData[2]<<8)|PackData[3];
|
|
|
|
|
|
if(rlen>PACKMAX-6)return 0;
|
|
|
|
|
|
p = &PackData[4];
|
|
|
|
|
|
for(i=0;i<rlen;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
T[i] = p[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
rlen = rlen/4;
|
|
|
|
|
|
|
|
|
|
|
|
if(!Code16ToBin(T,rlen*2))return 0;
|
|
|
|
|
|
|
|
|
|
|
|
for(i=0;i<rlen;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
p16 = (uint16_t *)&T[i*2];
|
|
|
|
|
|
PackData[i] = (*p16 - RN[i%10]*(i+2))/(i+3);
|
|
|
|
|
|
}
|
|
|
|
|
|
PackData[rlen] = 0;
|
|
|
|
|
|
lenPack = rlen;
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t GetPackData()
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t *p = gReceiveBuf;
|
|
|
|
|
|
uint16_t len = gReceiveLen;
|
|
|
|
|
|
gReceiveLen = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if(packStatus==PACK_RECEIVE_START)
|
|
|
|
|
|
{
|
|
|
|
|
|
while(*p!=UART_PROTOCOL_STX_VALUE&&len>0)
|
|
|
|
|
|
{
|
|
|
|
|
|
p++;
|
|
|
|
|
|
len--;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(len==0)return 0;
|
|
|
|
|
|
packStatus = PACK_RECEIVE_DATA;
|
|
|
|
|
|
lenPack = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(packStatus==PACK_RECEIVE_DATA){
|
|
|
|
|
|
while(*p!=UART_PROTOCOL_ETX_VALUE&&len>0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(*p==UART_PROTOCOL_STX_VALUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
lenPack = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
PackData[lenPack++] = *p++;
|
|
|
|
|
|
len--;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(len==0)return 1;
|
|
|
|
|
|
PackData[lenPack++] = *p++;
|
|
|
|
|
|
}
|
|
|
|
|
|
packStatus = PACK_RECEIVE_START;
|
|
|
|
|
|
return 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @function RecieveData
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ͬͨѶ<EFBFBD>ӿڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param[in] pRecievedata <EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t RecieveData(BarData *pRecievedata)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t status;
|
|
|
|
|
|
|
|
|
|
|
|
gFunTrace = 34;
|
|
|
|
|
|
status = VSPRecieveData();
|
|
|
|
|
|
|
|
|
|
|
|
if((status == RECIEVE_FINISH) && (gReceiveLen>0))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
status = GetPackData();
|
|
|
|
|
|
if(status==0)
|
|
|
|
|
|
{
|
|
|
|
|
|
gReceiveLen = 0;
|
|
|
|
|
|
gOutputLen = 0;
|
|
|
|
|
|
SetPackType(PACK_TYPEA);
|
|
|
|
|
|
SetOutputData((uint8_t *)"ILLEGALCMD", 10);
|
|
|
|
|
|
ReportData(Communication_Id);
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(status==1)return FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
pRecievedata->packType = PackData[1];
|
|
|
|
|
|
if(PackData[0]==UART_PROTOCOL_STX_VALUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t len;
|
|
|
|
|
|
len = (PackData[2]<<8)|PackData[3];
|
|
|
|
|
|
|
|
|
|
|
|
if(BccCheck(&PackData[1],len+3)==PackData[len+4])
|
|
|
|
|
|
{
|
|
|
|
|
|
if(PackData[1]==PACK_TYPEA)
|
|
|
|
|
|
{
|
|
|
|
|
|
DecodeACommand();
|
|
|
|
|
|
} else
|
|
|
|
|
|
if(PackData[1]==PACK_TYPEB)
|
|
|
|
|
|
{
|
|
|
|
|
|
DecodeBCommand();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(PackData[1]==PACK_TYPEC)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(gReceiveKey==0)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetPackType(PACK_TYPEA);
|
|
|
|
|
|
SetOutputData((uint8_t *)"NOKEY", 5);
|
|
|
|
|
|
ReportData(Communication_Id);
|
|
|
|
|
|
gReceiveLen = 0;
|
|
|
|
|
|
gOutputLen = 0;
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
DecodeCCommand();
|
|
|
|
|
|
}
|
|
|
|
|
|
} else
|
|
|
|
|
|
{
|
|
|
|
|
|
SetPackType(PACK_TYPEA);
|
|
|
|
|
|
SetOutputData((uint8_t *)"ILLEGALCMD", 10);
|
|
|
|
|
|
ReportData(Communication_Id);
|
|
|
|
|
|
gReceiveLen = 0;
|
|
|
|
|
|
gOutputLen = 0;
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(lenPack==0)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetPackType(PACK_TYPEA);
|
|
|
|
|
|
SetOutputData((uint8_t *)"ILLEGALCMD", 10);
|
|
|
|
|
|
ReportData(Communication_Id);
|
|
|
|
|
|
gOutputLen = 0;
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>BarData<74>ṹ<EFBFBD><E1B9B9><EFBFBD>У<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>Ϊ<EFBFBD>˺<EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
pRecievedata->bardata = PackData;
|
|
|
|
|
|
pRecievedata->bartype = Communication_Id; //<2F><>ɨ<EFBFBD><C9A8>ID<49><44>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>𣬿<EFBFBD><F0A3ACBF><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBBB9>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
pRecievedata->datalen = lenPack;
|
|
|
|
|
|
pRecievedata->barinfo = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>&<26><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
|
|
|
|
|
|
gReceiveLen = 0;
|
|
|
|
|
|
gOutputLen = 0;
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|