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

📄 mn80main.c

📁 phs 源代码 小灵通协议源代码 phs source code
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef PM_ONPC

#ifdef __cplusplus
extern "C"{
#endif
#include	"phs_def.h"

//  #pragma	section	area m_data
#include	"mn80.h"
#include	"mn80ext.h"

#ifdef SIMU_ON_PC
#include <string.h>
#include "dbgtrace.h"
#endif

extern void RfInit(void);

//  #pragma	section	code mp_code

#ifdef _ON_SANYO_
void Mn_SMain(void)
#else
void Mn_SMain(void* mbox)
#endif
{
	U1* 				p;
	MN_EVENTREC	*pEvtTbl;

#ifndef _ON_SANYO_
	memcpy ((void *) mn_syswork.in_evt, (const void *)(((EV_BUF_ST *)mbox)->event), sizeof (mn_syswork.in_evt));
#endif
	non_stop |= NSTOP_MG;

#ifdef SIMU_ON_PC
//	SendUart2L1( SIMTSKDTW , NSTP , 0 , &non_stop , 1);		//Because L1 only set it ,and it's readed only in MN
#endif

	Mn_InEvtCod[0] = (U1)SYS_WORK->in_evt[0];
   //Debug By Chenwei
  //  if(0x82 == Mn_InEvtCod[0])  ProtocolTrace(2,"!!!Mn Recv Time out\n");

	switch (Mn_InEvtCod[0])
	{
	case ECC:									/* CC 					*/
	case EMM:									/* MM 					*/
	case ERT:									/* RT 					*/
		Mn_InEvtCod[1] = (U1)MN_IN_EVT(L3_MN_EVT)->pri_cod;
	break;
	case PM_MNG:								/* UAP					*/
		Mn_InEvtCod[1] = MN_IN_EVT(PM_MN_EVT)->msg_adr->msg[1];
#ifdef SIMU_ON_PC
 if(Mn_InEvtCod[1] == 0x10)
     ProtocolTrace(10,"!!!mn main received paging response %d %d \n",Mn_state.common_mod,Mn_InEvtCod[1]);

#endif
	break;
	default:
		Mn_InEvtCod[1] = 0x00;
	break;
	}

	/*根据状态得到事件*/
	pEvtTbl = COMM_STATE[Mn_state.common_mod];

	if(!Mn_SSchEvTbl(&pEvtTbl))/*执行事件对应函数*/
		Mn_SSeparate(&pEvtTbl);/*在另一个状态表中取得事件,并且执行事件对应函数*/

	p = Mn_GetSpecState(phs_mode);
	if(NULL == p)
		return;

	if(((phs_mode == PHS_PUBLIC_STS) || (phs_mode == PHS_PRIVATE_STS)) &&
		(!*p) &&
		(non_stop & NSTOP_MG) &&
		(SLEEP_STS[*p] == ON))
	{
		p = Mn_GetSpecState((BYTE)!phs_mode);
		if(NULL == p)
			return;
		if(!*p)
		{
			slp_t_req(0xFFFF-4 , 0);
			Sleep_Control(BSLPFORV);
		#ifdef PROT_TEST
		HisOut(0x00,0xfe,0x01,0x00,0x00);
		#endif



		}
	}

}



/*************************************************************************************
FUNCTION: Mn_SSchEvTbl

DESCRIPTION:
		MN Search event table to call the corresponding function

ARGUMENTS PASSED:
	MN_EVENTREC** ppEvtTbl : The address of the pointer of the specified event table
	Exten input : Mn_InEvtCod[2]

RETURN VALUE:
	TRUE:	Have found the Event or END, END
			FALSE:	Not found , set ppEvtTbl with next table pointer

Revision History:
                            Modification     Tracking
Author                          Date          Number     Description of Changes
-------------------------   ------------    ----------   ------------------------------
Chen Xiangli					08/22/2003					Initial version.

**************************************************************************************/

_BOOL Mn_SSchEvTbl(MN_EVENTREC** ppEvtTbl)
{
	MN_EVENTREC	*p;

	for(p = *ppEvtTbl ;  ; p++)
	{
		if((p->evt_code == Mn_InEvtCod[0]) &&
			(p->pri_code == Mn_InEvtCod[1]))
		{
			p->Module();
			break;
		}

		if(p->evt_code == END)
		{
			if(p->pri_code == SRCH)
			{
				*ppEvtTbl = (MN_EVENTREC*)p->Module;
				return FALSE;
			}

			if(ReaVal == 0)
				ReaVal = SEQERR;

			if(Mn_InEvtCod[0] == PM_MNG)
				{err_dsp( MN_IN_EVT(PM_MN_EVT)->msg_adr );}
			else
				{err_dsp((M_MSB*)0);}
//Modify By chenwei in  2003/9/19
			break;
		}

	}


	return TRUE;
}


/*************************************************************************************
FUNCTION: Mn_SSeparate

DESCRIPTION:
		MN Process event Separatly

ARGUMENTS PASSED:
	MN_EVENTREC** ppEvtTbl : The address of the pointer of the specified event table
	Exten input : Mn_InEvtCod[2]

RETURN VALUE:
	NONE

Revision History:
                            Modification     Tracking
Author                          Date          Number     Description of Changes
-------------------------   ------------    ----------   ------------------------------
Chen Xiangli					08/22/2003					Initial version.

**************************************************************************************/

void Mn_SSeparate(MN_EVENTREC** ppEvtTbl)
{
	U1 *p;

	switch (Mn_InEvtCod[0])
	{
	case TICCHSHT:			//Timer event
	case TICCHEST:
	case TICCHMON:
	case TICSYNC:
	case TIACCALL:
	case TIACLOC:
	case TITC309P:
	case TITCHFRE:
	case TIHANDOV:
	case TIRETRY:
	case TIPAGE:
	case TIWMONIT1 :
		phs_mode = (U1) MN_IN_EVT(MN_TIMER_EVT)->tim_info[0];
	break;

	case PM_MNG:
		phs_mode = NONE;

		for (p = UAPOUT ; *p != END ; p++)
		{
			if ( *p != Mn_InEvtCod[1])
			{
				continue;
			}
			//searched
			switch( MN_IN_EVT(PM_MN_EVT)->msg_adr->msg[0] & 0x0F )
			{
			case OPUBLIC :
				phs_mode = PHS_PUBLIC_STS;
			break;
			default		:
				ReaVal = PRIERR;

				err_dsp( MN_IN_EVT(PM_MN_EVT)->msg_adr )	; //MN_IUAPBUFP);
				return;
			}
			break;
		}

		if (phs_mode == NONE)
		{

			if (CallChanel == 0xFF)
			{
				ReaVal = SEQERR;

				err_dsp( MN_IN_EVT(PM_MN_EVT)->msg_adr );
				return;
			}
			phs_mode = CallChanel;
		}
	break;

	case ERCHINFO:
	case ESYSINFO:
	case ESY2INFO:
	case ESY3INFO:
	case EPCH:
	case ESCCH:
		phs_mode = PHS_PUBLIC_STS;
	break;

	case ECCH_MON:

		if (CCHInfo.Moni != 0xFF)
		{
			phs_mode = CCHInfo.Moni;
			break;
		}
	case EPHDTDSP:		/*L1->L3(L3C)->MNG*/
	case EDLUDTDSP:
	case EDLDTDSP:
	case EDLDTRS:
	case EDLSETRS:
	case EDLSETDSP:
	case EDLFREDSP:
	case ETXOFF:
		if (CallChanel != 0xFF)
		{
			phs_mode = CallChanel;
		}
		else
			phs_mode = NONE;
	break;

	case ECC:									/* CC 					*/
	case EMM:									/* MM 					*/
	case ERT:									/* RT 					*/
	default:

		if (CallChanel != 0xFF)
		{
			phs_mode = CallChanel;
			break;
		}
		phs_mode = NONE;
	}

	switch (phs_mode)
	{
	case PHS_PUBLIC_STS:
		*ppEvtTbl = PUB_PRV_STATE[Mn_state.public_mod];
	break;
	default:
		if (ReaVal == 0)
		{
			ReaVal = SEQERR;
		}
		err_dsp((M_MSB *)0);
		return;
	break;
	}

	if(!Mn_SSchEvTbl(ppEvtTbl))
		Mn_SSchEvTbl(ppEvtTbl);
}


void Mn_PSNumMake(U1 start, U1 oct, U1 *psno , U1 mode)
{
	U1	keta,
		len,
		i;
	U2	base;
	U1	ia5_psno[16];


	keta = pm_bcd_to_ia5(start, oct, psno, ia5_psno);

	len = ((keta > 4) ? 4 : keta);
	PSNum[mode] = 0;
	base = 1;

	for ( i = 0; i < len; i++ )
	{
		PSNum[mode] += (ia5_psno[(keta-1) - i] - 0x30) * base;
		base *= 10;
	}
}


void	Sleep_Pch_Select(void)
{
//	U1	psno[7];
//Debug By Chenwei 2004-2
	if(NPCH(phs_mode) == 0 || NGROUP(phs_mode) == 0)
    {
 #ifdef SIMU_ON_PC
        ProtocolTrace(2,"!!!!!!!!!Sleep_pch_select err\n");
 #endif
        return ;

    }

	IncGroup[phs_mode] = PSNum[phs_mode] % (NPCH(phs_mode) * NGROUP(phs_mode)
									* (CNTCRY(phs_mode) == 0x02 ? 2 : 1)) + 1;

	if(Sys_initdl1[24] & SLEEP_MASK)
	{
		if( (phs_mode == PHS_PUBLIC_STS) &&
			(CNTCRY(PHS_PUBLIC_STS) == 0x02 && Sys_prinfo[7] & 0x010))
		{
			Frame_cnt[phs_mode] = NSUB(phs_mode)* (((IncGroup[phs_mode] - 1) / 2) / NPCH(phs_mode))
					+ (NSUB(phs_mode) - NPCH(phs_mode))
					+ (((IncGroup[phs_mode] - 1) / 2) % NPCH(phs_mode));

		}
		else
		{
			Frame_cnt[phs_mode] = NSUB(phs_mode) * ((IncGroup[phs_mode] - 1) / NPCH(phs_mode))
					+ (NSUB(phs_mode) - NPCH(phs_mode))
					+ ((IncGroup[phs_mode] - 1) % NPCH(phs_mode));

		}
	}
}


void	Sleep_Pch_Set(U1 frame_cnt)
{

	if(!(Sys_initdl1[24] & SLEEP_MASK))
	{
		return;
	}

	own_pch_req(frame_cnt);

	if (CCHShortTim[phs_mode])
	{
		m_stptim(T1S, TICCHSHT, phs_mode);
		CCHShortTim[phs_mode] = OFF;
	}

	if(frame_cnt == SLEEP_OFF)
	{
		SLEEP_STS[phs_mode] = OFF;
		Mn_settim(TICCHSHT);
		Mn_PCsyncCountStart();
	}
	else
	{
		SLEEP_STS[phs_mode] = HOLD;
		Mn_PCsyncTimerClear();
	}
}


void	Sleep_Control(U1 id)
{
//	U2	tim;
#ifdef PROT_TEST
	U1 temp[4];
	temp[0] = id;
	temp[1] = SLEEP_STS[phs_mode];
	temp[2] = Sys_initdl1[24] & SLEEP_MASK;
	temp[3] = 0x00;
	HisOut(0x04,0xff,0x03,0x00, temp);
#endif

	if((id == BSLPREL) && (SLEEP_STS[phs_mode] != OFF))
	{
		non_stop |= BIT1;
#ifdef SIMU_ON_PC
//		SendUart2L1( SIMTSKDTW , NSTP , 0 , &non_stop , 1);//L1 only set it while not use it
#endif
		if(Sys_initdl1[24] & SLEEP_MASK)
		{
			Sleep_Pch_Set(SLEEP_OFF);
		}
		slp_c_req(OFF);
		SLEEP_STS[phs_mode] = OFF;
	}
	else if(id == BSLPFORV)
	{
		if(SLEEP_STS[phs_mode] == OFF)
		{
			Sleep_Pch_Set((U1)Frame_cnt[phs_mode]);
		}
		SLEEP_STS[phs_mode] = ON;
		if(SLEEP_STS[PHS_PUBLIC_STS] == ON)
		{
#ifdef SIMU_ON_PC
//			SendUart2L1( SIMTSKDTW , NSTP , 0 , &non_stop , 1); //L1 only set it while not use it
#endif
			non_stop &= ~BIT1;
		}
		if (CCHShortTim[phs_mode])
		{
			m_stptim(T1S, TICCHSHT, phs_mode);
			CCHShortTim[phs_mode] = OFF;
		}
		Mn_PCsyncTimerClear();
	}
}


void Mn_MInitial(void)
{

	RadioFlag[PHS_PUBLIC_STS] = ON;
	CallChanel = 0xFF;
	CallMode = 0xFF;
	CCHFact[PHS_PUBLIC_STS] = 0xFF;
	CCHInfo.Moni = 0xFF;
	CCHInfo.Main = 0xFF;
	SLEEP_STS[PHS_PUBLIC_STS] = ON;


	move_up_b(&Sys_pbsid[7], PAREADEF, sizeof(PAREADEF));

	Source = 0x03;


	SYS_WORK->msg_adr = (M_MSB*)m_hntbuf();
	SYS_WORK->msg_adr->msg[0] = NONE;		//Don't care
	SYS_WORK->msg_adr->msg[1] = MINITEND;		//Power up initialization completion
	SYS_WORK->msg_adr->msg[2] = 0x04;
	SYS_WORK->msg_adr->msg[3] = 0x00;			//BBIC1	OK
	SYS_WORK->msg_adr->msg[4] = 0x00;			//BBIC2 OK
	SYS_WORK->msg_adr->msg[5] = 0x01;
	SYS_WORK->msg_adr->msg[6] = 0x01;
	exec_uap(SYS_WORK->msg_adr);


	Mn_state.common_mod = ST_CMN_WAIT;
}


/*************************************************************************************
FUNCTION: Mn_MInitData2

DESCRIPTION:
	MMI Read the data stored in flash ROM , Flash address : 0x300 . from MMI->PM->MN

ARGUMENTS PASSED:
	NONE

RETURN VALUE:
	NONE

Revision History:
							Modification	 Tracking
Author							Date		  Number	 Description of Changes
-------------------------	------------	----------	 ------------------------------
Chen Xiangli					08/22/2003

**************************************************************************************/

void Mn_MInitData2(void)		//Direction : PM_MNG
{
	PM_MN_EVT*	pInEvt;

	pInEvt = (PM_MN_EVT*)SYS_WORK->in_evt;

	if(pInEvt->msg_adr->msg[2] != 0x3F)		//change from 0x38->0x3F for seamless feature,changed by Qian Aidong
	{
		ReaVal = PRIERR;
		err_dsp(pInEvt->msg_adr);
		return;
	}

	move_up_b(Sys_psid ,(U1*) &pInEvt->msg_adr->msg[3] , 4);		//PS-ID
	Sys_psid[3] &= 0x0F;
#ifdef SIMU_ON_PC
	SendUart2L1( SIMTSKDTW , SYSPSID , 0 , Sys_psid , 4);
#endif

	Sys_cartrsh[0] = pInEvt->msg_adr->msg[7];
#ifdef SIMU_ON_PC
	SendUart2L1( SIMTSKDTW , SYSCARTRSH , 0 , &Sys_cartrsh[0] , 1);	//Send to L1 together following
#endif

	Sys_cchtim[0] = pInEvt->msg_adr->msg[8];
	Sys_csynctim[0] = pInEvt->msg_adr->msg[9];

	move_up_b(Sys_pbsid ,(U1*) &pInEvt->msg_adr->msg[10] , 7);	//PBS Infomation

	move_up_b(Sys_thresh ,(U1*) &pInEvt->msg_adr->msg[17] , 2);
#ifdef SIMU_ON_PC
	SendUart2L1( SIMTSKDTW , SYSTHRESH , 0 , &Sys_thresh[0] , 2);
#endif
	Sys_montim[0] = pInEvt->msg_adr->msg[19];

	move_up_b(Sys_hodat , (U1*)&pInEvt->msg_adr->msg[20] , 3);	//Send to L1 in next lines

	move_up_b(Sys_initdl1 , (U1*)&pInEvt->msg_adr->msg[23] , 43);
#ifdef SIMU_ON_PC
	SendUart2L1( SIMTSKDTW , SYSINIT , 0 , Sys_initdl1 , 43);
#endif

	m_frebuf((U1*)pInEvt->msg_adr);

	Sys_hodat[6] = ON;
#ifdef SIMU_ON_PC
	SendUart2L1( SIMTSKDTW , SYSHODAT , 0, Sys_hodat , 7);
#endif
	move_up_b(&Sys_pbsid[7],Sys_thresh,2);

	CCHs_CSlev = Sys_thresh[0];
	CCHh_CSlev = Sys_thresh[1];
	TCHs_CSlev = Sys_thresh[1];
	TCHh_CSlev = Sys_thresh[0];

	if (cmp_up_b(Sys_pbsid, CLSCSID, 6))
	{

		Mn_PAreaBitMask();
	}

	Ich_end_monF = 0;
 	set_up_b(LocNgCS, 0, 6);
	A_short = OFF;
	exe_reg_cs_id = 1;

	l1_slope = Sys_initdl1[26];
#ifdef SIMU_ON_PC
	SendUart2L1(SIMTSKDTW , L1SLOPE , 0 , &l1_slope , 1);
#endif

	l1_ofs = Sys_initdl1[27];
#ifdef SIMU_ON_PC
	SendUart2L1(SIMTSKDTW , L1OFS , 0 , &l1_ofs , 1);
#endif

	RfInit();

	if ((InitData |= BIT1) == 0x03)
	{
													/* #dcm1-MNG17 07->0f 	*/
													/* #SD 0f->1f			*/
		Mn_state.common_mod = ST_CMN_NORMAL;
		slp_t_req(0xffff,0);
		ph_ini_req();
	}
}



/*************************************************************************************
FUNCTION: Mn_MInitData1

DESCRIPTION:
	MMI Read the data stored in flash ROM ,Flash address : 0x340 , MMI->PM->MN

ARGUMENTS PASSED:
	NONE

RETURN VALUE:
	NONE

Revision History:
							Modification	 Tracking
Author							Date		  Number	 Description of Changes
-------------------------	------------	----------	 ------------------------------
Chen Xiangli					08/22/2003

**************************************************************************************/

void Mn_MInitData1(void)		//Direction : PM_MNG
{
	U1	n , i , j ;
	PM_MN_EVT*	pInEvt;

	pInEvt = (PM_MN_EVT*)SYS_WORK->in_evt;

	if(pInEvt->msg_adr->msg[2] == 0)	//length of message
		goto fre_lab;

	if(Mn_InfChk(&CHKTBL[10] , (U1*) &pInEvt->msg_adr->msg[4] ,(BYTE)(pInEvt->msg_adr->msg[2]-1)))	//don't care the msg[3] , at the same time ,decrease the length of message
	{
		ReaVal = PRIERR;

		err_dsp(pInEvt->msg_adr);
		return;
	}

	for (n = 4 ; n < pInEvt->msg_adr->msg[2]-1  ;  ) 		//The message data readed from FlashROM (FlashData[])
	{
		switch(pInEvt->msg_adr->msg[n])
		{
		case IPSNUMBR:							//PS Number
			move_up_b(Sys_psno , (U1*)&pInEvt->msg_adr->msg[n+1] , 7);
			n += 8;
		break;
		case ISODATA:
			for(i=n ; (i-n) < pInEvt->msg_adr->msg[2]-9 ; )
			{
				j = 0;

				switch(pInEvt->msg_adr->msg[i])
				{
				case ICARINF:
					if(pInEvt->msg_adr->msg[i+1])
					{
						Sys_carrier[0] = pInEvt->msg_adr->msg[i+1] / 2;


						move_up_b(&Sys_carrier[1] ,
									(U1*)&pInEvt->msg_adr->msg[i+2],
									pInEvt->msg_adr->msg[i+1]);

					}
					j = (pInEvt->msg_adr->msg[i+1] + 2);
				break;
				case IANSKEY:

					move_up_b(Sys_pin , (U1*)&pInEvt->msg_adr->msg[i+1] , 8);
					j = 9;
				break;
				case IPRIORT:
					Sys_pri = pInEvt->msg_adr->msg[i+1];
					j = 2;
				break;
				case IREWTKY:

					move_up_b(Sys_rwtkey , (U1*)&pInEvt->msg_adr->msg[i+1] , 8);
					j = 9;
				break;
				case IREADKY:

					move_up_b(Sys_readkey , (U1*)&pInEvt->msg_adr->msg[i+1] , 8);
					j = 9;
				break;
				default:
				break;
				}
				i += j;
			}
			n += i;
		break;
		default:
		break;
		}
	}


	Mn_PSNumMake(1 , 7 , Sys_psno, PHS_PUBLIC_STS);

fre_lab :
	m_frebuf((U1*)pInEvt->msg_adr);

	if ((InitData |= BIT2) == 0x03)
	{
#ifdef SIMU_ON_PC
		DBG_TRACE( 0 , "\n-- Initdata ok!\n");
#endif
		Mn_state.common_mod = ST_CMN_NORMAL;
		slp_t_req(0xffff,0);
		ph_ini_req();
	}
}




void Mn_PAreaBitMask(void)
{
	U1 i , j , k;

	set_up_b(BitMask, 0, sizeof(BitMask));

	if ((Sys_pbsid[6] & 0x0F) < 8)
	{
		i = (Sys_pbsid[6] & 0x0F) * 2 + 2;
	}
	else
	{
		i = (Sys_pbsid[6] & 0x0F) + 9;
	}

	if( i < 8 )
	{
		BitMask[1] = (U1)(0xFF80 >> i ) ;
		BitMask[1] &= 0x7F;
	}
	else
	{

		j = (i-7)>>3;

		if( (i-7) & 0x07 )
		{
			BitMask[j+2] = (U1)(0xFF80 >> (((i-7)&0x07)-1));
		}


		for( k = j+1 ; k>0 ; k--)
		{
			if( k == 1 )
			{
				BitMask[k] = 0x7F;
			}
			else
			{
				BitMask[k] = 0xFF;
			}
		}
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -