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);
}