diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index bb30d7d..198660d 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 16a7770..95d6b65 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -92,9 +92,7 @@ void stepBaseFSM(FSM *pFSM) // 进子状态机,必须从默认状态开始 if(childFSMTable[nextState] != NULL){ FSM *cFSM = childFSMTable[nextState]; - int cFSMNextState = cFSM->privateVars->defaultState; - cFSM->privateVars->fcns.enterActionTable[cFSMNextState](cFSM->data); - cFSM->privateVars->curState = cFSMNextState; + Step(cFSM); } pFSM->privateVars->curState = nextState; diff --git a/vscode/FSM_OOP/childtest/ParentFSM.c b/vscode/FSM_OOP/childtest/ParentFSM.c index 27a61db..2f73856 100644 --- a/vscode/FSM_OOP/childtest/ParentFSM.c +++ b/vscode/FSM_OOP/childtest/ParentFSM.c @@ -73,6 +73,7 @@ static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现 */ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ + addSelectNextStateFcn(Idle); addSelectNextStateFcn(A); addSelectNextStateFcn(B); addSelectNextStateFcn(C); @@ -131,7 +132,7 @@ void bindChildFSM(FSM *pFSM, FSM *cFSM){ */ ParentFSM *createParentFSM(){ ParentFSM *pFSM; - pFSM = (ParentFSM *)newBaseFSM(Count_State, DEFAULT_STATE); + pFSM = (ParentFSM *)newBaseFSM(Count_State); // 重新实现的函数 pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; diff --git a/vscode/FSM_OOP/childtest/ParentFSM_private.h b/vscode/FSM_OOP/childtest/ParentFSM_private.h index b9f2683..01e059d 100644 --- a/vscode/FSM_OOP/childtest/ParentFSM_private.h +++ b/vscode/FSM_OOP/childtest/ParentFSM_private.h @@ -35,14 +35,17 @@ typedef enum _State Count_State, /**< 必须在结尾,用来统计状态数量 */ } State; -#define DEFAULT_STATE A /**< 默认状态,Idle状态会先跳转到默认状态 */ /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ -static State selectNextStateFcn(A)(ParentFSM *data, FSMSignals *signals){ +static State selectNextStateFcn(Idle)(ParentFSMData *data, FSMSignals *signals){ + return A; +} + +static State selectNextStateFcn(A)(ParentFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toB)){ signals->lastTriggeredSignal = Signal_toB; return B; @@ -50,7 +53,7 @@ static State selectNextStateFcn(A)(ParentFSM *data, FSMSignals *signals){ return Idle; } -static State selectNextStateFcn(B)(ParentFSM *data, FSMSignals *signals){ +static State selectNextStateFcn(B)(ParentFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toA)){ signals->lastTriggeredSignal = Signal_toA; return A; diff --git a/vscode/FSM_OOP/childtest/childFSM.c b/vscode/FSM_OOP/childtest/childFSM.c index e795b48..42c4fd1 100644 --- a/vscode/FSM_OOP/childtest/childFSM.c +++ b/vscode/FSM_OOP/childtest/childFSM.c @@ -73,6 +73,7 @@ static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现 */ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ + addSelectNextStateFcn(Idle); addSelectNextStateFcn(D); addSelectNextStateFcn(E); @@ -123,7 +124,7 @@ static void step(ChildFSM* pFSM){ */ ChildFSM *createChildFSM(){ ChildFSM *pFSM; - pFSM = (ChildFSM *)newBaseFSM(Count_State, DEFAULT_STATE); + pFSM = (ChildFSM *)newBaseFSM(Count_State); // 重新实现的函数 pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; diff --git a/vscode/FSM_OOP/childtest/childFSM_private.h b/vscode/FSM_OOP/childtest/childFSM_private.h index f3ac364..b0d46ec 100644 --- a/vscode/FSM_OOP/childtest/childFSM_private.h +++ b/vscode/FSM_OOP/childtest/childFSM_private.h @@ -34,14 +34,18 @@ typedef enum _State Count_State, /**< 必须在结尾,用来统计状态数量 */ } State; -#define DEFAULT_STATE D /**< 默认状态,Idle状态会先跳转到默认状态 */ /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ +static State selectNextStateFcn(Idle)(ChildFSMData *data, FSMSignals *signals){ + if(data->external.x == 1) + return D; + else + return E; +} - -static State selectNextStateFcn(D)(ChildFSM *data, FSMSignals *signals){ +static State selectNextStateFcn(D)(ChildFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toE)){ signals->lastTriggeredSignal = Signal_toE; return E; @@ -49,7 +53,7 @@ static State selectNextStateFcn(D)(ChildFSM *data, FSMSignals *signals){ return Idle; } -static State selectNextStateFcn(E)(ChildFSM *data, FSMSignals *signals){ +static State selectNextStateFcn(E)(ChildFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toD)){ signals->lastTriggeredSignal = Signal_toD; return D; diff --git a/vscode/FSM_OOP/childtest/main.c b/vscode/FSM_OOP/childtest/main.c index 0b0fec2..0d93dae 100644 --- a/vscode/FSM_OOP/childtest/main.c +++ b/vscode/FSM_OOP/childtest/main.c @@ -16,6 +16,7 @@ int main(){ pFSM = createParentFSM(); registerChildFSM(pFSM, cFSM, 2); + ((ParentFSMData *)GetData(cFSM))->external.x = 1; for (int k = 0; k < 15; k++) { @@ -23,6 +24,10 @@ int main(){ SetSignal(pFSM, i[k]); SetSignal(cFSM, j[k]); + if(k > 5){ + ((ParentFSMData *)GetData(cFSM))->external.x = 0; + } + Step(pFSM);