optical/NxFuncs/comm/ocom.c

272 lines
4.2 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#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;
}