diff --git a/test_on_28377/main.c b/test_on_28377/main.c index 51379e1..c7b5e9f 100644 --- a/test_on_28377/main.c +++ b/test_on_28377/main.c @@ -42,16 +42,18 @@ void childTest(){ for (int i = 0; i < 15; i++) { - ((ChildFSMData *)getData((FSM_Ptr)(cFSM)))->arrindex = i; - ((ParentFSMData *)getData((FSM_Ptr)(pFSM)))->arrindex = i; + ParentFSM_Input(pFSM)->arrindex = i; + SetPreloaderReady(pFSM); - ChildFSMData* data = getData((FSM_Ptr)(cFSM)); + ChildFSM_Input(cFSM)->arrindex = i; + SetPreloaderReady(cFSM); + + ChildFSMData* data = getData((FSM *)(cFSM)); printf(" %d ", data->arrindex); tic(); - vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM); + _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM); toc(index++); - printf("\n"); } } @@ -65,24 +67,14 @@ KeyFSMData* data; void keyFSMTest(){ keyFSM = createKeyFSM(); - data = getData((FSM_Ptr)keyFSM); + data = getData((FSM *)keyFSM); printf("hello 28377\n"); while(1){ - - - -// SetEvent(keyFSM); -// Step(keyFSM); -// setEvent((FSM_Ptr)keyFSM); -// vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM); - - KeyIn *in = preloadIn((FSM_Ptr)keyFSM); - *in = !GPIO_ReadPin(INPUT_GPIO); - preloaderReady((FSM_Ptr)keyFSM); - + *KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO); + SetPreloaderReady(keyFSM); tic(); Step(keyFSM); @@ -133,8 +125,8 @@ void main(void) GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP); -// childTest(); - keyFSMTest(); + childTest(); +// keyFSMTest(); // funptrTest(); } diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index e2e892e..bdbcfa0 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -5,13 +5,18 @@ project(controller) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) -set(keytest 789) + +# set(keytest 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) -else() +elseif(DEFINED child_parent) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest SRC_FSM_USR) +else() + include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/template) + aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/template SRC_FSM_USR) endif() add_executable(test ${SRC_FSM_OOP} ${SRC_FSM_USR}) \ No newline at end of file diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 794e4fd..2dd62cc 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -100,8 +100,6 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){ pFSM->privateVars.preloader.isReady = 0; pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); - - pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); @@ -162,15 +160,15 @@ const void *getData(FSM* pFSM){ return (const void *)pFSM->data; } -void *preloadIn(FSM *pFSM){ +void *_preloadIn(FSM *pFSM){ return pFSM->privateVars.preloader.in; } -void preloaderReady(FSM *pFSM){ +void _setPreloaderReady(FSM *pFSM){ pFSM->privateVars.preloader.isReady = 1; } -FSMVtbl *vptrFSM(FSM* pFSM){ +FSMVtbl *_vptrFSM(FSM* pFSM){ return &pFSM->vtbl; } diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index 820f636..f4381d3 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -5,10 +5,10 @@ #define BASE_PTR (FSM *) typedef struct _FSM FSM; -typedef FSM * FSM_Ptr; -// #define SetEvent(FSM) setEvent((FSM_Ptr)FSM) -#define Step(FSM) vptrFSM((FSM_Ptr)FSM)->step((FSM_Ptr)FSM) +#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) +#define SetPreloaderReady(pFSM) _setPreloaderReady((FSM *)pFSM); + typedef struct _FSMHandler FSMHandler; // 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现 @@ -25,15 +25,14 @@ typedef struct _FSMVtbl { int getFSMCurState(FSM *pFSM); int getFSMCurEvent(FSM *pFSM); -// void setEvent(FSM* pFSM); void setChildNum(FSM *pFSM, int num); void registerChildFSM(FSM *parent, FSM *child, int index); const void *getData(FSM* pFSM); -void *preloadIn(FSM *pFSM); -void preloaderReady(FSM *pFSM); +void *_preloadIn(FSM *pFSM); +void _setPreloaderReady(FSM *pFSM); -FSMVtbl *vptrFSM(FSM* pFSM); +FSMVtbl *_vptrFSM(FSM* pFSM); #endif \ No newline at end of file diff --git a/vscode/FSM_OOP/childtest/ParentFSM.c b/vscode/FSM_OOP/childtest/ParentFSM.c index 48e0d7a..b145f7a 100644 --- a/vscode/FSM_OOP/childtest/ParentFSM.c +++ b/vscode/FSM_OOP/childtest/ParentFSM.c @@ -5,7 +5,6 @@ #include "FSM_protected.h" #define DEFAULT_STATE Idle -#define NAME Parent typedef struct _ParentFSM { @@ -163,7 +162,7 @@ static Event selectEvent(ParentFSMData *data){ 用户自定义事件选择逻辑————————end */ -static void FSM_LOGSM(ParentFSM* pFSM){ +static void printFSM(ParentFSM* pFSM){ FSM_LOG("\tParentFSM: "); FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]); @@ -171,7 +170,7 @@ static void FSM_LOGSM(ParentFSM* pFSM){ static void step(ParentFSM* pFSM){ - FSM_LOGSM(pFSM); + printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); } @@ -187,6 +186,11 @@ static void initData(ParentFSM *pFSM){ pFSM->base.data = data; } +static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现 + pFSM->base.privateVars.preloader.in = malloc(sizeof(ParentFSMData)); + pFSM->base.privateVars.preloader.preloadSize = sizeof(ParentFSMData); +} + ParentFSM *createParentFSM(){ @@ -197,8 +201,9 @@ ParentFSM *createParentFSM(){ pFSM->base.vtbl.selectEvent = selectEvent; pFSM->base.vtbl.initData = initData; pFSM->base.vtbl.setupHandler = setupHandler; + pFSM->base.vtbl.initDataLoader = initDataLoader; - constructFSM((FSM_Ptr)pFSM); + constructFSM((FSM *)pFSM); return pFSM; } diff --git a/vscode/FSM_OOP/childtest/childFSM.c b/vscode/FSM_OOP/childtest/childFSM.c index d69a152..c3b1c63 100644 --- a/vscode/FSM_OOP/childtest/childFSM.c +++ b/vscode/FSM_OOP/childtest/childFSM.c @@ -42,6 +42,11 @@ static void initData(ChildFSM *pFSM){ // 必须重新实现 pFSM->base.data = data; } +static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现 + pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData)); + pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData); +} + static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(during, E); addStateActionFcn(during, D); @@ -69,8 +74,9 @@ ChildFSM *createChildFSM(){ pFSM->base.vtbl.selectEvent = selectEvent; pFSM->base.vtbl.initData = initData; pFSM->base.vtbl.setupHandler = setupHandler; + pFSM->base.vtbl.initDataLoader = initDataLoader; - constructFSM((FSM_Ptr)pFSM); + constructFSM((FSM *)pFSM); return pFSM; } diff --git a/vscode/FSM_OOP/childtest/childFSM.h b/vscode/FSM_OOP/childtest/childFSM.h index 23f9aaa..df4e4e8 100644 --- a/vscode/FSM_OOP/childtest/childFSM.h +++ b/vscode/FSM_OOP/childtest/childFSM.h @@ -1,6 +1,8 @@ #ifndef __CHILD_FSM_H_ #define __CHILD_FSM_H_ +#define ChildFSM_Input(pFSM) ((ChildFSMData *)_preloadIn((FSM *)pFSM)) + typedef struct _childFSMData { int arrindex; diff --git a/vscode/FSM_OOP/childtest/childFSM_private.h b/vscode/FSM_OOP/childtest/childFSM_private.h index 37e145c..f51c4f5 100644 --- a/vscode/FSM_OOP/childtest/childFSM_private.h +++ b/vscode/FSM_OOP/childtest/childFSM_private.h @@ -114,7 +114,7 @@ const static char *eventStr[] = { }; static void printFSM(ChildFSM* pFSM){ FSM_LOG(" \t\tChildFSM: "); - FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]); } diff --git a/vscode/FSM_OOP/childtest/main.c b/vscode/FSM_OOP/childtest/main.c index b0a7a36..28264ff 100644 --- a/vscode/FSM_OOP/childtest/main.c +++ b/vscode/FSM_OOP/childtest/main.c @@ -17,14 +17,17 @@ int main(){ for (int i = 0; i < 15; i++) { - ((ChildFSMData *)getData((FSM_Ptr)(cFSM)))->arrindex = i; - ((ParentFSMData *)getData((FSM_Ptr)(pFSM)))->arrindex = i; + ParentFSM_Input(pFSM)->arrindex = i; + SetPreloaderReady(pFSM); - ChildFSMData* data = getData((FSM_Ptr)(cFSM)); + ChildFSM_Input(cFSM)->arrindex = i; + SetPreloaderReady(cFSM); + + ChildFSMData* data = getData((FSM *)(cFSM)); printf(" %d ", data->arrindex); - vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM); + _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM); printf("\n"); } diff --git a/vscode/FSM_OOP/childtest/parentFSM.h b/vscode/FSM_OOP/childtest/parentFSM.h index 39ad9a8..49f26bd 100644 --- a/vscode/FSM_OOP/childtest/parentFSM.h +++ b/vscode/FSM_OOP/childtest/parentFSM.h @@ -1,6 +1,8 @@ #ifndef __PARENT_FSM_H_ #define __PARENT_FSM_H_ +#define ParentFSM_Input(pFSM) ((ParentFSMData *)_preloadIn((FSM *)pFSM)) + typedef struct _parentFSMData { int arrindex; diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 664138d..575b107 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -27,7 +27,7 @@ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 static void step(KeyFSM* pFSM){ printFSM(pFSM); - stepBaseFSM((FSM_Ptr)pFSM); + stepBaseFSM((FSM *)pFSM); KeyFSMData * data = pFSM->base.data; @@ -98,7 +98,7 @@ KeyFSM *createKeyFSM(){ pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; - constructFSM((FSM_Ptr)pFSM); + constructFSM((FSM *)pFSM); return pFSM; } diff --git a/vscode/FSM_OOP/keytest/keyFSM.h b/vscode/FSM_OOP/keytest/keyFSM.h index e0baf42..78c0c12 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.h +++ b/vscode/FSM_OOP/keytest/keyFSM.h @@ -2,7 +2,7 @@ #define __KEY_FSM_H_ - +#define KeyFSM_Input(pFSM) (KeyIn *)_preloadIn((FSM *)pFSM) typedef enum _keyIn{ Up, diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index f27d0ed..2e290fe 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -47,7 +47,6 @@ static void actionFcn(enter, Waiting)(KeyFSMData* data){ static void actionFcn(during, DownDebouncing)(KeyFSMData* data) { - data->countDelay++; FSM_LOG(" during开启消抖 "); } @@ -267,7 +266,7 @@ const static char *eventStr[] = { static void printFSM(KeyFSM* pFSM){ KeyFSMData* data = pFSM->base.data; FSM_LOG("KeyFSM: "); - FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]); } diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c index ffe2413..ec840b6 100644 --- a/vscode/FSM_OOP/keytest/main.c +++ b/vscode/FSM_OOP/keytest/main.c @@ -1,6 +1,6 @@ #include -#include "keyFSM.h" +#include "templateFSM.h" #include "FSM_public.h" #define NUM 60 @@ -19,13 +19,6 @@ KeyIn testin[NUM] = { pDown,pDown,pDown,pDown }; -typedef void (*fcn)(); - -void printtest(){ - printf("fcn\n"); -} - - int main(){ KeyFSM* keyFSM = createKeyFSM(); @@ -33,25 +26,18 @@ int main(){ for (int i = 0; i < NUM; i++) { printf("第%d次: ",i+1); - const KeyFSMData* data = getData((FSM_Ptr)keyFSM); - - *(KeyIn *)preloadIn((FSM_Ptr)keyFSM) = testin[i]; - preloaderReady((FSM_Ptr)keyFSM); + const KeyFSMData* data = getData((FSM *)keyFSM); + *KeyFSM_Input(keyFSM) = testin[i]; + SetPreloaderReady(keyFSM); Step(keyFSM); if(data->out){ printf("\t\t\t\t%d", data->out); } - - printf("\n"); } printf("hello world, 你好世界\n"); - - fcn fcnptr = printtest; - (fcnptr == NULL) ? : fcnptr(); - return 0; } \ No newline at end of file diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c new file mode 100644 index 0000000..2b969c2 --- /dev/null +++ b/vscode/FSM_OOP/template/main.c @@ -0,0 +1,25 @@ +#include + +#include "templateFSM.h" +#include "FSM_public.h" + +TemplateFSM *pFSM; + +int main(){ + + pFSM = createTemplateFSM(); + + + for (int i = 0; i < 15; i++) + { + TemplateFSM_Input(pFSM)->arrindex = i; + SetPreloaderReady(pFSM); + + printf("%d," ,i); + + Step(pFSM); + printf("\n"); + } + + return 0; +} \ No newline at end of file diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 6dd06b7..310564f 100644 --- a/vscode/FSM_OOP/template/templateFSM.c +++ b/vscode/FSM_OOP/template/templateFSM.c @@ -24,7 +24,7 @@ static Event ceventArr[20] = { }; static Event selectEvent(TemplateFSMData *data){ // 必须重新实现 - return ceventArr[data->arrindex]; + return ceventArr[data->in.arrindex]; } static void step(TemplateFSM* pFSM){ @@ -34,25 +34,41 @@ static void step(TemplateFSM* pFSM){ static void initData(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); - data->arrindex = 0; + TemplateFSMData tempData = { + .in = { + .arrindex = 0, + .x = 0, + }, + .inner1 = 0, + .y1 = 0, + }; + *data = tempData; pFSM->base.data = data; } +static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 + pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn)); + pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn); +} + + + static void setupHandler(FSMHandler* fcns){ // 必须重新实现 - fcns->duringActionTable[E] = (Avoid_WARNING_State_Fcns)actionFcn(during, E); - fcns->duringActionTable[D] = (Avoid_WARNING_State_Fcns)actionFcn(during, D); - fcns->enterActionTable[D] = (Avoid_WARNING_State_Fcns)actionFcn(enter, D); - fcns->enterActionTable[E] = (Avoid_WARNING_State_Fcns)actionFcn(enter, E); + addStateActionFcn(during, E); + addStateActionFcn(during, D); + addStateActionFcn(enter, E); + addStateActionFcn(enter, D); + addStateActionFcn(exit, E); + addStateActionFcn(exit, D); - fcns->exitActionTable[D] = (Avoid_WARNING_State_Fcns)D_exitAction; - fcns->exitActionTable[E] = (Avoid_WARNING_State_Fcns)E_exitAction; + addTransitionHandler(Idle, Idle2D); + addTransitionHandler(Idle, Idle2E); + addTransitionHandler(D, D2E); + addTransitionHandler(E, E2D); - fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_Transition_Handler)transitionHandler(Idle2D); - fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_Transition_Handler)transitionHandler(Idle2E); - fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_Transition_Handler)transitionHandler(D2E); - fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_Transition_Handler)transitionHandler(E2D); + addDelayHandler(Idle2D); } /* @@ -60,16 +76,17 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 */ TemplateFSM *createTemplateFSM(){ - TemplateFSM *pFSM; pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); - pFSM->base.vtbl.step = (Avoid_WARNING_State_Fcns)step; - pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent; - pFSM->base.vtbl.initData = (Avoid_WARNING_State_Fcns)initData; + pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; + pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; + pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; + + pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; - constructFSM((FSM_Ptr)pFSM); + constructFSM((FSM *)pFSM); return pFSM; } diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index 10eef6a..610a13f 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -1,13 +1,24 @@ #ifndef __TEMPLATE_FSM_H_ #define __TEMPLATE_FSM_H_ -typedef struct _templateFSMData + +#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM)) + + +typedef struct _templateFSMIn { int arrindex; + int x; +}TemplateFSMIn; + +typedef struct _templateFSMData +{ + TemplateFSMIn in; + int y1; + int inner1; }TemplateFSMData; typedef struct _TemplateFSM TemplateFSM; - TemplateFSM *createTemplateFSM(); diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index 7605ffe..240a866 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -31,28 +31,28 @@ typedef enum _State static void actionFcn(enter, D)() { - printf(" enterD "); + FSM_LOG(" enterD "); } static void actionFcn(during, D)() { - printf(" duringD "); + FSM_LOG(" duringD "); } static void actionFcn(exit, D)() { - printf(" exitD "); + FSM_LOG(" exitD "); } static void actionFcn(enter, E)() { - printf(" enterE "); + FSM_LOG(" enterE "); } static void actionFcn(during, E)() { - printf(" duringE "); + FSM_LOG(" duringE "); } static void actionFcn(exit, E)() { - printf(" exitE "); + FSM_LOG(" exitE "); } /* @@ -72,25 +72,29 @@ typedef enum _Event{ static State transitionHandler(Idle2D)() { - printf(" Idle2D "); + FSM_LOG(" Idle2D "); return D; } +static void delayHanlder(Idle2D)(TemplateFSMData *data){ + FSM_LOG(" DelayIdle2D"); +} + static State transitionHandler(Idle2E)() { - printf(" Idle2E "); + FSM_LOG(" Idle2E "); return E; } static State transitionHandler(D2E)() { - printf(" D2E "); + FSM_LOG(" D2E "); return E; } static State transitionHandler(E2D)() { - printf(" E2D "); + FSM_LOG(" E2D "); return D; } @@ -113,8 +117,8 @@ const static char *eventStr[] = { "E2D", }; static void printFSM(TemplateFSM* pFSM){ - printf(" \t\tTemplateFSM: "); - printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + FSM_LOG(" \t\tTemplateFSM: "); + FSM_LOG("上次事件:%s, 当前状态:%s, 动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)]); }