optical/NxFuncs/comm/comm.c

462 lines
9.1 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#define _IN_COMM_C
#include "comm.h"
#include "crc16.h"
//--------------------------------------------------------------------------------------------------
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
int ReadBuffEmpty(DataExFuns * funs)
{
int rslt, len;
int rdlen;
#define ONCE_READ 16
u8 tempbuf[ONCE_READ];
len = funs->GetRsvLen();
while (len > 0)
{
if (len < ONCE_READ)
{
rdlen = len;
}
else
{
rdlen = ONCE_READ;
}
rslt = funs->GetCommData(tempbuf, rdlen);
if (rslt <= 0)
{
rslt = 0;
break;
}
len -= rslt;
}
return len;
}
//--------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>: <20><>ͨѶ<CDA8>ڽ<EFBFBD><DABD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еõ<D0B5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>,
// ֻ<><D6BB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ݰ<EFBFBD><DDB0>ṹ. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ô<EFBFBD><C3B4>Ҫ<EFBFBD><D2AA> GetExCommData <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
// <20><><EFBFBD><EFBFBD>: pPacket, <20><><EFBFBD>ݰ<EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>: >=0, <20>ɹ<EFBFBD>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ϳɱ䳤<C9B1><E4B3A4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -2, CRC<52><43><EFBFBD><EFBFBD>
// -3, <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
// -4, û<><C3BB><EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -5<><35><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD>ʱ
// -6, <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -7, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRC<52><43><EFBFBD><EFBFBD>
// -8, <20><><EFBFBD><EFBFBD>δ֪<CEB4><D6AA><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷȡ<C8B7><C8A1><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
#define MAX_TCP_PACKET 1500
typedef struct
{
int len; // <20>Ѷ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
u8 buff[LEN_NORMAL_PACKET+MAX_TCP_PACKET]; // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
}GetPacketCtrl;
GetPacketCtrl g_gtpCtrl = {0};
#define MAX_ONCE_SCAN (LEN_NORMAL_PACKET) // һ<><D2BB>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
/*
* return: -1,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* -2,CRCУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* -3,û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int GetANormalPacket(DataExFuns * funs, DataPacket * pPacket)
{
int rslt, len;
int i;
int phase;
int status; // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1,FLDP 2,VLDP
int exlen;
int begidx;
u8 temp;
u8 rdBuf[LEN_NORMAL_PACKET];
DataPacket * pDat = (DataPacket *)(rdBuf);
if (funs == NULL || pPacket == NULL)
{
return -1;
}
// <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (g_gtpCtrl.len < LEN_NORMAL_PACKET + MAX_EXDP_LEN)
{
len = funs->GetRsvLen(); // <20><>ȡ<EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
if (len <= 0)
{
rslt = -3; // û<><C3BB><EFBFBD><EFBFBD><E3B9BB><EFBFBD><EFBFBD>
}
else
{
if (len + g_gtpCtrl.len <= MAX_TCP_PACKET)
{
rslt = funs->GetCommData(&(g_gtpCtrl.buff[g_gtpCtrl.len]), len); // <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
// printf("Get a big packet, len=%d\r\n", len);
rslt = funs->GetCommData(&(g_gtpCtrl.buff[g_gtpCtrl.len]), MAX_TCP_PACKET-g_gtpCtrl.len); // <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
g_gtpCtrl.len += rslt; // ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// printf("load a packet to buff, len=%d, buflen=%d\r\n", len, g_gtpCtrl.len);
}
}
len = g_gtpCtrl.len;
if (len < LEN_NORMAL_PACKET)
{
rslt = -3;
return rslt; // û<><C3BB><EFBFBD><EFBFBD><E3B9BB><EFBFBD><EFBFBD>
}
i = 0; // ɨ<><C9A8><EFBFBD>ֽڼ<D6BD><DABC><EFBFBD><EFBFBD><EFBFBD>
begidx = 0; // <20><>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
phase = 0;
status = 0;
rslt = 0;
while(phase < LEN_NORMAL_PACKET)
{
if (phase == 0 && i > MAX_ONCE_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>
}
if (i < g_gtpCtrl.len)
{
temp = g_gtpCtrl.buff[i];
i++; // ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
// printf("data not enough\r\n");
rslt = -3; // <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
break;
}
pDat->buff.normal[phase] = temp; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (phase < DP_SYNC_LEN) // ʶ<><CAB6>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (phase == 0)
{
if (temp == FLDP_SYNC[0])
{
begidx = i-1;
status = 1;
}
else if (temp == VLDP_SYNC[0])
{
begidx = i-1;
status = 2;
}
else
{
begidx = i;
status = 0;
phase = 0;
rslt = 0; // <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
continue;
}
}
else
{
if (status == 1)
{
if (temp != FLDP_SYNC[phase]) // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
{
begidx = 0;
status = 0;
phase = 0;
rslt = 0;
continue;
}
}
else if (status == 2)
{
if (temp != VLDP_SYNC[phase]) // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
{
begidx = 0;
status = 0;
phase = 0;
rslt = 0;
continue;
}
}
else
{
begidx = 0;
status = 0;
phase = 0;
rslt = -8;
printf("1. error status in GetANormalPacket\r\n");
break;
}
}
}
phase++;
}
if (phase >= LEN_NORMAL_PACKET) // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
{
u16 crc;
crc = CalcCrc16(pDat->normal.content, DP_CONT_LEN);
if (crc == pDat->normal.crc)
{
// <20>õ<EFBFBD><C3B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD>
memcpy(pPacket, pDat, LEN_NORMAL_PACKET);
// printf("GetANormalPacket ok\r\n");
rslt = LEN_NORMAL_PACKET;
}
else
{
// CRC <20><><EFBFBD><EFBFBD>ȷ
begidx = i;
printf("2. crc error in GetANormalPacket\r\n");
rslt = -2;
}
}
if (rslt == LEN_NORMAL_PACKET) // <20><>ȷ<EFBFBD>õ<EFBFBD>
{
if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0) // <20>ǿɱ䳤<C9B1><E4B3A4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD> vldp
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
exlen = pPacket->vldp.exlen;
if (exlen > MAX_EXDP_LEN)
{
begidx += LEN_NORMAL_PACKET+exlen;
printf("data exlen error, len=%d\r\n", exlen);
rslt = -6; // <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else if (exlen == 0)
{
begidx += LEN_NORMAL_PACKET;
rslt = LEN_NORMAL_PACKET;
}
else if (exlen + LEN_NORMAL_PACKET > g_gtpCtrl.len)
{
// <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>, <20><>ʱ<EFBFBD>˳<EFBFBD>
// printf("exdata not enough, exlen=%d, g_gtpCtrl.len=%d\r\n", exlen, g_gtpCtrl.len);
rslt = -3; // <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
else
{
// 20240606 ljs <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
#if (1)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>CRCУ<43><D0A3>(1k<31>ֽ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ʱԼ1ms)
u16 crc;
crc = CalcCrc16(&g_gtpCtrl.buff[i], exlen);
if (crc == pDat->vldp.excrc)
{
memcpy(pPacket->buff.exData, &(g_gtpCtrl.buff[i]), exlen); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (exlen < MAX_EXDP_LEN)
{
pPacket->buff.exData[exlen] = 0;
}
rslt = LEN_NORMAL_PACKET+exlen;
}
else
{
printf("3. excrc error in GetANormalPacket\r\n");
rslt = -2;
}
begidx += LEN_NORMAL_PACKET+exlen;
#else
begidx += LEN_NORMAL_PACKET+exlen;
memcpy(pPacket->buff.exData, &(g_gtpCtrl.buff[i]), exlen); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (exlen < MAX_EXDP_LEN)
{
pPacket->buff.exData[exlen] = 0;
}
rslt = LEN_NORMAL_PACKET+exlen;
#endif
}
}
else
{
begidx += LEN_NORMAL_PACKET; // <20>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
}
}
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ǰ<EFBFBD><C7B0>
if (begidx > 0 && begidx <= g_gtpCtrl.len)
{
if (begidx < g_gtpCtrl.len)
{
// printf("copy data, begidx=%d, len=%d\r\n", begidx, (g_gtpCtrl.len - begidx));
memcpy(&(g_gtpCtrl.buff[0]), &g_gtpCtrl.buff[begidx], (g_gtpCtrl.len - begidx));
}
g_gtpCtrl.len -= begidx;
begidx = 0;
}
else if (begidx < 0)
{
printf("beginidx < 0\r\n");
}
else if (begidx > g_gtpCtrl.len)
{
g_gtpCtrl.len = 0;
printf("begidx=%d > g_gtpCtrl.len=%d, set g_gtpCtrl.len = 0\r\n", begidx, g_gtpCtrl.len);
}
else
{
}
return rslt;
}
//--------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD>, ͨ<><CDA8>ͨѶ<CDA8>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>: pPacket, <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>Ѿ<EFBFBD><D1BE><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ֶΡ<D6B6>
// <20><><EFBFBD><EFBFBD>:
// 0, <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>, <20><><EFBFBD>ӵ<EFBFBD><D3B5>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD>
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -2<><32><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
// 1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>
int SendAPacket(DataExFuns * funs, DataPacket * pPacket, int waittime)
{
int rslt;
int freelen, sendlen;
if (pPacket == NULL)
{
return -1;
}
if (memcmp(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN) == 0)
{
sendlen = LEN_NORMAL_PACKET;
}
else if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0)
{
sendlen = LEN_NORMAL_PACKET + pPacket->vldp.exlen;
}
else
{
printf("para err, not a corrected packet\r\n");
return -1;
}
rslt = 0;
do
{
freelen = funs->GetTrsFreeLen();
if (freelen <= 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
{
// printf("error at call GetTrsFreeLen, freelen=%d\r\n", freelen);
rslt = -2;
break;
}
if (freelen >= sendlen)
{
break;
}
waittime--;
if (waittime <= 0)
{
rslt = 1;
// printf("buff is full in SendAPacket, timout\r\n");
break;
}
if (funs->Delay != NULL)
{
funs->Delay(1);
}
}while(1);
if (rslt == 0)
{
rslt = funs->SendCommData(pPacket->datbuff, sendlen);
if (rslt != sendlen)
{
printf("error at call SendCommData, rslt=%d\r\n", rslt);
return -2;
}
}
else
{
//printf("error:Not SendCommData\r\n");
}
return 0;
}
//--------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD>:
// pPacket, <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>sync<6E><63>crc<72>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>:
// 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int PacketAFLDP(DataPacket * pPacket)
{
if (pPacket == NULL)
{
return -1;
}
memcpy(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN);
pPacket->normal.crc = CalcCrc16(pPacket->normal.content, DP_CONT_LEN);
return 0;
}
//--------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ɱ䳤<C9B1><E4B3A4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD>: pPacket, <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> SYNC EXLEN EXCRC <20><> EXDAT <20>Ȳ<EFBFBD><C8B2><EFBFBD>
// pExdat, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
// exlen<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>Ϊ0
// <20><><EFBFBD><EFBFBD>:
// 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -2<><32>
int PacketAVLDP(DataPacket * pPacket, const u8 * pExdat, u16 exlen)
{
if (pPacket == NULL)
{
return -1;
}
if (pExdat == NULL)
{
exlen = 0;
}
memcpy(pPacket->vldp.sync, VLDP_SYNC, DP_SYNC_LEN);
pPacket->vldp.exlen = exlen;
pPacket->vldp.excrc = CalcCrc16(pExdat, exlen);
pPacket->vldp.crc = CalcCrc16(pPacket->normal.content, DP_CONT_LEN);
if (exlen != 0 && pPacket->vldp.exData != pExdat)
{
memcpy(pPacket->vldp.exData, pExdat, exlen);
}
return 0;
}
//--------------------------------------------------------------------------------------------------