diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index 198660d..bb30d7d 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -7,7 +7,7 @@ aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) # set(keytest 789) -set(child_parent 789) +# set(child_parent 789) if(DEFINED keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 60319ed..16a7770 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -29,8 +29,6 @@ */ static inline void setNextState(FSM* pFSM){ int curState = pFSM->privateVars->curState; - if(curState == 0) - return; pFSM->signals.lastTriggeredSignal = Idle_Signal; pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals); @@ -101,20 +99,6 @@ void stepBaseFSM(FSM *pFSM) pFSM->privateVars->curState = nextState; } - else if(curState == 0){ // 处理刚运行进入的默认状态 - nextState = pFSM->privateVars->defaultState; - // 进父状态机 - fcns->enterActionTable[nextState](data); - // 进子状态机 - if(childFSMTable[nextState] != NULL){ - FSM *cFSM = childFSMTable[nextState]; - int cFSMNextState = cFSM->privateVars->defaultState; - cFSM->privateVars->fcns.enterActionTable[cFSMNextState](cFSM->data); - cFSM->privateVars->curState = cFSMNextState; - } - - pFSM->privateVars->curState = nextState; - } else // 状态机没动 { if(childFSMTable[curState] == NULL){ @@ -156,11 +140,6 @@ void registerChildFSM(FSM *parent, FSM *child, int state){ parent->privateVars->childFSMTable[state] = child; } - - - - - const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; } @@ -169,9 +148,6 @@ void _setSignal(FSM *pFSM, Uint16 signalFlag){ pFSM->signals.all |= (1 << signalFlag); } - - - /** * @brief * @deprecated 弃用 @@ -219,14 +195,14 @@ void _clearPreloaderOverFlag(FSM *pFSM){ /* -------------------------------------------------------------------------- */ /* 构造函数,分两段,先新建再赋值 */ /* -------------------------------------------------------------------------- */ -FSM* newBaseFSM(int numState, int defaultState){ +FSM* newBaseFSM(int numState){ typedef void (*StateFuncPtr)(void *); typedef void (*ChildFSMStepFuncPtr)(FSM **); typedef int (*TransitionFuncPtr)(void *, int *); typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *); FSM *pFSM = calloc(1, sizeof(FSM)); - pFSM->privateVars = newFMSPrivateVars(numState, defaultState); + pFSM->privateVars = newFMSPrivateVars(numState); FSMPureVtbl pureVtbl = { .setupHandler = NULL, diff --git a/vscode/FSM_OOP/baseFSM/FSM_private.h b/vscode/FSM_OOP/baseFSM/FSM_private.h index 82b00fb..e1897c9 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_private.h +++ b/vscode/FSM_OOP/baseFSM/FSM_private.h @@ -69,10 +69,9 @@ static void empty_func(){ * @brief 仅在FSM.c中调用,新建私有变量并分配空间 * * @param numState - * @param defaultState * @return FSMPrivateVars* */ -FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){ +FSMPrivateVars* newFMSPrivateVars(int numState){ typedef void (*StateFuncPtr)(void *); typedef void (*ChildFSMStepFuncPtr)(FSM **); typedef int (*TransitionFuncPtr)(void *, int *); @@ -80,7 +79,6 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){ FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars)); privateVars->numState = numState; - privateVars->defaultState = defaultState; privateVars->curState = 0; privateVars->nextState = 0; privateVars->childFSMTable = calloc(numState, sizeof(FSM)); @@ -99,7 +97,8 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){ } - privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); + // 包括默认状态 + privateVars->fcns.selectNextState = calloc(numState+1, sizeof(SelectNextStateFcnPtr)); privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); for (int i = 0; i < numState * numState; i++) { diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index bd222b2..ceaadd4 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -133,7 +133,7 @@ typedef struct FSM /* -------------------------------------------------------------------------- */ void stepBaseFSM(FSM *pFSM); void constructFSM(FSM* pFSM); -FSM* newBaseFSM(int numState, int defaultState); +FSM* newBaseFSM(int numState); void resetBaseFSM(FSM *pFSM); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 85efd52..f49d98d 100644 --- a/vscode/FSM_OOP/template/templateFSM.c +++ b/vscode/FSM_OOP/template/templateFSM.c @@ -92,6 +92,7 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 */ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ + addSelectNextStateFcn(Idle); addSelectNextStateFcn(D); addSelectNextStateFcn(E); @@ -142,7 +143,7 @@ static void step(TemplateFSM* pFSM){ */ TemplateFSM *createTemplateFSM(){ TemplateFSM *pFSM; - pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE); + pFSM = (TemplateFSM *)newBaseFSM(Count_State); // 重新实现的函数 pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index 04ae135..c2b0444 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -50,12 +50,16 @@ typedef enum _State Count_State, /**< 必须在结尾,用来统计状态数量 */ } State; -#define DEFAULT_STATE E /**< 默认状态,Idle状态会先跳转到默认状态 */ + /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ +static State selectNextStateFcn(Idle)(TemplateFSMData *data, FSMSignals *signals){ + return E; +} + static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_A)){