/** * @param pState * @param pFsm * @param pEvt * * @return int */ static int StateHandlerTest1_s(const FsmState* pState, Test1Fsm* pFsm, const FsmEvent* pEvt) { switch (pEvt->evtId) { case kFsmEventEnterScope: break; case kFsmEventExitScope: break; case kFsmEventBegin: { /// Initial transition to s1 FsmBeginTransition((FsmMachine*)pFsm, (FsmState*)&pFsm->s1); return TRUE; } break; case Test1Fsm::kSig_pressure: { /// Transition to s2 FsmBeginTransition((FsmMachine*)pFsm, (FsmState*)&pFsm->s2); return TRUE; } break; } return FALSE; }
/** ======================================================================== * ========================================================================= */ void psl_sme_begin_transition(PslSmeMachineBase* const pFsm, PslSmeStateBase* const pTargetState, const void* const beginEvtArg, size_t const beginEvtArgSize, const char* const requesterFuncName) { PSL_ASSERT(pFsm); PSL_ASSERT(pTargetState); if (!pFsm->inEvtDispatch) { PSL_LOG_FATAL("%s (fsm=%p/%s): FATAL ERROR: %s() requested transition " \ "to state=%s from non-event-handler scope", __func__, pFsm, FsmDbgPeekMachineName(&pFsm->base), requesterFuncName, FsmDbgPeekStateName(&pTargetState->base)); PSL_ASSERT(pFsm->inEvtDispatch); } if (pFsm->beginEvtData_.reqArgSize) { PSL_LOG_FATAL( "%s (fsm=%p/%s): ERROR: Prior kFsmEventBegin arg not " \ "reaped: prior targetState=%s, arg size=%zd, " \ "requester=%s", __func__, pFsm, FsmDbgPeekMachineName(&pFsm->base), (pFsm->beginEvtData_.reqTargetState ? FsmDbgPeekStateName(&pFsm->beginEvtData_.reqTargetState->base) : "(NULL)"), pFsm->beginEvtData_.reqArgSize, pFsm->beginEvtData_.requesterFuncName); PSL_ASSERT(!pFsm->beginEvtData_.reqArgSize); } if (beginEvtArg) { PSL_ASSERT(beginEvtArgSize > 0 && beginEvtArgSize <= pFsm->beginEvtData_.beginArgBufSize); pFsm->beginEvtData_.reqTargetState = pTargetState; pFsm->beginEvtData_.reqArgSize = beginEvtArgSize; pFsm->beginEvtData_.requesterFuncName = requesterFuncName; memcpy(pFsm->beginEvtData_.beginRequestArgBuf, beginEvtArg, beginEvtArgSize); } FsmBeginTransition(&pFsm->base, &pTargetState->base); }