diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json index 6a6f9c2..6f50b72 100644 --- a/vscode/.vscode/settings.json +++ b/vscode/.vscode/settings.json @@ -1,4 +1,23 @@ { + "terminal.integrated.profiles.windows": { + "PowerShell": { + "source": "PowerShell", + "icon": "terminal-powershell", + "args": ["-NoExit","chcp 65001"] + }, + "Command Prompt": { + "path": [ + "${env:windir}\\Sysnative\\cmd.exe", + "${env:windir}\\System32\\cmd.exe" + ], + "args": ["/K","chcp 65001"], + "icon": "terminal-cmd" + }, + "Git Bash": { + "source": "Git Bash" + } + }, + "files.associations": { "filter.h": "c", "fsm_protected.h": "c", @@ -7,5 +26,10 @@ "stdio.h": "c", "assert.h": "c" }, - "files.encoding": "utf8" -} \ No newline at end of file + + + "files.encoding": "utf8", + + +} + diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 946b286..fd4ea45 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -13,16 +13,15 @@ void resetBaseFSM(FSM *pFSM) { - if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->data, pFSM->privateVars.childFSM); pFSM->privateVars.curState = 0; } -static inline void setEvent(FSM* pFSM){ - assert(pFSM->vtbl.selectEvent); - pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data, pFSM->signals); +static inline void setNextState(FSM* pFSM){ + int curState = pFSM->privateVars.curState; + pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals); if(0 == pFSM->privateVars.numChild){ return; @@ -31,7 +30,7 @@ static inline void setEvent(FSM* pFSM){ for (int i = 0; i < pFSM->privateVars.numChild; i++) { FSM *cFSM = pFSM->privateVars.childFSM[i]; - setEvent(cFSM); + setNextState(cFSM); } } @@ -46,15 +45,15 @@ static inline void preload(FSM* pFSM){ void stepBaseFSM(FSM *pFSM) { preload(pFSM); - setEvent(pFSM); + setNextState(pFSM); pFSM->vtbl.resetSignals(pFSM); FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; void *data = pFSM->data; FSM **childFSM = pFSM->privateVars.childFSM; - int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent; - int nextState; + int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.numState; + int nextState = pFSM->privateVars.nextState; if(fcns->delayedEvent){ fcns->transitionDelayTable[fcns->delayedEvent](data); @@ -66,36 +65,37 @@ void stepBaseFSM(FSM *pFSM) if (fcns->exitActionTable[curState] != NULL) fcns->exitActionTable[curState](data, childFSM); - nextState = (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent); + (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent); if (fcns->enterActionTable[nextState] != NULL) fcns->enterActionTable[nextState](data, childFSM); pFSM->privateVars.curState = nextState; } - else if(curState == 0){ + else if(curState == 0){ // 处理刚运行进入的默认状态 nextState = pFSM->privateVars.defaultState; if (fcns->enterActionTable[nextState] != NULL) fcns->enterActionTable[nextState](data, childFSM); pFSM->privateVars.curState = nextState; } - else + else // 状态机没动 { if (fcns->duringActionTable[curState] != NULL) fcns->duringActionTable[curState](data, childFSM); } } -FSM* newBaseFSM(int numState, int numEvent, int defaultState){ +FSM* newBaseFSM(int numState, int defaultState){ typedef void (*StateFuncPtr)(void *data); typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM); typedef int (*TransitionFuncPtr)(void *data, int currentState); + typedef int (*SelectNextStateFcnPtr)(void *data, void *signals); FSM *pFSM = calloc(1, sizeof(FSM)); - pFSM->privateVars.curEvent = 0; - pFSM->privateVars.curState = 0; - pFSM->privateVars.numEvent = numEvent; + pFSM->privateVars.numState = numState; pFSM->privateVars.defaultState = defaultState; + pFSM->privateVars.curState = 0; + pFSM->privateVars.nextState = 0; pFSM->privateVars.numChild = 0; pFSM->privateVars.preloader.isReady = 0; @@ -104,14 +104,15 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){ pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); - pFSM->privateVars.fcns.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr)); - pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numEvent, sizeof(ChildFSMStepFuncPtr)); - pFSM->privateVars.fcns.transitionDelayTable = calloc(numEvent, sizeof(StateFuncPtr)); + pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); + pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); + pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr)); + + pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); FSMVtbl vtbl = { .reset = resetBaseFSM, .step = stepBaseFSM, - .selectEvent = NULL, .setupHandler = NULL, .initData = NULL, .initDataLoader = NULL, @@ -142,13 +143,11 @@ void constructFSM(FSM* pFSM){ int getFSMCurState(FSM *pFSM){ return pFSM->privateVars.curState; } -int getFSMCurEvent(FSM *pFSM){ - return pFSM->privateVars.curEvent; +int getFSMNextState(FSM *pFSM){ + return pFSM->privateVars.nextState; } - - void setChildNum(FSM *pFSM, int num){ pFSM->privateVars.numChild = num; pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *)); diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 565eca3..7661416 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -22,29 +22,35 @@ #define enter enter #define exit exit -#define transitionHandler(event) event##Handler -#define delayHanlder(event) event##DelayHandler -#define actionFcn(action, state) state##_##action##Action -#define index(state, event) (state*Count_Event + event) + +#define selectNextStateFcn(curstate) curstate##_##selectNextState +#define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler +#define delayHanlder(curstate, nextstate) curstate##2##nextstate##DelayHandler +#define actionFcn(action, curstate) curstate##_##action##Action +#define index(curstate, nextstate) (curstate*Count_State + nextstate) + typedef struct _FSMHandler FSMHandler; 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_Transition_Handler)(void *data, int curState, int *); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); -typedef int (*Avoid_WARNING_SelectEvent)(void *data, void *signals); +typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); - -#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state) -#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event) -#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event) + +#define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate) +#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state) +#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate) +#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate) typedef struct _FSM FSM; typedef struct _FSMHandler{ - int (**transitionTable)(void *data, int currentState, int *); + int (**selectNextState)(void *data, void *signals); + + void (**transitionTable)(void *data, int currentState, int *); void (**enterActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM); @@ -67,11 +73,11 @@ typedef struct _FSMDataLoader typedef struct _FSMPrivateVars { - int curState; + int numState; int defaultState; // Idle状态不能停留,必须指定一个初始状态 - - int curEvent; - int numEvent; + + int curState; + int nextState; FSMDataLoader preloader; @@ -102,7 +108,7 @@ typedef struct _FSM void constructFSM(FSM* pFSM); // 继承的函数 -FSM *newBaseFSM(int numState, int numEvent, int defaultState); +FSM* newBaseFSM(int numState, int defaultState); void stepBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM); diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index a394855..de53c39 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -1,3 +1,11 @@ +/* + * @Author: godcreator02 qq974980621@gmail.com + * @Date: 2024-04-20 18:52:14 + * @LastEditors: godcreator02 qq974980621@gmail.com + * @LastEditTime: 2024-04-20 19:12:55 + * @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ #ifndef __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_ @@ -17,9 +25,9 @@ typedef struct _FSMHandler FSMHandler; // 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现 typedef struct _FSMVtbl { // 状态机控制 - 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); // 子类必须重新实现 @@ -29,7 +37,7 @@ typedef struct _FSMVtbl { /* --------------------------------- 状态机信息获取 -------------------------------- */ int getFSMCurState(FSM *pFSM); -int getFSMCurEvent(FSM *pFSM); +int getFSMNextState(FSM *pFSM); void setChildNum(FSM *pFSM, int num); void registerChildFSM(FSM *parent, FSM *child, int index); @@ -43,6 +51,7 @@ void _preloaderGetReady(FSM *pFSM); int _getPreloaderOverFlag(FSM *pFSM); void _clearPreloaderOverFlag(FSM *pFSM); +/* ---------------------------------- 虚函数表 ---------------------------------- */ FSMVtbl *_vptrFSM(FSM* pFSM); diff --git a/vscode/FSM_OOP/childtest/ParentFSM.c b/vscode/FSM_OOP/childtest/ParentFSM.c index b145f7a..5739770 100644 --- a/vscode/FSM_OOP/childtest/ParentFSM.c +++ b/vscode/FSM_OOP/childtest/ParentFSM.c @@ -198,7 +198,7 @@ ParentFSM *createParentFSM(){ pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM->base.vtbl.step = step; - pFSM->base.vtbl.selectEvent = selectEvent; + pFSM->base.vtbl.selectNextState = selectEvent; pFSM->base.vtbl.initData = initData; pFSM->base.vtbl.setupHandler = setupHandler; pFSM->base.vtbl.initDataLoader = initDataLoader; diff --git a/vscode/FSM_OOP/childtest/childFSM.c b/vscode/FSM_OOP/childtest/childFSM.c index c3b1c63..29a4e22 100644 --- a/vscode/FSM_OOP/childtest/childFSM.c +++ b/vscode/FSM_OOP/childtest/childFSM.c @@ -71,7 +71,7 @@ ChildFSM *createChildFSM(){ pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM->base.vtbl.step = step; - pFSM->base.vtbl.selectEvent = selectEvent; + pFSM->base.vtbl.selectNextState = selectEvent; pFSM->base.vtbl.initData = initData; pFSM->base.vtbl.setupHandler = setupHandler; pFSM->base.vtbl.initDataLoader = initDataLoader; diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 575b107..6404117 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -1,3 +1,11 @@ +/* + * @Author: godcreator02 qq974980621@gmail.com + * @Date: 2024-04-20 19:02:11 + * @LastEditors: godcreator02 qq974980621@gmail.com + * @LastEditTime: 2024-04-20 19:44:58 + * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ #include #include @@ -9,22 +17,6 @@ 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 */ -static Event selectEvent(KeyFSMData *data){ // 必须重新实现 - - if(data->countDelay == 10){ - return HoldCount4; - } - else if(data->countDelay == 5){ - return DelayCount3; - } - else if(data->in == Up){ - return PhsicalUp; - } - else{ - return PhsicalDown; - } -} - static void step(KeyFSM* pFSM){ printFSM(pFSM); stepBaseFSM((FSM *)pFSM); @@ -93,7 +85,7 @@ KeyFSM *createKeyFSM(){ pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; #endif - pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent; + pFSM->base.vtbl.selectNextState = (Avoid_WARNING_SelectNextState)selectEvent; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 43376d4..67de1e0 100644 --- a/vscode/FSM_OOP/template/templateFSM.c +++ b/vscode/FSM_OOP/template/templateFSM.c @@ -83,7 +83,11 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现 + /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ + + + /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(during, E); addStateActionFcn(during, D); addStateActionFcn(enter, E); @@ -91,12 +95,13 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(exit, E); addStateActionFcn(exit, D); - addTransitionHandler(Idle, Idle2D); - addTransitionHandler(Idle, Idle2E); - addTransitionHandler(D, D2E); - addTransitionHandler(E, E2D); + /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ + addTransitionHandler(Idle, D); + addTransitionHandler(Idle, E); + addTransitionHandler(D, E); + addTransitionHandler(E, D); - addDelayHandler(Idle2D); + addDelayHandler(Idle, D); } /* @@ -105,7 +110,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 TemplateFSM *createTemplateFSM(){ TemplateFSM *pFSM; - pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); + pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE); pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; @@ -113,7 +118,6 @@ TemplateFSM *createTemplateFSM(){ 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; constructFSM((FSM *)pFSM);