封装了一下函数,更好懂了
This commit is contained in:
parent
58d2918d06
commit
f48889bf23
|
@ -73,37 +73,35 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
|
|
||||||
if(nextState && curState != nextState){ // 状态切换
|
if(nextState && curState != nextState){ // 状态切换
|
||||||
// 退子状态机
|
// 退子状态机
|
||||||
if(childFSMTable[curState] != NULL){
|
if(hasChildFSM(pFSM, curState)){
|
||||||
FSM *cFSM = childFSMTable[curState];
|
FSM *cFSM = getChildFSM(pFSM, curState);
|
||||||
int cFSMCurState = cFSM->privateVars->curState;
|
exitFSM(cFSM);
|
||||||
cFSM->privateVars->fcns.exitActionTable[cFSMCurState](cFSM->data);
|
|
||||||
resetBaseFSM(cFSM);
|
|
||||||
}
|
}
|
||||||
// 退父状态机
|
// 退状态机
|
||||||
fcns->exitActionTable[curState](data);
|
doExit(pFSM);
|
||||||
|
|
||||||
// 转移函数
|
// 转移函数
|
||||||
fcns->transitionTable[index](data); // 有特定的状态转移函数
|
doTransition(pFSM, index); // 有特定的状态转移函数
|
||||||
fcns->transitionGeneralAction(data); // 通用状态转移函数
|
doGeneralTransition(pFSM); // 通用状态转移函数
|
||||||
|
|
||||||
// 进父状态机
|
// 进状态机
|
||||||
fcns->enterActionTable[nextState](data);
|
doEnter(pFSM, nextState);
|
||||||
|
|
||||||
// 进子状态机,必须从默认状态开始
|
// 进子状态机,必须从默认状态开始
|
||||||
if(childFSMTable[nextState] != NULL){
|
if(hasChildFSM(pFSM, nextState)){
|
||||||
FSM *cFSM = childFSMTable[nextState];
|
FSM *cFSM = getChildFSM(pFSM, nextState);
|
||||||
Step(cFSM);
|
Step(cFSM);
|
||||||
}
|
}
|
||||||
|
setCurState(pFSM, nextState);
|
||||||
pFSM->privateVars->curState = nextState;
|
|
||||||
}
|
}
|
||||||
else // 状态机没动
|
else // 状态机没动
|
||||||
{
|
{
|
||||||
if(childFSMTable[curState] == NULL){
|
if(!hasChildFSM(pFSM, curState)){
|
||||||
fcns->duringActionTable[curState](data);
|
doDuring(pFSM);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Step(childFSMTable[curState]);
|
FSM *cFSM = getChildFSM(pFSM, curState);
|
||||||
|
Step(cFSM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,12 +112,6 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* public 函数 */
|
/* public 函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
void resetBaseFSM(FSM *pFSM)
|
|
||||||
{
|
|
||||||
|
|
||||||
pFSM->privateVars->curState = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _stepFSM(FSM *pFSM){
|
void _stepFSM(FSM *pFSM){
|
||||||
pFSM->publicFcns.step(pFSM);
|
pFSM->publicFcns.step(pFSM);
|
||||||
}
|
}
|
||||||
|
@ -138,6 +130,8 @@ void registerChildFSM(FSM *parent, FSM *child, int state){
|
||||||
parent->privateVars->childFSMTable[state] = child;
|
parent->privateVars->childFSMTable[state] = child;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const void *_getData(FSM* pFSM){
|
const void *_getData(FSM* pFSM){
|
||||||
return (const void *)pFSM->data;
|
return (const void *)pFSM->data;
|
||||||
}
|
}
|
||||||
|
@ -213,7 +207,6 @@ FSM* newBaseFSM(int numState){
|
||||||
pFSM->pureVtbl = pureVtbl;
|
pFSM->pureVtbl = pureVtbl;
|
||||||
|
|
||||||
pFSM->publicFcns.step = stepBaseFSM;
|
pFSM->publicFcns.step = stepBaseFSM;
|
||||||
pFSM->publicFcns.reset = resetBaseFSM;
|
|
||||||
|
|
||||||
return pFSM;
|
return pFSM;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,9 @@ typedef struct FSMPrivateVars
|
||||||
|
|
||||||
}FSMPrivateVars;
|
}FSMPrivateVars;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 纯纯空函数
|
||||||
|
*/
|
||||||
static void empty_func(){
|
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);
|
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
|
#endif
|
||||||
|
|
|
@ -134,7 +134,7 @@ typedef struct FSM
|
||||||
void stepBaseFSM(FSM *pFSM);
|
void stepBaseFSM(FSM *pFSM);
|
||||||
void constructFSM(FSM* pFSM);
|
void constructFSM(FSM* pFSM);
|
||||||
FSM* newBaseFSM(int numState);
|
FSM* newBaseFSM(int numState);
|
||||||
void resetBaseFSM(FSM *pFSM);
|
void resetFSM2Idle(FSM *pFSM);
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
Loading…
Reference in New Issue