📄 sendlnk.c
字号:
/******************************
Name:SendLnk.c
Descript:完成发送数据打包
By:Lms
Date:2003/02/14
*******************************/
#include "SendLnkData.h"
uchar SendLnk_Encrypt(uchar type,int BitLen,uchar *Src) // 信息加密打包
{
uchar tmp_buf[256];
uchar tmp;
int StartShift,i,j;
if((BitLen>1680)||(EncrypGetSamSta()!=OK))
return(ERROR);
tmp_buf[0]=OSendLnk_ID[0]; // 出站ID
tmp_buf[1]=OSendLnk_ID[1];
tmp_buf[2]=OSendLnk_ID[2];
tmp_buf[3]=(OSendLnk_Data.FrameNo>>8); // 入站分帧号
tmp_buf[4]=(OSendLnk_Data.FrameNo&0xff);
tmp=BitLen;
if(OSendLnk_Data.UserChar&0x4)
tmp+=22; //22bit认证码
if(type!=EncryptNormal)
tmp+=21; //21bit地址码
if(type==EncryptTrue)
tmp+=48;
tmp_buf[5]=(tmp>>8); // 比特位长
tmp_buf[5]&=0x7;
if(type==EncryptTrue) // 需加密
tmp_buf[5]|=0x80;
tmp_buf[6]=(tmp&0xff);
tmp_buf[7]=0;
if(BitLen%8)
j=(8-(BitLen%8)); // 高位补k个0
else
j=0;
j+=56;
if(type==EncryptNormal)
StartShift=0;
else
{
StartShift=21;
tmp=*Src++;
tmp<<=5;
}
for(i=StartShift;i<BitLen+StartShift;i++)
{
if((i%8)==0)
tmp=*Src++;
if((j%8)==0)
tmp_buf[j/8]=0;
if(tmp&0x80)
tmp_buf[j/8]|=OSendLnk_BitMask[j%8];
tmp<<=1;
j++;
}
j>>=3;
return(EncryptLnk_Pack(2,j,tmp_buf)); // 加密信息打包
}
void SendPack_Head(uchar *p)
{
int i,j,k;
uchar tmp;
OSendLnk_Buf.BitLen=0;
tmp=*p++;
tmp<<=13;
i=0;
j=0;
k=0;
for(i=0;i<37;i++)
{
if((OSendLnk_Buf.BitLen%8)==0)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]=0;
if(j==OSendLnk_Mask[k])
{
j=0;
tmp=*p++;
k++;
tmp<<=(16-OSendLnk_Mask[k]);
}
if(tmp&0x8000)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]|=OSendLnk_BitMask[OSendLnk_Buf.BitLen%8];
tmp<<=1;
OSendLnk_Buf.BitLen++;
j++;
}
}
uchar SendLnk_Pack(uchar message)
{
struct CmdDataStruct *ps;
uchar *p;
int TelBitLen;
uchar tmp;
int i,j;
if(message!=LnkPackEvent)
return(ERROR);
SysTimer_Release(FrameErrorEvent);
if(OSendLnk_Buf.Done==TRUE)
return(ERROR);
ps=GetApp_Data();
if(ps==NULL)
return(ERROR);
if(EncrypGetSamSta()!=OK) //无Sam卡或卡出错,2003/07/14
{
if((OSendLnk_Data.UserChar&0x4)||(OSendLnk_Data.Encrypt==EncryptTrue))
return(ERROR);
}
OSendLnk_Data.FrameNo=Phy_GetFrameNo();
OSendLnk_Data.FrameNo+=4;
OSendLnk_Data.FrameNo%=1921;
if(OSendLnk_Data.FrameNo<4)
OSendLnk_Data.FrameNo++;
OSendLnk_Data.Bsh=Lock_MainBshGet()+1;
OSendLnk_EncrypFlag=FALSE;
OSendLnk_Data.InfoType=ps->InfoType;
OSendLnk_Data.BitLen=ps->BitLen;
TelBitLen=ps->BitLen;
if(OSendLnk_Data.UserChar&0x4) // 有身份认证
OSendLnk_Data.BitLen+=22;
OSendLnk_Buf.Done=FALSE;
p=&OSendLnk_Data.UserChar;
if(((OSendLnk_Data.InfoType&0x68)==0x40)&&(OSendLnk_Data.Encrypt==EncryptTrue)) // 通信
{
OSendLnk_Data.BitLen+=48; // 密钥48bit
OSendLnk_EncrypFlag=TRUE;
TelBitLen=21;
}
SendPack_Head(p); //命令头打包
p=ps->Buf;
for(i=0;i<TelBitLen;i++) //21bit收信方地址或数据打包
{
if((OSendLnk_Buf.BitLen%8)==0)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]=0;
if((i%8)==0)
tmp=*p++;
if(tmp&0x80)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]|=OSendLnk_BitMask[OSendLnk_Buf.BitLen%8];
OSendLnk_Buf.BitLen++;
tmp<<=1;
}
if((OSendLnk_Data.InfoType&0x68)==0x40)
{
if((OSendLnk_Data.UserChar&0x4)||(OSendLnk_Data.Encrypt==EncryptTrue))
{
p=ps->Buf+2; //数据送给Sam卡
return(SendLnk_Encrypt(OSendLnk_Data.Encrypt,ps->BitLen-21,p));
}
}
else if(OSendLnk_Data.UserChar&0x4) //有身份认证
{
p=ps->Buf;
return(SendLnk_Encrypt(EncryptNormal,ps->BitLen,p));
}
tmp=Verify_Crc8(OSendLnk_Buf.Buf,OSendLnk_Buf.BitLen);
for(i=0;i<16;i++)
{
if((OSendLnk_Buf.BitLen%8)==0)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]=0;
if(tmp&0x8000)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]|=OSendLnk_BitMask[OSendLnk_Buf.BitLen%8];
OSendLnk_Buf.BitLen++;
tmp<<=1;
}
OSendLnk_Buf.Done=TRUE;
Sys_PutEvent(ConvolPackEvent,HIGH);
return(OK);
}
struct OSendLnkDataStruct *SendLnk_DataGet()
{
return(&OSendLnk_Buf);
}
void SendLnk_AppSetSignal(uchar type)
{
OSendLnk_Data.Semphore=type;
}
uchar SendLnk_AppGetSignal()
{
return(OSendLnk_Data.Semphore);
}
void SendLnk_SetFlag(struct EncryptUserInfoStruct *p)
{
OSendLnk_Data.UserChar=p->UserCharacter; // 用记特征指示
OSendLnk_Data.Encrypt=p->SecuFlag; // 是否加密
OSendLnk_ID[0]=p->SpecialID[0];
OSendLnk_ID[1]=p->SpecialID[1];
OSendLnk_ID[2]=p->SpecialID[2];
OSendLnk_Data.Semphore=NOSIGNAL; //无信号
OSendLnk_Data.Left=0;
OSendLnk_Buf.Done=FALSE;
}
uchar SendLnk_EncrypDoneDeal(uchar message) // 已加密完成处理
{
uchar *p;
struct EncryptLnkDoneStruct *pt;
int i,j,k;
uchar tmp;
pt=EncrypLnkGetData();
if(OSendLnk_EncrypFlag==TRUE) // 保密通信
{
j=((pt->InfoLen[0]<<8)|pt->InfoLen[1]); // 信息长度
p=pt->KeyPassword;
for(i=0;i<j+48;i++)
{
if((i%8)==0)
{
if(i==48)
{
p=pt->Buf;
tmp=*p++;
if(j%8)
{
k=8-(j%8);
tmp<<=k;
i+=k;
j+=k; // 2003-3-11 17:26
}
}
else
tmp=*p++;
}
if((OSendLnk_Buf.BitLen%8)==0)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]=0;
if(tmp&0x80)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]|=OSendLnk_BitMask[OSendLnk_Buf.BitLen%8];
OSendLnk_Buf.BitLen++;
tmp<<=1;
}
}
if(OSendLnk_Data.UserChar&0x4) // 需加认证码
{
p=pt->AffirmCode;
tmp=*p++;
tmp<<=2;
for(i=2;i<22+2;i++)
{
if((i%8)==0)
tmp=*p++;
if((OSendLnk_Buf.BitLen%8)==0)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]=0;
if(tmp&0x80)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]|=OSendLnk_BitMask[OSendLnk_Buf.BitLen%8];
OSendLnk_Buf.BitLen++;
tmp<<=1;
}
}
tmp=Verify_Crc8(OSendLnk_Buf.Buf,OSendLnk_Buf.BitLen); // CRC校验
for(i=0;i<16;i++)
{
if((OSendLnk_Buf.BitLen%8)==0)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]=0;
if(tmp&0x8000)
OSendLnk_Buf.Buf[OSendLnk_Buf.BitLen/8]|=OSendLnk_BitMask[OSendLnk_Buf.BitLen%8];
OSendLnk_Buf.BitLen++;
tmp<<=1;
}
OSendLnk_Buf.Done=TRUE;
Sys_PutEvent(ConvolPackEvent,HIGH);
return(OK);
}
uchar SendJudgeDeal(uchar message)
{
if(CmdAppSta_Get()==EMPTY)
return(ERROR);
if(LockGet_Status()!=TRUE) // 主波束未锁定,不发射
return(ERROR);
if(OLnk_GetRestrainSta()==TRUE)
return(ERROR);
if(SendLnk_AppGetSignal()==NOSIGNAL)
{
SysTimer_Require(FrameErrorEvent,20,ONETIME,LOW);
SendLnk_AppSetSignal(SIGNAL); // 置链路有信号,通知底层做好发射准备
}
return(OK);
}
uchar SendNoteEventDeal(uchar message)
{
uchar type=0;
if(message==CardErrorEvent)
type=3; // 卡出错
else if(message==FrameErrorEvent)
type=2;
else if(message==LowPowerEvent)
type=1;
else if(message==SignalRestrainEvent)
type=2;
OSdSendAck(type);
SendLnk_AppSetSignal(NOSIGNAL);
return(OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -