diff --git a/CMakeLists.txt b/CMakeLists.txt index bf72732..72e13d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,13 +3,15 @@ cmake_minimum_required(VERSION 3.28) project(controller) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM) -include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/usr) - aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) -aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/usr SRC_FSM_USR) -aux_source_directory(src SRC_SUB) -aux_source_directory(. SRC_CUR) +# set(keytest 123) +if(DEFINED keytest) + include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) + aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR) +else() + include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest) + aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest SRC_FSM_USR) +endif() -add_executable(test ${SRC_SUB} ${SRC_CUR} ${SRC_FSM_OOP} ${SRC_FSM_USR}) -include_directories(include) \ No newline at end of file +add_executable(test ${SRC_FSM_OOP} ${SRC_FSM_USR}) \ No newline at end of file diff --git a/FSM_OOP/baseFSM/FSM_protected.h b/FSM_OOP/baseFSM/FSM_protected.h index 893c1f1..eb760ec 100644 --- a/FSM_OOP/baseFSM/FSM_protected.h +++ b/FSM_OOP/baseFSM/FSM_protected.h @@ -3,6 +3,7 @@ #include "FSM_public.h" +// #define DSP28377 #ifdef DSP28377 #define NDEBUG #else diff --git a/FSM_OOP/baseFSM/FSM_public.h b/FSM_OOP/baseFSM/FSM_public.h index 021e7a8..8aec8c7 100644 --- a/FSM_OOP/baseFSM/FSM_public.h +++ b/FSM_OOP/baseFSM/FSM_public.h @@ -1,8 +1,8 @@ #ifndef __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_ -// #define BASE_FSM(ptr) ((FSM *)(ptr)) -// #define BASE_PTR (FSM *) +#define BASE_FSM(ptr) ((FSM *)(ptr)) +#define BASE_PTR (FSM *) typedef struct _FSM FSM; typedef FSM * FSM_Ptr; diff --git a/FSM_OOP/childtest/ParentFSM.c b/FSM_OOP/childtest/ParentFSM.c index 324c7fe..48e0d7a 100644 --- a/FSM_OOP/childtest/ParentFSM.c +++ b/FSM_OOP/childtest/ParentFSM.c @@ -50,94 +50,90 @@ const static char *eventStr[] = { State StartHandler(){ - printf(" start "); + FSM_LOG(" start "); return A; } State A2BHandler(){ - printf(" A2B "); + FSM_LOG(" A2B "); return B; } State B2AHandler(){ - printf(" B2A "); + FSM_LOG(" B2A "); return A; } State B2CHandler(){ - printf(" B2C "); + FSM_LOG(" B2C "); return C; } State C2AHandler(){ - printf(" C2A "); + FSM_LOG(" C2A "); return A; } void A_enterAction(){ - printf(" enterA "); + FSM_LOG(" enterA "); } void A_duringAction(){ - printf(" duringA "); + FSM_LOG(" duringA "); } void A_exitAction(){ - printf(" exitA "); + FSM_LOG(" exitA "); } -void B_enterAction(FSM *pFSM){ - printf(" enterB "); +void B_enterAction(void *data, FSM **childFSM){ + FSM_LOG(" enterB "); - FSM *cFSM = pFSM->privateVars.childFSM[0]; + FSM *cFSM = childFSM[0]; cFSM->vtbl.step(cFSM); } -void B_duringAction(FSM *pFSM){ - printf(" duringB "); +void B_duringAction(void *data, FSM **childFSM){ + FSM_LOG(" duringB "); - FSM *cFSM = pFSM->privateVars.childFSM[0]; + FSM *cFSM = childFSM[0]; cFSM->vtbl.step(cFSM); } -void B_exitAction(FSM *pFSM){ - FSM *cFSM = pFSM->privateVars.childFSM[0]; +void B_exitAction(void *data, FSM **childFSM){ + FSM *cFSM = childFSM[0]; cFSM->vtbl.reset(cFSM); - printf(" exitB "); + FSM_LOG(" exitB "); } void C_enterAction(){ - printf(" enterC "); + FSM_LOG(" enterC "); } void C_duringAction(){ - printf(" duringC "); + FSM_LOG(" duringC "); } void C_exitAction(){ - printf(" exitC "); + FSM_LOG(" exitC "); } static void setupHandler(FSMHandler* fcns){ - typedef int (*transitionHandlerPtr)(FSM* pFSM); - #define AVOID_WARNING(handler) (transitionHandlerPtr)handler - fcns->duringActionTable[A] = A_duringAction; - fcns->duringActionTable[B] = B_duringAction; - fcns->duringActionTable[C] = C_duringAction; + addStateActionFcn(during, A); + addStateActionFcn(during, B); + addStateActionFcn(during, C); + addStateActionFcn(enter, A); + addStateActionFcn(enter, B); + addStateActionFcn(enter, C); + addStateActionFcn(exit, A); + addStateActionFcn(exit, B); + addStateActionFcn(exit, C); - fcns->enterActionTable[B] = B_enterAction; - fcns->enterActionTable[C] = C_enterAction; - fcns->enterActionTable[A] = A_enterAction; - - fcns->exitActionTable[A] = A_exitAction; - fcns->exitActionTable[B] = B_exitAction; - fcns->exitActionTable[C] = C_exitAction; - - fcns->transitionTable[index(Idle, Start)] = AVOID_WARNING(StartHandler); - fcns->transitionTable[index(A, A2B)] = AVOID_WARNING(A2BHandler); - fcns->transitionTable[index(B, B2A)] = AVOID_WARNING(B2AHandler); - fcns->transitionTable[index(B, B2C)] = AVOID_WARNING(B2CHandler); - fcns->transitionTable[index(C, C2A)] = AVOID_WARNING(C2AHandler); + addTransitionHandler(Idle, Start); + addTransitionHandler(A, A2B); + addTransitionHandler(B, B2A); + addTransitionHandler(B, B2C); + addTransitionHandler(C, C2A); } @@ -167,21 +163,21 @@ static Event selectEvent(ParentFSMData *data){ 用户自定义事件选择逻辑————————end */ -static void printFSM(ParentFSM* pFSM){ - printf("\tParentFSM: "); +static void FSM_LOGSM(ParentFSM* pFSM){ + FSM_LOG("\tParentFSM: "); - printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]); + FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]); } static void step(ParentFSM* pFSM){ - printFSM(pFSM); + FSM_LOGSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); } static void reset(ParentFSM* pFSM){ resetBaseFSM(BASE_FSM(pFSM)); - printf(" ParentFSM-reset"); + FSM_LOG(" ParentFSM-reset"); } static void initData(ParentFSM *pFSM){ @@ -197,11 +193,10 @@ ParentFSM *createParentFSM(){ ParentFSM *pFSM; pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); - pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step; - pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent; - pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData; - pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; - + pFSM->base.vtbl.step = step; + pFSM->base.vtbl.selectEvent = selectEvent; + pFSM->base.vtbl.initData = initData; + pFSM->base.vtbl.setupHandler = setupHandler; constructFSM((FSM_Ptr)pFSM); return pFSM; diff --git a/FSM_OOP/childtest/childFSM.c b/FSM_OOP/childtest/childFSM.c index 686fa7e..d69a152 100644 --- a/FSM_OOP/childtest/childFSM.c +++ b/FSM_OOP/childtest/childFSM.c @@ -36,23 +36,24 @@ static void initData(ChildFSM *pFSM){ // 必须重新实现 ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData)); data->arrindex = 0; + pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData)); + pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData); + pFSM->base.data = data; } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 - fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E); - fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D); + addStateActionFcn(during, E); + addStateActionFcn(during, D); + addStateActionFcn(enter, D); + addStateActionFcn(exit, D); + addStateActionFcn(enter, E); + addStateActionFcn(exit, E); - fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D); - fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E); - - fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction; - fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction; - - fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D); - fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E); - fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E); - fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D); + addTransitionHandler(Idle, Idle2D); + addTransitionHandler(Idle, Idle2E); + addTransitionHandler(D, D2E); + addTransitionHandler(E, E2D); } /* @@ -64,10 +65,10 @@ ChildFSM *createChildFSM(){ ChildFSM *pFSM; pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); - pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step; - pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent; - pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData; - pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; + pFSM->base.vtbl.step = step; + pFSM->base.vtbl.selectEvent = selectEvent; + pFSM->base.vtbl.initData = initData; + pFSM->base.vtbl.setupHandler = setupHandler; constructFSM((FSM_Ptr)pFSM); diff --git a/FSM_OOP/childtest/childFSM_private.h b/FSM_OOP/childtest/childFSM_private.h index 3560f94..37e145c 100644 --- a/FSM_OOP/childtest/childFSM_private.h +++ b/FSM_OOP/childtest/childFSM_private.h @@ -31,28 +31,28 @@ typedef enum _State void actionFcn(enter, D)() { - printf(" enterD "); + FSM_LOG(" enterD "); } void actionFcn(during, D)() { - printf(" duringD "); + FSM_LOG(" duringD "); } void actionFcn(exit, D)() { - printf(" exitD "); + FSM_LOG(" exitD "); } void actionFcn(enter, E)() { - printf(" enterE "); + FSM_LOG(" enterE "); } void actionFcn(during, E)() { - printf(" duringE "); + FSM_LOG(" duringE "); } void actionFcn(exit, E)() { - printf(" exitE "); + FSM_LOG(" exitE "); } /* @@ -72,25 +72,25 @@ typedef enum _Event{ State transitionHandler(Idle2D)() { - printf(" Idle2D "); + FSM_LOG(" Idle2D "); return D; } State transitionHandler(Idle2E)() { - printf(" Idle2E "); + FSM_LOG(" Idle2E "); return E; } State transitionHandler(D2E)() { - printf(" D2E "); + FSM_LOG(" D2E "); return E; } State transitionHandler(E2D)() { - printf(" E2D "); + FSM_LOG(" E2D "); return D; } @@ -113,8 +113,8 @@ const static char *eventStr[] = { "E2D", }; static void printFSM(ChildFSM* pFSM){ - printf(" \t\tChildFSM: "); - printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + FSM_LOG(" \t\tChildFSM: "); + FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); } diff --git a/FSM_OOP/childtest/main.c b/FSM_OOP/childtest/main.c index cfe69d8..a5c1ae5 100644 --- a/FSM_OOP/childtest/main.c +++ b/FSM_OOP/childtest/main.c @@ -12,8 +12,8 @@ int main(){ cFSM = createChildFSM(); pFSM = createParentFSM(); - setChildNum(BASE_FSM(pFSM), 1); - registerChildFSM(BASE_FSM(pFSM), BASE_FSM(cFSM), 0); + setChildNum((pFSM), 1); + registerChildFSM((pFSM), (cFSM), 0); for (int i = 0; i < 15; i++) { @@ -23,7 +23,6 @@ int main(){ ChildFSMData* data = getData((FSM_Ptr)(cFSM)); printf(" %d ", data->arrindex); - setEvent((FSM_Ptr)pFSM); vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM);