diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index 7dbe98e..bdbcfa0 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -6,7 +6,7 @@ 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) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index f5610fa..946b286 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -22,7 +22,7 @@ void resetBaseFSM(FSM *pFSM) static inline void setEvent(FSM* pFSM){ assert(pFSM->vtbl.selectEvent); - pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data); + pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data, pFSM->signals); if(0 == pFSM->privateVars.numChild){ return; @@ -47,6 +47,7 @@ void stepBaseFSM(FSM *pFSM) { preload(pFSM); setEvent(pFSM); + pFSM->vtbl.resetSignals(pFSM); FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; @@ -114,6 +115,7 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){ .setupHandler = NULL, .initData = NULL, .initDataLoader = NULL, + .initSignals = NULL, }; pFSM->vtbl = vtbl; @@ -125,18 +127,18 @@ void constructFSM(FSM* pFSM){ assert(pFSM->vtbl.setupHandler); assert(pFSM->vtbl.initData); assert(pFSM->vtbl.initDataLoader); + assert(pFSM->vtbl.initSignals); pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns); pFSM->vtbl.initData(pFSM); pFSM->vtbl.initDataLoader(pFSM); + pFSM->vtbl.initSignals(pFSM); } /* public 函数 */ - - int getFSMCurState(FSM *pFSM){ return pFSM->privateVars.curState; } @@ -156,18 +158,34 @@ void registerChildFSM(FSM *parent, FSM *child, int index){ parent->privateVars.childFSM[index] = child; } -const void *getData(FSM* pFSM){ +const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; } +void *_getSignals(FSM* pFSM){ + return pFSM->signals; +} + + void *_preloadIn(FSM *pFSM){ return pFSM->privateVars.preloader.in; } void _preloaderGetReady(FSM *pFSM){ + if(pFSM->privateVars.preloader.isReady){ + pFSM->privateVars.preloader.isOverflow = 1; + } pFSM->privateVars.preloader.isReady = 1; } +int _getPreloaderOverFlag(FSM *pFSM){ + return pFSM->privateVars.preloader.isOverflow; +} + +void _clearPreloaderOverFlag(FSM *pFSM){ + pFSM->privateVars.preloader.isOverflow = 0; +} + FSMVtbl *_vptrFSM(FSM* pFSM){ return &pFSM->vtbl; diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index fc23698..565eca3 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -32,7 +32,7 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_Delay_Handlers)(void *data); typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); -typedef int (*Avoid_WARNING_SelectEvent)(void *data); +typedef int (*Avoid_WARNING_SelectEvent)(void *data, void *signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -60,6 +60,7 @@ typedef struct _FSMDataLoader { void *in; int isReady; + int isOverflow; size_t preloadSize; }FSMDataLoader; @@ -93,6 +94,7 @@ typedef struct _FSM // protected void *data; + void *signals; } FSM; diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index 8f4cc6a..a394855 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -6,31 +6,42 @@ typedef struct _FSM FSM; -#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) -#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); - +#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) +#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); +#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) +#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) +#define GetData(pFSM) _getData((FSM*)pFSM) + typedef struct _FSMHandler FSMHandler; // 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现 typedef struct _FSMVtbl { // 状态机控制 - int (*selectEvent)(void *data); // 可以认为是纯虚函数, 子类必须重新实现 + int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现 void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*initData)(FSM *pFSM); // 子类必须重新实现 + void (*initSignals)(FSM *pFSM); // 子类必须重新实现 + void (*resetSignals)(FSM *pFSM); // 子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现 }FSMVtbl; - +/* --------------------------------- 状态机信息获取 -------------------------------- */ int getFSMCurState(FSM *pFSM); int getFSMCurEvent(FSM *pFSM); void setChildNum(FSM *pFSM, int num); void registerChildFSM(FSM *parent, FSM *child, int index); -const void *getData(FSM* pFSM); +/* ------------------------------ Data和Signals ------------------------------ */ +const void *_getData(FSM* pFSM); +void *_getSignals(FSM* pFSM); + +/* ---------------------------------- 预装载器 ---------------------------------- */ void *_preloadIn(FSM *pFSM); void _preloaderGetReady(FSM *pFSM); +int _getPreloaderOverFlag(FSM *pFSM); +void _clearPreloaderOverFlag(FSM *pFSM); FSMVtbl *_vptrFSM(FSM* pFSM); diff --git a/vscode/FSM_OOP/childtest/main.c b/vscode/FSM_OOP/childtest/main.c index 6b353d6..dc89bcb 100644 --- a/vscode/FSM_OOP/childtest/main.c +++ b/vscode/FSM_OOP/childtest/main.c @@ -23,7 +23,7 @@ int main(){ ChildFSM_Input(cFSM)->arrindex = i; PreloaderGetReady(cFSM); - ChildFSMData* data = getData((FSM *)(cFSM)); + ChildFSMData* data = _getData((FSM *)(cFSM)); printf(" %d ", data->arrindex); diff --git a/vscode/FSM_OOP/keytest/keyFSM.h b/vscode/FSM_OOP/keytest/keyFSM.h index 78c0c12..620b002 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.h +++ b/vscode/FSM_OOP/keytest/keyFSM.h @@ -29,8 +29,13 @@ const static char *keyStr[] = typedef struct _keyFSMData { + /* ----------------------------------- 输入 ----------------------------------- */ KeyIn in; + + /* ----------------------------------- 输出 ----------------------------------- */ KeyOutSignal out; + + /* ---------------------------------- 内部变量 ---------------------------------- */ int countDelay; int countMultiDown; }KeyFSMData; diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c index cc0fa24..07d4abf 100644 --- a/vscode/FSM_OOP/keytest/main.c +++ b/vscode/FSM_OOP/keytest/main.c @@ -26,10 +26,11 @@ int main(){ for (int i = 0; i < NUM; i++) { printf("第%d次: ",i+1); - const KeyFSMData* data = getData((FSM *)keyFSM); + const KeyFSMData* data = _getData((FSM *)keyFSM); *KeyFSM_Input(keyFSM) = testin[i]; PreloaderGetReady(keyFSM); + ClearPreloaderOverFlag(keyFSM); Step(keyFSM); if(data->out){ diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c index 4242bf1..f553d87 100644 --- a/vscode/FSM_OOP/template/main.c +++ b/vscode/FSM_OOP/template/main.c @@ -14,8 +14,19 @@ int main(){ { TemplateFSM_Input(pFSM)->arrindex = i; PreloaderGetReady(pFSM); + + const TemplateFSMData* data = GetData(pFSM); + + int ovflag = GetPreloaderOverFlag(pFSM); - printf("%d," ,i); + if(i == 10){ + TemplateFSM_Signals(pFSM)->signalA = 1; + } + if(i == 11){ + TemplateFSM_Signals(pFSM)->signalB = 1; + } + + printf("%d, " ,i); Step(pFSM); printf("\n"); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 310564f..43376d4 100644 --- a/vscode/FSM_OOP/template/templateFSM.c +++ b/vscode/FSM_OOP/template/templateFSM.c @@ -1,5 +1,6 @@ #include #include +#include #include "FSM_protected.h" #include "templateFSM.h" @@ -21,9 +22,19 @@ static Event ceventArr[20] = { Idle_Event, Idle_Event, Idle_Event, + Idle_Event, + Idle_Event, + Idle_Event, }; -static Event selectEvent(TemplateFSMData *data){ // 必须重新实现 +static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现 + if(signals->signalA){ + return E2D; + } + if(signals->signalB){ + return D2E; + } + return ceventArr[data->in.arrindex]; } @@ -47,6 +58,23 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现 pFSM->base.data = data; } + +static void initSignals(TemplateFSM *pFSM){ + TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals)); + TemplateFSMSignals tempSignals = { + .signalA = 0, + .signalB = 0, + }; + *signals = tempSignals; + pFSM->base.signals = signals; +} + +static void resetSignals(TemplateFSM *pFSM){ + memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals)); +} + + + static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn)); pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn); @@ -82,6 +110,8 @@ TemplateFSM *createTemplateFSM(){ 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.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; + pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index 610a13f..a902b9f 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -2,8 +2,8 @@ #define __TEMPLATE_FSM_H_ -#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM)) - +#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM)) +#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM)) typedef struct _templateFSMIn { @@ -11,6 +11,12 @@ typedef struct _templateFSMIn int x; }TemplateFSMIn; +typedef struct _templateFSMSignals +{ + int signalA; + int signalB; +}TemplateFSMSignals; + typedef struct _templateFSMData { TemplateFSMIn in; @@ -18,6 +24,8 @@ typedef struct _templateFSMData 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 240a866..af07c1c 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -117,8 +117,8 @@ const static char *eventStr[] = { "E2D", }; static void printFSM(TemplateFSM* pFSM){ - FSM_LOG(" \t\tTemplateFSM: "); - FSM_LOG("上次事件:%s, 当前状态:%s, 动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)]); + FSM_LOG(" \tTemplateFSM: "); + FSM_LOG("上次事件:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM)); } diff --git a/按键状态图2.png b/按键状态图2.png new file mode 100644 index 0000000..14ff1ce Binary files /dev/null and b/按键状态图2.png differ