272 lines
4.2 KiB
C
272 lines
4.2 KiB
C
|
|
|
|||
|
|
#define _IN_OCOM_C
|
|||
|
|
#include "ocom.h"
|
|||
|
|
#include "crc16.h"
|
|||
|
|
|
|||
|
|
void ReadOComBuffEmpty(OComExFuns * funs)
|
|||
|
|
{
|
|||
|
|
int rslt, len;
|
|||
|
|
u8 temp;
|
|||
|
|
|
|||
|
|
len = funs->GetRsvLen();
|
|||
|
|
|
|||
|
|
while (len > 0)
|
|||
|
|
{
|
|||
|
|
rslt = funs->GetOComData(&temp, 1);
|
|||
|
|
if (rslt != 1)
|
|||
|
|
{
|
|||
|
|
rslt = 0;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
len--;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#ifndef MAX_OCOM_SCAN
|
|||
|
|
#define MAX_OCOM_SCAN 128 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
int GetAOComPacket(OComExFuns * funs, OComPacket * pPacket)
|
|||
|
|
{
|
|||
|
|
int rslt, len;
|
|||
|
|
int i;
|
|||
|
|
int phase;
|
|||
|
|
|
|||
|
|
u8 temp;
|
|||
|
|
u8 rdBuf[LEN_OCOM_PKT];
|
|||
|
|
OComPacket * pDat;
|
|||
|
|
|
|||
|
|
if (funs == NULL || pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
i = 0; // ɨ<><C9A8><EFBFBD>ֽڼ<D6BD><DABC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
pDat = (OComPacket *)rdBuf;
|
|||
|
|
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
len = funs->GetRsvLen();
|
|||
|
|
|
|||
|
|
if (len < LEN_OCOM_PKT)
|
|||
|
|
{
|
|||
|
|
rslt = -3;
|
|||
|
|
break; // û<><C3BB><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
phase = 0;
|
|||
|
|
rslt = 0;
|
|||
|
|
|
|||
|
|
// <20>ӽ<EFBFBD><D3BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
while(((len + phase) >= LEN_OCOM_PKT) && (phase < LEN_OCOM_PKT))
|
|||
|
|
{
|
|||
|
|
if (phase == 0 && i > MAX_OCOM_SCAN)
|
|||
|
|
{
|
|||
|
|
rslt = -4;
|
|||
|
|
break; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = funs->GetOComData(&temp, 1); // <20><>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
if (rslt != 1)
|
|||
|
|
{
|
|||
|
|
printf("error at GetOComData rslt\r\n");
|
|||
|
|
rslt = -8;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = 0;
|
|||
|
|
i++; // ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
len--; // ʣ<><EFBFBD>ȼ<EFBFBD>С
|
|||
|
|
|
|||
|
|
if (phase < DC_SYNC_LEN) // ʶ<><CAB6>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (temp != OCOM_SYNC[phase])
|
|||
|
|
{
|
|||
|
|
phase = 0;
|
|||
|
|
rslt = 0;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pDat->buff.normal[phase] = temp; // <20><><EFBFBD><EFBFBD>
|
|||
|
|
phase++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rslt != 0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (phase >= LEN_OCOM_PKT) // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
u16 check;
|
|||
|
|
check = CalcCheckSum(&(pDat->buff.normal[DC_SYNC_LEN]), DC_CHECK_LEN);
|
|||
|
|
if (check == pDat->normal.check)
|
|||
|
|
{
|
|||
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
memcpy(pPacket, pDat, LEN_OCOM_PKT);
|
|||
|
|
// printf("GetANormalPacket ok\r\n");
|
|||
|
|
rslt = LEN_OCOM_PKT;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// CRC <20><><EFBFBD><EFBFBD>ȷ
|
|||
|
|
printf("1. crc error in GetANormalPacket\r\n");
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>жϵ<D0B6><CFB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// û<><C3BB><EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// continue;
|
|||
|
|
}
|
|||
|
|
}while(1);
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int GetOComExData(OComExFuns * funs, u8 * pBuff, int exlen)
|
|||
|
|
{
|
|||
|
|
int rslt, len;
|
|||
|
|
u16 getcrc;
|
|||
|
|
|
|||
|
|
if (funs == NULL || pBuff == NULL || exlen <= 0)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
u8 * pDat = (u8 *)pBuff;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
len = funs->GetRsvLen();
|
|||
|
|
if (len < exlen + 2)
|
|||
|
|
{
|
|||
|
|
rslt = -3;
|
|||
|
|
break; // û<><C3BB><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = 0;
|
|||
|
|
|
|||
|
|
rslt = funs->GetOComData(pDat, exlen); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if (rslt != exlen)
|
|||
|
|
{
|
|||
|
|
printf("error at GetOComData rslt=%d\r\n", rslt);
|
|||
|
|
rslt = -8;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = funs->GetOComData((u8*)(&getcrc), 2); // <20><>ȡcrc
|
|||
|
|
if (rslt != 2)
|
|||
|
|
{
|
|||
|
|
printf("error at GetOComData rslt=%d\r\n", rslt);
|
|||
|
|
rslt = -9;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
u16 check;
|
|||
|
|
|
|||
|
|
check = CalcCheckSum(pDat, exlen);
|
|||
|
|
if (check == getcrc)
|
|||
|
|
{
|
|||
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
// printf("GetOComExData ok\r\n");
|
|||
|
|
rslt = exlen;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// CRC <20><><EFBFBD><EFBFBD>ȷ
|
|||
|
|
printf("2. crc error in GetOComExData\r\n");
|
|||
|
|
rslt = -7;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}while (0);
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int SendAOComPacket(OComExFuns * funs, OComPacket * pPacket)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
int freelen, sendlen;
|
|||
|
|
|
|||
|
|
if (funs == NULL || pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
sendlen = LEN_OCOM_PKT;
|
|||
|
|
|
|||
|
|
freelen = funs->GetTrsFreeLen();
|
|||
|
|
|
|||
|
|
if (freelen < sendlen)
|
|||
|
|
{
|
|||
|
|
// printf("buff is full in SendAOComPacket\r\n");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = funs->SendOComData(pPacket->buff.normal, sendlen);
|
|||
|
|
if (rslt != sendlen)
|
|||
|
|
{
|
|||
|
|
printf("error at call SendOComData, rslt=%d\r\n", rslt);
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int SendOComExData(OComExFuns * funs, u8 * pBuff, int exlen)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
int freelen, sendlen;
|
|||
|
|
u16 check;
|
|||
|
|
|
|||
|
|
if (funs == NULL || pBuff == NULL || exlen <= 0)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
sendlen = exlen;
|
|||
|
|
|
|||
|
|
freelen = funs->GetTrsFreeLen();
|
|||
|
|
|
|||
|
|
if (freelen < sendlen + 2)
|
|||
|
|
{
|
|||
|
|
// printf("buff is full in SendOComExData\r\n");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = funs->SendOComData(pBuff, sendlen);
|
|||
|
|
if (rslt != sendlen)
|
|||
|
|
{
|
|||
|
|
printf("error at call SendOComData, rslt=%d\r\n", rslt);
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
check = CalcCheckSum(pBuff, sendlen);
|
|||
|
|
rslt = funs->SendOComData((u8*)(&check), 2);
|
|||
|
|
if (rslt != 2)
|
|||
|
|
{
|
|||
|
|
printf("error at call SendOComData, rslt=%d\r\n", rslt);
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int PacketAOCom(OComPacket * pPacket)
|
|||
|
|
{
|
|||
|
|
if (pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memcpy(pPacket->normal.sync, OCOM_SYNC, DC_SYNC_LEN);
|
|||
|
|
pPacket->normal.check = CalcCheckSum(&(pPacket->buff.normal[DC_SYNC_LEN]), DC_CHECK_LEN);
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
|
|||
|
|
}
|