⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sendlnk.c

📁 输入法
💻 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 + -