VOS_VOID TAF_APS_InitSubFsm( TAF_APS_FSM_ID_ENUM_UINT32 enFsmId, TAF_FSM_DESC_STRU *pstFsmDesc, VOS_UINT32 ulState ) { TAF_APS_SUB_FSM_CTX_STRU *pstCurrSubFsm = VOS_NULL_PTR; TAF_APS_PDP_ENTITY_FSM_CTX_STRU *pstCurPdpEntityFsmCtx = VOS_NULL_PTR; /* 获取当前的Sub状态机 */ pstCurPdpEntityFsmCtx = TAF_APS_GetCurrPdpEntityFsmAddr(); pstCurrSubFsm = &pstCurPdpEntityFsmCtx->stSubFsm; /* 设置当前Sub状态机状态机名 */ pstCurrSubFsm->enFsmId = enFsmId; /* 设置当前Sub状态机的PDP ID */ pstCurrSubFsm->pstFsmDesc = pstFsmDesc; /* 设置当前Sub状态机的状态 */ pstCurrSubFsm->ulState = ulState; /* 初始化Sub状态机 */ /* pstCurrSubFsm->pstFsmDesc->pfInitHandle(); */ /* 打印当前的Sub和Main状态机 */ /* TAF_APS_LogMmcFsmInfo(); */ }
TAF_APS_ENTRY_MSG_STRU* TAF_APS_GetCurrSubFsmMsgAddr(VOS_VOID) { TAF_APS_PDP_ENTITY_FSM_CTX_STRU *pstCurPdpEntityFsmCtx = VOS_NULL_PTR; /* 获取当前的L1状态机和L2状态状态机 */ pstCurPdpEntityFsmCtx = TAF_APS_GetCurrPdpEntityFsmAddr(); return &(pstCurPdpEntityFsmCtx->stSubFsm.stEntryMsg); }
VOS_VOID TAF_APS_QuitCurrSubFsm( VOS_VOID ) { TAF_APS_SUB_FSM_CTX_STRU *pstCurrSubFsm = VOS_NULL_PTR; TAF_APS_PDP_ENTITY_FSM_CTX_STRU *pstCurPdpEntityFsmCtx = VOS_NULL_PTR; /* 获取当前的L2状态状态机 */ pstCurPdpEntityFsmCtx = TAF_APS_GetCurrPdpEntityFsmAddr(); pstCurrSubFsm = &pstCurPdpEntityFsmCtx->stSubFsm; /* 清空层二状态机描述表 */ pstCurrSubFsm->pstFsmDesc = VOS_NULL_PTR; /* 清空当前L2状态机ID */ pstCurrSubFsm->enFsmId = TAF_APS_FSM_BUTT; }
VOS_VOID TAF_APS_InitEntityFsm( VOS_VOID ) { VOS_UINT8 i; TAF_APS_PDP_ENTITY_FSM_CTX_STRU *pstCurrPdpEntityFsm; /* for 循环,初始化所有实体状态机上下文,包括主状态机和子状态机 */ for (i = 0; i < TAF_APS_MAX_PDPID; i++) { /* 根据设置当前的实体状态机 */ TAF_APS_SetCurrPdpEntityFsmAddr(i); pstCurrPdpEntityFsm = TAF_APS_GetCurrPdpEntityFsmAddr(); /* 初始化实体上下文 */ TAF_APS_InitMainFsmCtx(&pstCurrPdpEntityFsm->stMainFsm); TAF_APS_InitSubFsmCtx(&pstCurrPdpEntityFsm->stSubFsm); pstCurrPdpEntityFsm->ulPsSimRegStatus = VOS_TRUE; /* PS域SIM卡状态信息,VOS_TRUE:卡有效,VOS_FALSE:卡无效 */ pstCurrPdpEntityFsm->ucPdpId = TAF_APS_INVALID_PDPID; /* 当前状态机所对应的PDP ID */ pstCurrPdpEntityFsm->enRatType = MMC_APS_RAT_TYPE_NULL; /* PS域SIM卡状态信息,VOS_TRUE:卡有效,VOS_FALSE:卡无效 */ } }
VOS_UINT32 TAF_APS_ProcessMsgInFsm( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT32 ulRet; TAF_APS_PDP_ENTITY_FSM_CTX_STRU *pstCurPdpEntityFsmCtx; VOS_UINT8 i; TAF_APS_FSM_ID_ENUM_UINT32 enPreSubFsmId; TAF_APS_PDPID_LIST_STRU stPdpIdList; /* 清空需要送出的PDP操作列表的变量pstPdpIdList */ PS_MEM_SET(&stPdpIdList, 0, sizeof(TAF_APS_PDPID_LIST_STRU)); /* 获取需要操作的Pdp 列表 */ TAF_APS_GetFsmPdpIdList(ulEventType, pstMsg, &stPdpIdList); ulRet = VOS_FALSE; for (i = 0; i < stPdpIdList.ucPdpNum; i++) { /* 根据PDP ID来设置当前的实体状态机 */ TAF_APS_SetCurrPdpEntityFsmAddr(stPdpIdList.aucPdpId[i]); /* 设置当前状态机实体的PDP ID */ TAF_APS_SetCurrFsmEntityPdpId(stPdpIdList.aucPdpId[i]); pstCurPdpEntityFsmCtx = TAF_APS_GetCurrPdpEntityFsmAddr(); /* 如果当前子状态机已经存在,则直接进入到子状态机处理 */ if (TAF_APS_FSM_BUTT != pstCurPdpEntityFsmCtx->stSubFsm.enFsmId) { enPreSubFsmId = pstCurPdpEntityFsmCtx->stSubFsm.enFsmId; ulRet = TAF_APS_FSM_ProcessEvent( pstCurPdpEntityFsmCtx->stSubFsm.ulState, ulEventType, (VOS_VOID*)pstMsg, pstCurPdpEntityFsmCtx->stSubFsm.pstFsmDesc ); /* 当前子状态机如果发生变化,并且不是退出子状态机, 说明进行了子状态机切换,需要再次进入到状态机处理函数中 */ if ( (TAF_APS_FSM_BUTT != pstCurPdpEntityFsmCtx->stSubFsm.enFsmId ) &&( enPreSubFsmId != pstCurPdpEntityFsmCtx->stSubFsm.enFsmId ) ) { ulRet = TAF_APS_FSM_ProcessEvent( pstCurPdpEntityFsmCtx->stSubFsm.ulState, ulEventType, (VOS_VOID*)pstMsg, pstCurPdpEntityFsmCtx->stSubFsm.pstFsmDesc ); } } else { /* 先在主状态机进行消息处理 */ ulRet = TAF_APS_FSM_ProcessEvent( pstCurPdpEntityFsmCtx->stMainFsm.ulState, ulEventType, (VOS_VOID*)pstMsg, pstCurPdpEntityFsmCtx->stMainFsm.pstFsmDesc ); if (VOS_TRUE == ulRet) { /* 如果当前主状态机已经进行了处理,并且此时子状态机存在,说明主状态状态机 处理函数中,启动了子状态机,再次进入到子状态机进行处理 */ if (TAF_APS_FSM_BUTT != pstCurPdpEntityFsmCtx->stSubFsm.enFsmId) { /* 消息处理 */ ulRet = TAF_APS_FSM_ProcessEvent( pstCurPdpEntityFsmCtx->stSubFsm.ulState, ulEventType, (VOS_VOID*)pstMsg, pstCurPdpEntityFsmCtx->stSubFsm.pstFsmDesc ); } } } } return ulRet; }