www.pudn.com > Lock.rar > Lock.c


/*********************************** 
	Name:Lock.c 
	Descript:完成波束搜索(状态 
		转移图参见设计文档) 
	By:Lms 
	Date:2003-2-21 21:06 
************************************/ 
#include "Lock.h"     
 
// Private Function     
/************************* 
	Descript:ISR 
	LockStatus: D2|Adjfreq 
	D1|Channel 1 Locked 
	D0|Channel 2 Locked 
**************************/ 
void c_int02(void)			// 信号锁定 
{     
	volatile uchar tmp; 
	 
	asm("	MAXSPEED	");       
	ST|=0x2000; 
	tmp=(LockStatus&0xff);         
	if(LockObject.Status&LockMainSta) 
	{          
		if(tmp&0x4) 
			Sys_PutEvent(AdjFreqEvent,LOW);	 
		if(((LockObject.Status&LockSlaveSta)==0)&&(tmp&0x2)) 
			Sys_PutEvent(SearchSlaveOKEvent,LOW); 
		return; 
	}	 
	if((tmp&0x3)==0)     // 03-6-6 14:09 
	{ 
		LockCounter=0; 
		return; 
	} 
	LockCounter++; 
	if(LockCounter<5) 
		return;  
	LockCounter=0; 
	if(tmp&0x1) 
	{ 
		Sys_PutEvent(SearchMainOKEvent,HIGH); 
		LockMask_Reg=0;   // 2003/08/12 
	} 
	if(tmp&0x2)     
		Sys_PutEvent(SearchSlaveOKEvent,HIGH); 
}     
 
void LockSetPhase(int ch1,int ch2) 
{    
	if(ch1<6) 
	{     
		Phy_Enable(LockMainChannel,DISABLE); 
		IE&=0xfffffffd; 
		Channel1_M1_Phase=m_pLockPhase[ch1].M1_Phase;					// M1初相 
		Channel1_M2_Phase=m_pLockPhase[ch1].M2_Phase[1];				// M2初相 
		Channel1_Start=1;  
		LockMask_Reg=0x01; 
		IE|=2;  
	} 
	if(ch2<6) 
	{	 
		Phy_Enable(LockSlaveChannel,DISABLE);		 
	    Channel2_M1_Phase=m_pLockPhase[ch2].M1_Phase;					// M1初相 
		Channel2_M2_Phase=m_pLockPhase[ch2].M2_Phase[1];				// M2初相 
		Channel2_Start=1;			 
	} 
} 
 
void Lock_BshSet(uchar MainBsh,uchar SlaveBsh) 
{     
	if(WmcsStatusGet()==TRUE) 
		return;    
	if(MainBsh<4) 
	{ 
		if((MainBsh!=LockObject.MainBsh)&&(MainBsh!=LockObject.SlaveBsh)) 
			LockObject.Energy[MainBsh]=0; 
		LockObject.Status&=0x2; 
		LockObject.MainBsh=MainBsh; 
		LockSetPhase(LockObject.MainBsh,255); 
		SysTimer_Release(LockEnergyReadEvent); 
		SysTimer_Release(SearchMainBshEvent); 
		SysTimer_Require(SearchMainBshEvent,86,RELOAD,HIGH);		  
		SysTimer_Release(StoreBshEvent); 
	} 
	if(SlaveBsh<4) 
	{    
		if((SlaveBsh!=LockObject.MainBsh)&&(SlaveBsh!=LockObject.SlaveBsh)) 
			LockObject.Energy[SlaveBsh]=0; 
		LockObject.Status&=0x1; 
		LockObject.SlaveBsh=SlaveBsh;   
		LockSetPhase(255,LockObject.SlaveBsh); 
		SysTimer_Release(SearchSlaveBshEvent); 
		SysTimer_Require(SearchSlaveBshEvent,48,RELOAD,HIGH);		  
	} 
	Sys_PutEvent(ZtscEvent,LOW); 
}   
 
// Public Functon 
void Lock_Init(struct EncryptUserInfoStruct *pt) 
{ 
	uchar tmp,tmp1; 
   	int i; 
 
	for(i=0;i<6;i++) 
	{ 
		LockObject.Energy[i]=0; 
		LockEnergyDB[i]=0; 
	}  
	LockObject.Times[0]=0; 
	LockObject.Times[1]=0;         
	LockObject.InitStatus=TRUE;             
	// 5分钟内未锁定,则复位科环,码环 
	SysTimer_Require(ResetBaseBandEvent,3000,RELOAD,HIGH); 
	LockObject.MainBsh=(LockFlashMainBsh&0x3);   
	LockObject.SlaveBsh=(LockFlashSlaveBsh&0x3); 
	if(((LockObject.MainBsh^LockObject.SlaveBsh)&0x2)==0) // 两通道锁同一星 
		LockObject.SlaveBsh=(LockObject.MainBsh^0x2); 
	tmp=pt->I_M1_Generate;		// m1 
	tmp1=0; 
	for(i=0;i<4;i++) 
	{ 
		tmp1<<=1; 
		tmp>>=1; 
		if(tmp&0x01) 
			tmp1++; 
	} 
	Channel1_M1_Gen=tmp1;				// m1生成多项式 
	Channel2_M1_Gen=tmp1; 
	 
	tmp=pt->I_M2_Generate[0]; 
	tmp<<=8; 
	tmp|=pt->I_M2_Generate[1]; 
	tmp1=0; 
	for(i=0;i<8;i++) 
	{ 
		tmp>>=1;   
		tmp1<<=1; 
		if(tmp&0x01) 
			tmp1++; 
	} 
	Channel1_M2_Gen=tmp1; 
	Channel2_M2_Gen=tmp1; 
	m_pLockPhase=pt->IRoute;  
	LockObject.Status=LockSearchSta;	//未锁定状态(状态机初态) 
	Lock_BshSet(LockObject.MainBsh,LockObject.SlaveBsh); 
	LockCounter=0; 
} 
 
uchar LockGet_Status() 
{    
	if(LockObject.Status&LockMainSta) 
		return(TRUE); 
	return(FALSE); 
}             
 
uchar Lock_GetSlaveStatus() 
{ 
	if(LockObject.Status&LockSlaveSta) 
		return(TRUE); 
	return(FALSE);	 
} 
   
uchar *Lock_DBout() 
{ 
	int tmp; 
	int i,j; 
	 
	for(i=0;i<4;i++) 
	{ 
		tmp=LockObject.Energy[i]; 
		for(j=0;j<5;j++) 
		{ 
			if(tmp=0;i--) 
		{ 
			if((i==LockObject.MainBsh)||(i==LockObject.SlaveBsh)) 
				continue; 
			LockObject.SlaveBsh=i; 
			break; 
		} 
	} 
	Lock_BshSet(0xff,LockObject.SlaveBsh); 
	return(OK); 
} 
 
// 有中断信号,状态转移 
uchar Lock_IrqDeal(uchar message) 
{    
	uchar Change=FALSE;  
	uchar tmp; 
	 
	if(message==SearchMainOKEvent) 
	{ 
		SysTimer_Release(SearchMainBshEvent);		// Release timer 
		SysTimer_Release(ResetBaseBandEvent); 
		LockObject.InitStatus=FALSE; 
		LockObject.Energy[LockObject.MainBsh]=(Channel1_Energy&0xff);	 
		LockObject.Status|=LockMainSta; 
		IE&=0xfffffffd; 
		LockMask_Reg=0;								// Enable Irq of Adj frequency 
		IE|=2;  
		SysTimer_Release(LockEnergyReadEvent); 
		SysTimer_Require(LockEnergyReadEvent,20,RELOAD,LOW); 
		LockObject.Times[LockMainChannel]=0; 
		Phy_Enable(LockMainChannel,ENABLE); 
		SysTimer_Release(StoreBshEvent); 
		// 20s后存贮波束 
		SysTimer_Require(StoreBshEvent,30,ONETIME,LOW);	 
		SysTimer_Release(LockFrameErrEvent); 
		SysTimer_Require(LockFrameErrEvent,80,ONETIME,LOW); 
		SysTimer_Release(LockInitDwEvent); 
		// 8秒后定位申请 
		SysTimer_Require(LockInitDwEvent,86,ONETIME,LOW); 
	} 
	else if(message==SearchSlaveOKEvent) 
	{ 
		SysTimer_Release(SearchSlaveBshEvent);		// Release timer 
		LockObject.Energy[LockObject.SlaveBsh]=(Channel2_Energy&0xff);	 
	    if(((LockObject.Status&LockMainSta)==LockSearchSta)		 
			||(LockObject.Energy[LockObject.SlaveBsh]>(LockObject.Energy[LockObject.MainBsh]+15))) 
			Change=TRUE;	 
		else 
		{ 
			LockObject.Status|=LockSlaveSta;				 
			LockObject.Times[LockSlaveChannel]=0; 
			Phy_Enable(LockSlaveChannel,ENABLE); 
		} 
	} 
	if(Change==TRUE) 
	{    
		tmp=LockObject.MainBsh; 
		LockObject.MainBsh=LockObject.SlaveBsh; 
		LockObject.SlaveBsh=tmp; 
		Lock_BshSet(LockObject.MainBsh,LockObject.SlaveBsh); 
		Phy_Enable(LockMainChannel,DISABLE); 
		Phy_Enable(LockSlaveChannel,DISABLE); 
	} 
	return(OK); 
}        
 
// 系统失锁及假锁判断(对硬件容错)	   
uchar Lock_EnergyJudge(uchar message) 
{    
	int DelayTime; 
	uchar tmp; 
	int Bsh,i; 
	 
	if(!(LockObject.Status&LockMainSta)) 
		return(ERROR); 
	LockObject.Energy[LockObject.MainBsh]=(Channel1_Energy&0xff); 
	LockObject.Energy[LockObject.SlaveBsh]=(Channel2_Energy&0xff); 
	tmp=LockObject.Status; 
	DelayTime=30;			// 60s 
	for(i=0;i<2;i++) 
	{    
		if(i==0) 
			Bsh=LockObject.MainBsh; 
		else 
			Bsh=LockObject.SlaveBsh; 
		if(tmp&0x1) 
		{ 
			if(LockObject.Energy[Bsh]0) 
				LockObject.Times[i]--;	 
			if(LockObject.Times[i]>DelayTime)		// Lose locked  
				LockObject.Status^=(i+1); 
			DelayTime=8; 
		}  
		tmp>>=1; 
	} 
	if((LockObject.Status&LockMainSta)==LockSearchSta) 			// Main Beam Lost 
	{ 
		if(LockObject.Status&LockSlaveSta)						// But Slave is Locked 
			LockObject.MainBsh=LockObject.SlaveBsh;		 
		LockObject.SlaveBsh=(LockObject.MainBsh^0x3); 
		Lock_BshSet(LockObject.MainBsh,LockObject.SlaveBsh);  
		// 失锁,需容错 
		SysTimer_Require(ResetBaseBandEvent,3000,RELOAD,HIGH); 
	} 
	if((LockObject.Status&LockSlaveSta)==LockSearchSta) 	// Slave Beam Lost 
	{    
		if(LockObject.Times[LockSlaveChannel]<8) 
			return(ERROR); 
	    LockObject.SlaveBsh^=0x1; 
		Lock_BshSet(0xff,LockObject.SlaveBsh); 
		LockObject.Times[LockSlaveChannel]=0; 
	}   
	return(OK); 
} 
 
uchar Lock_MainBshGet() 
{ 
	return(LockObject.MainBsh); 
} 
 
uchar Lock_SlaveBshGet() 
{ 
	return(LockObject.SlaveBsh); 
} 
 
void Lock_PhyJudge() 
{ 
	uchar tmp; 
	 
	tmp=Phy_EnableStaGet(); 
	if(tmp!=LockObject.Status) 
	{ 
		if(LockObject.Status&LockMainSta) 
			Phy_Enable(LockMainChannel,ENABLE); 
		else if(LockObject.Status&LockSlaveSta)	 
	       Phy_Enable(LockSlaveChannel,ENABLE); 
	} 
} 
 
uchar LockZTSCDeal(uchar message) 
{                            
	uchar tmp_buf[12];  
	uchar *p; 
   	int  tmp; 
    int index,i; 
 
    index=(message-ZtscEvent); 
	if(index>1) 
		return(ERROR); 
	memmove(tmp_buf,"ZTXX",4);         
	p=Lock_DBout(); 
	tmp_buf[4]=LockObject.MainBsh+1;					// 主波束号 
	tmp_buf[5]=p[LockObject.MainBsh];   				// 主波束信号强度 
	tmp_buf[6]=LockObject.SlaveBsh+1;                   // 从波束号 
	tmp_buf[7]=p[LockObject.SlaveBsh];					// 从波束信号强度 
	tmp_buf[8]=EncryptUserInfoData.Status;              // SAM卡状态 
    tmp=(BaterryReg7818&0xff); 
    for(i=0;i<4;i++) 
    { 
    	if(tmp6) 
			{ 
				RestFlag=TRUE; 
				LockObject.Status=LockSearchSta; 
			} 
			Lock_BshSet(LockObject.MainBsh,LockObject.SlaveBsh);	 
		} 
		else if(ErrStep>0) 
			ErrStep--;	 
		if(!RestFlag) 
			SysTimer_Require(LockFrameErrEvent,80,ONETIME,LOW); 
	} 
	//系统长时间未锁定,需复位码环,科环 
	if((message==ResetBaseBandEvent)||RestFlag)	 
	{                                                     
		// 主波束未锁定 
		if((LockObject.Status&LockMainSta)==LockSearchSta) 
		{ 
			FreqChipPhase_L=0xcc; 
			FreqChipPhase_H=0x46; 
			FreqCarrier_L=0x6c; 
			FreqCarrier_H=0xf4; 
			FreqCosStable=0x0f; 
			LockObject.InitStatus=TRUE; 
			AdjfreqReg=0x6cca; 
			SysTimer_Require(ResetBaseBandEvent,3000,RELOAD,HIGH); 
		} 
	} 
	return(OK);	 
}	       
 
// 校频 
uchar LockAdjFrequencyDeal(uchar message) 
{          
	volatile int tmp,tmp2,tmp3; 
	 
	//主波束未锁定,不校频  
	if((!(LockObject.Status&LockMainSta))||(message!=AdjFreqEvent)) 
		return(ERROR); 
	tmp=(FreqChipPhase_H&0xff); 
	tmp<<=8; 
	tmp+=(FreqChipPhase_L&0xff);  
	tmp2=tmp-AdjfreqReg; 
	tmp2=abs(tmp2); 
	if((tmp2>163)&&(tmp2<800)) 
	{    
		tmp2=((tmp-0x6cca)*610); 
		tmp2+=0xff46cca; 
		FreqCarrier_L=(tmp2>>8); 
		FreqCarrier_H=(tmp2>>16); 
	} 
	AdjfreqReg=tmp;    
	return(OK); 
}      
 
uchar LockDwsqDeal(uchar message) 
{        
	int i; 
	uchar tmp_buf[8]; 
	 
	if(message!=LockInitDwEvent) 
		return(ERROR); 
	if(((LockObject.Status&0x1)==0)|| 
		(LockObject.Energy[LockObject.MainBsh]1) 
		return(ERROR);                          
	OSdPack(index,(uchar *)"$GLZK",Lock_DBout(),6);	 
	return(OK); 
} 
 
// 波束存贮(锁定20s后再进行波束存贮,对硬件错锁容错) 
uchar LockStoreBsh(uchar message) 
{ 
	uchar buf[2]; 
	 
	if((message!=StoreBshEvent)||((LockObject.Status&LockMainSta)==0)) 
		return(ERROR); 
	if((LockObject.MainBsh==(LockFlashMainBsh&0xff))&&      
		(LockObject.SlaveBsh==(LockFlashSlaveBsh&0xff))) 
		return(ERROR); 
	buf[0]=LockObject.MainBsh; 
	buf[1]=LockObject.SlaveBsh; 
	Erase_One_Sector(LockFlashUser);  
	WriteFlash(buf,LockFlashUser,2); 
	return(OK); 
}