VOS_VOID TAF_MMA_FSM_InitSubFsm( TAF_MMA_FSM_ID_ENUM_UINT32 enFsmId ) { TAF_MMA_FSM_STACK_STRU *pstFsmStack = VOS_NULL_PTR; TAF_MMA_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; pstCurFsm = TAF_MMA_GetCurFsmAddr(); pstFsmStack = TAF_MMA_GetFsmStackAddr(); /* 打印压栈前的main和sub状态 */ TAF_MMA_LogFsmInfo(); /* 将当前状态机压栈操作 */ TAF_MMA_FSM_PushFsm(pstFsmStack, pstCurFsm); /* 设置当前状态机 */ pstCurFsm->enFsmId = enFsmId; /* 加载sub状态机 */ TAF_MMA_LoadSubFsm(enFsmId, pstCurFsm); /* 打印当前的main和sub状态 */ TAF_MMA_LogFsmInfo(); }
VOS_VOID TAF_MMA_FSM_PopFsm( VOS_VOID ) { VOS_UINT16 usPopFsmPos; TAF_MMA_FSM_STACK_STRU *pstFsmStack = VOS_NULL_PTR; TAF_MMA_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; /* 根据并行状态机栈弹出的状态机获取当前状态机描述地址 */ pstFsmStack = TAF_MMA_GetFsmStackAddr(); pstCurFsm = TAF_MMA_GetCurFsmAddr(); /* 栈已空 */ if ( 0 == (pstFsmStack->usStackDepth) ) { TAF_ERROR_LOG(WUEPS_PID_MMA, "TAF_MMA_FSM_PopFsm,FSM Stack empty"); return; } pstFsmStack->usStackDepth--; usPopFsmPos = pstFsmStack->usStackDepth; /* 设置当前状态机 */ PS_MEM_CPY(pstCurFsm, &((pstFsmStack->astFsmStack)[usPopFsmPos]), sizeof(TAF_MMA_FSM_CTX_STRU)); return; }
VOS_UINT32 TAF_MMA_ProcessMsgInFsm( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT32 ulRet; TAF_MMA_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; VOS_UINT16 usOldStackDepth; VOS_UINT16 usNewStackDepth; /* 获取当前MMA的顶层状态 */ pstCurFsm = TAF_MMA_GetCurFsmAddr(); /* 获取当前MMA的栈深度 */ usOldStackDepth = TAF_MMA_GetFsmStackDepth(); /* 消息处理 */ ulRet = TAF_MMA_FSM_ProcessEvent( pstCurFsm->ulState, ulEventType, (VOS_VOID*)pstMsg ); /* 获取当前MMA的新栈深度 */ usNewStackDepth = TAF_MMA_GetFsmStackDepth(); /* 栈深度没有增加,表明没有触发新的状态机,可以退出*/ if ( usNewStackDepth <= usOldStackDepth ) { return ulRet; } /* 新的栈深度大于老的栈深度 表明进行了压栈,需要将消息放入状态机中继续处理 */ /* 重新获取当前MMA的顶层状态 */ pstCurFsm = TAF_MMA_GetCurFsmAddr(); /* 将消息放入顶层状态机,继续处理 */ ulRet = TAF_MMA_FSM_ProcessEvent( pstCurFsm->ulState, ulEventType, (VOS_VOID*)pstMsg ); return ulRet; }
VOS_UINT32 TAF_MMA_FSM_GetFsmTopState( VOS_VOID ) { TAF_MMA_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; VOS_UINT32 ulState; /* 获取当前状态机 */ pstCurFsm = TAF_MMA_GetCurFsmAddr(); ulState = pstCurFsm->ulState; return ulState; }
VOS_VOID TAF_MMA_FSM_SetCurrState( VOS_UINT32 ulCurrState ) { TAF_MMA_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; /* 获取当前的状态信息 */ pstCurFsm = TAF_MMA_GetCurFsmAddr(); /* 设置当前状态 */ pstCurFsm->ulState = ulCurrState; /* 打印当前的L1和L2状态 */ TAF_MMA_LogFsmInfo(); return; }
VOS_VOID TAF_MMA_FSM_QuitSubFsm( VOS_VOID ) { TAF_MMA_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; pstCurFsm = TAF_MMA_GetCurFsmAddr(); /* QUIT时清空当前sub状态机的CTX */ pstCurFsm->pstFsmDesc->pfInitHandle(); /* 打印压栈前的main和sub状态 */ TAF_MMA_LogFsmInfo(); /* 状态机出栈操作 */ TAF_MMA_FSM_PopFsm(); /* 打印当前的main和sub状态 */ TAF_MMA_LogFsmInfo(); return; }