optical/NxFuncs/comm/ocom.c
2025-09-04 09:45:08 +08:00

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 // 单次最大扫描个数
#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; // 扫描字节计数器
pDat = (OComPacket *)rdBuf;
do
{
len = funs->GetRsvLen();
if (len < LEN_OCOM_PKT)
{
rslt = -3;
break; // 没有足够数据
}
phase = 0;
rslt = 0;
// 从接收缓冲区中找数据包
while(((len + phase) >= LEN_OCOM_PKT) && (phase < LEN_OCOM_PKT))
{
if (phase == 0 && i > MAX_OCOM_SCAN)
{
rslt = -4;
break; // 查找同步序列超出最大单次扫描字节数
}
rslt = funs->GetOComData(&temp, 1); // 读取一个字节
if (rslt != 1)
{
printf("error at GetOComData rslt\r\n");
rslt = -8;
break;
}
rslt = 0;
i++; // 扫描字数增加
len--; // 剩余长度减小
if (phase < DC_SYNC_LEN) // 识别同步序列
{
if (temp != OCOM_SYNC[phase])
{
phase = 0;
rslt = 0;
break;
}
}
pDat->buff.normal[phase] = temp; // 保存
phase++;
}
if (rslt != 0)
{
break;
}
if (phase >= LEN_OCOM_PKT) // 得到数据包
{
u16 check;
check = CalcCheckSum(&(pDat->buff.normal[DC_SYNC_LEN]), DC_CHECK_LEN);
if (check == pDat->normal.check)
{
// 得到正确数据包
memcpy(pPacket, pDat, LEN_OCOM_PKT);
// printf("GetANormalPacket ok\r\n");
rslt = LEN_OCOM_PKT;
break;
}
else
{
// CRC 不正确
printf("1. crc error in GetANormalPacket\r\n");
// 拷贝需要再判断的数据
// continue;
}
}
else
{
// 没有找到同步序列的情况
// 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; // 没有足够数据
}
rslt = 0;
rslt = funs->GetOComData(pDat, exlen); // 读取数据
if (rslt != exlen)
{
printf("error at GetOComData rslt=%d\r\n", rslt);
rslt = -8;
break;
}
rslt = funs->GetOComData((u8*)(&getcrc), 2); // 读取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)
{
// 得到正确数据包
// printf("GetOComExData ok\r\n");
rslt = exlen;
break;
}
else
{
// CRC 不正确
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;
}