From f48889bf230e50a0e6fb8be04c405ec53d742dc5 Mon Sep 17 00:00:00 2001 From: TrashGod <974980621@qq.com> Date: Fri, 28 Jun 2024 19:45:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=81=E8=A3=85=E4=BA=86=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E6=9B=B4=E5=A5=BD=E6=87=82=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/FSM_OOP/baseFSM/FSM.c | 43 ++++++++----------- vscode/FSM_OOP/baseFSM/FSM_private.h | 58 +++++++++++++++++++++++++- vscode/FSM_OOP/baseFSM/FSM_protected.h | 2 +- 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 95d6b65..83fcfec 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -73,37 +73,35 @@ void stepBaseFSM(FSM *pFSM) if(nextState && curState != nextState){ // 状态切换 // 退子状态机 - if(childFSMTable[curState] != NULL){ - FSM *cFSM = childFSMTable[curState]; - int cFSMCurState = cFSM->privateVars->curState; - cFSM->privateVars->fcns.exitActionTable[cFSMCurState](cFSM->data); - resetBaseFSM(cFSM); + if(hasChildFSM(pFSM, curState)){ + FSM *cFSM = getChildFSM(pFSM, curState); + exitFSM(cFSM); } - // 退父状态机 - fcns->exitActionTable[curState](data); + // 退状态机 + doExit(pFSM); // 转移函数 - fcns->transitionTable[index](data); // 有特定的状态转移函数 - fcns->transitionGeneralAction(data); // 通用状态转移函数 + doTransition(pFSM, index); // 有特定的状态转移函数 + doGeneralTransition(pFSM); // 通用状态转移函数 - // 进父状态机 - fcns->enterActionTable[nextState](data); + // 进状态机 + doEnter(pFSM, nextState); // 进子状态机,必须从默认状态开始 - if(childFSMTable[nextState] != NULL){ - FSM *cFSM = childFSMTable[nextState]; + if(hasChildFSM(pFSM, nextState)){ + FSM *cFSM = getChildFSM(pFSM, nextState); Step(cFSM); } - - pFSM->privateVars->curState = nextState; + setCurState(pFSM, nextState); } else // 状态机没动 { - if(childFSMTable[curState] == NULL){ - fcns->duringActionTable[curState](data); + if(!hasChildFSM(pFSM, curState)){ + doDuring(pFSM); } else{ - Step(childFSMTable[curState]); + FSM *cFSM = getChildFSM(pFSM, curState); + Step(cFSM); } } } @@ -114,12 +112,6 @@ void stepBaseFSM(FSM *pFSM) /* -------------------------------------------------------------------------- */ /* public 函数 */ /* -------------------------------------------------------------------------- */ -void resetBaseFSM(FSM *pFSM) -{ - - pFSM->privateVars->curState = 0; -} - void _stepFSM(FSM *pFSM){ pFSM->publicFcns.step(pFSM); } @@ -138,6 +130,8 @@ void registerChildFSM(FSM *parent, FSM *child, int state){ parent->privateVars->childFSMTable[state] = child; } + + const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; } @@ -213,7 +207,6 @@ FSM* newBaseFSM(int numState){ pFSM->pureVtbl = pureVtbl; pFSM->publicFcns.step = stepBaseFSM; - pFSM->publicFcns.reset = resetBaseFSM; return pFSM; } diff --git a/vscode/FSM_OOP/baseFSM/FSM_private.h b/vscode/FSM_OOP/baseFSM/FSM_private.h index e1897c9..3ef762f 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_private.h +++ b/vscode/FSM_OOP/baseFSM/FSM_private.h @@ -60,7 +60,9 @@ typedef struct FSMPrivateVars }FSMPrivateVars; - +/** + * @brief 纯纯空函数 + */ static void empty_func(){ } @@ -114,9 +116,61 @@ FSMPrivateVars* newFMSPrivateVars(int numState){ } -static int hasChildFSM(FSM *pFSM, int state){ + +/* -------------------------------------------------------------------------- */ +/* 以下开始是FSM私有函数 */ +/* -------------------------------------------------------------------------- */ +static inline FSM * getChildFSM(FSM *pFSM, int state){ + return pFSM->privateVars->childFSMTable[state]; +} + +static inline int hasChildFSM(FSM *pFSM, int state){ return (pFSM->privateVars->childFSMTable[state] != NULL); } +static inline void setCurState(FSM *pFSM, int state){ + pFSM->privateVars->curState = state; +} + + + + +static inline int getCurState(FSM *pFSM){ + return pFSM->privateVars->curState; +} + +static inline void doExit(FSM *pFSM){ + pFSM->privateVars->fcns.exitActionTable[getCurState(pFSM)](pFSM->data); +} + +static inline void doEnter(FSM *pFSM, int state){ + pFSM->privateVars->fcns.enterActionTable[state](pFSM->data); +} + +static inline void doDuring(FSM *pFSM){ + pFSM->privateVars->fcns.duringActionTable[getCurState(pFSM)](pFSM->data); +} + + +static inline void doGeneralTransition(FSM *pFSM){ + pFSM->privateVars->fcns.transitionGeneralAction(pFSM->data); +} + +static inline void doTransition(FSM *pFSM, int index){ + pFSM->privateVars->fcns.transitionTable[index](pFSM->data); +} + + +static void exitFSM(FSM *pFSM) +{ + doExit(pFSM); + + int curState = getCurState(pFSM); + if(hasChildFSM(pFSM, curState)){ + exitFSM(getChildFSM(pFSM, curState)); + } + setCurState(pFSM, 0); +} + #endif diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index ceaadd4..3350b23 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -134,7 +134,7 @@ typedef struct FSM void stepBaseFSM(FSM *pFSM); void constructFSM(FSM* pFSM); FSM* newBaseFSM(int numState); -void resetBaseFSM(FSM *pFSM); +void resetFSM2Idle(FSM *pFSM); /* -------------------------------------------------------------------------- */