From 23a07ea75e8c14824ef7715762272cf4dfb00324 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Sat, 20 Apr 2024 20:05:10 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E6=9A=82=E5=AD=98=E4=BB=A5=E4=B8=8B?= =?UTF-8?q?=EF=BC=8C=E5=9B=9E=E5=8E=BB=E7=9C=8B=E4=B8=80=E7=9C=BC=E5=8E=9F?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=E7=8A=B6=E6=80=81=E5=9B=BE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/.vscode/settings.json | 28 ++++++++++++++-- vscode/FSM_OOP/baseFSM/FSM.c | 45 +++++++++++++------------- vscode/FSM_OOP/baseFSM/FSM_protected.h | 38 +++++++++++++--------- vscode/FSM_OOP/baseFSM/FSM_public.h | 13 ++++++-- vscode/FSM_OOP/childtest/ParentFSM.c | 2 +- vscode/FSM_OOP/childtest/childFSM.c | 2 +- vscode/FSM_OOP/keytest/keyFSM.c | 26 ++++++--------- vscode/FSM_OOP/template/templateFSM.c | 18 +++++++---- 8 files changed, 103 insertions(+), 69 deletions(-) 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); From 75ce4d1a9a4b024d6734b5a1fd7174abe081a4a1 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Sat, 20 Apr 2024 20:05:33 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=B2=A1=E5=AD=98=E5=AE=8C=EF=BC=8C?= =?UTF-8?q?=E5=86=8D=E5=AD=98=E4=B8=80=E6=AC=A1=E3=80=82=E5=9B=9E=E5=8E=BB?= =?UTF-8?q?=E7=9C=8B=E7=8A=B6=E6=80=81=E5=9B=BE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/FSM_OOP/keytest/keyFSM_private.h | 16 +++++ vscode/FSM_OOP/template/templateFSM_private.h | 59 ++++++++----------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 2e290fe..82c4b47 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -37,6 +37,22 @@ typedef enum _State #define DEFAULT_STATE Waiting +static Event selectNextStateFcn(Waiting)(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 actionFcn(enter, Waiting)(KeyFSMData* data){ data->out = Idle; diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index af07c1c..55f188c 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -15,9 +15,11 @@ typedef struct _TemplateFSM FSM base; }TemplateFSM; -/* - 状态和对应的 action, exit, during 函数 - */ + +/* -------------------------------------------------------------------------- */ +/* 状态 */ +/* -------------------------------------------------------------------------- */ + typedef enum _State { @@ -29,6 +31,17 @@ typedef enum _State } State; #define DEFAULT_STATE E +/* -------------------------------------------------------------------------- */ +/* 下一个状态选择函数 */ +/* -------------------------------------------------------------------------- */ +static void selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){ + +} + + +/* -------------------------------------------------------------------------- */ +/* 对应的 action, exit, during 函数 */ +/* -------------------------------------------------------------------------- */ static void actionFcn(enter, D)() { FSM_LOG(" enterD "); @@ -55,47 +68,33 @@ static void actionFcn(exit, E)() FSM_LOG(" exitE "); } -/* - 事件和对应的转移函数 - */ - -typedef enum _Event{ - Idle_Event, - Idle2D, - Idle2E, - D2E, - E2D, - - Count_Event, -}Event; -static State transitionHandler(Idle2D)() +/* -------------------------------------------------------------------------- */ +/* 转移函数 */ +/* -------------------------------------------------------------------------- */ +static void transitionHandler(Idle, D)() { FSM_LOG(" Idle2D "); - return D; } -static void delayHanlder(Idle2D)(TemplateFSMData *data){ +static void delayHanlder(Idle, D)(TemplateFSMData *data){ FSM_LOG(" DelayIdle2D"); } -static State transitionHandler(Idle2E)() +static State transitionHandler(Idle, E)() { FSM_LOG(" Idle2E "); - return E; } -static State transitionHandler(D2E)() +static State transitionHandler(D, E)() { FSM_LOG(" D2E "); - return E; } -static State transitionHandler(E2D)() +static State transitionHandler(E, D)() { FSM_LOG(" E2D "); - return D; } @@ -108,17 +107,11 @@ const static char *stateStr[] = { "Idle", "D", "E", - }; -const static char *eventStr[] = { - "Idle", - "Idle2D", - "Idle2E", - "D2E", - "E2D", }; + static void printFSM(TemplateFSM* pFSM){ FSM_LOG(" \tTemplateFSM: "); - FSM_LOG("上次事件:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM)); + FSM_LOG("下次状态:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", stateStr[getFSMNextState((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM)); } From 60bdcfe50b44d4c395ffcd369462bf0e9ac3fe17 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Sat, 20 Apr 2024 21:16:26 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=89=80=E6=9C=89?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=EF=BC=8C=E4=BB=85=E7=94=A8=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=80=82=E7=9B=AE=E5=89=8Dtemplate=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=B9=88=E9=97=AE=E9=A2=98=EF=BC=8C=E6=8C=89=E9=94=AE?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=BF=98=E6=9C=89=E6=AE=B5=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E9=A9=AC=E6=8B=89=E6=9D=BE=E5=9B=9E=E6=9D=A5=E5=86=8D?= =?UTF-8?q?=E6=90=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/CMakeLists.txt | 2 +- vscode/FSM_OOP/baseFSM/FSM.c | 25 +- vscode/FSM_OOP/baseFSM/FSM_protected.h | 6 +- vscode/FSM_OOP/keytest/keyFSM.c | 42 +-- vscode/FSM_OOP/keytest/keyFSM_private.h | 278 +++++++++--------- vscode/FSM_OOP/template/main.c | 14 +- vscode/FSM_OOP/template/templateFSM.c | 44 +-- vscode/FSM_OOP/template/templateFSM_private.h | 28 +- 8 files changed, 219 insertions(+), 220 deletions(-) diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index bdbcfa0..7dbe98e 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 fd4ea45..06457b4 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -21,7 +21,9 @@ void resetBaseFSM(FSM *pFSM) static inline void setNextState(FSM* pFSM){ int curState = pFSM->privateVars.curState; - pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals); + if(curState != 0){ + pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals); + } if(0 == pFSM->privateVars.numChild){ return; @@ -52,12 +54,12 @@ void stepBaseFSM(FSM *pFSM) int curState = pFSM->privateVars.curState; void *data = pFSM->data; FSM **childFSM = pFSM->privateVars.childFSM; - int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.numState; + int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; int nextState = pFSM->privateVars.nextState; - if(fcns->delayedEvent){ - fcns->transitionDelayTable[fcns->delayedEvent](data); - fcns->delayedEvent = 0; + if(fcns->delayedIndex){ + fcns->transitionDelayTable[fcns->delayedIndex](data); + fcns->delayedIndex = 0; } if (fcns->transitionTable[index] != NULL) @@ -65,7 +67,9 @@ void stepBaseFSM(FSM *pFSM) if (fcns->exitActionTable[curState] != NULL) fcns->exitActionTable[curState](data, childFSM); - (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent); + + (*fcns->transitionTable[index])(data, &fcns->delayedIndex); + fcns->transitionGeneralAction(data); if (fcns->enterActionTable[nextState] != NULL) fcns->enterActionTable[nextState](data, childFSM); @@ -86,10 +90,10 @@ void stepBaseFSM(FSM *pFSM) } 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); + typedef void (*StateFuncPtr)(void *); + typedef void (*ChildFSMStepFuncPtr)(FSM **); + typedef int (*TransitionFuncPtr)(void *, int *); + typedef int (*SelectNextStateFcnPtr)(void *, void *); FSM *pFSM = calloc(1, sizeof(FSM)); pFSM->privateVars.numState = numState; @@ -106,6 +110,7 @@ FSM* newBaseFSM(int numState, int defaultState){ pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); + pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 7661416..aae3886 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -45,18 +45,18 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); #define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate) - typedef struct _FSM FSM; typedef struct _FSMHandler{ int (**selectNextState)(void *data, void *signals); - void (**transitionTable)(void *data, int currentState, int *); + void (**transitionTable)(void *data, int *delayedIndex); + void (*transitionGeneralAction)(void *data); void (**enterActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM); void (**exitActionTable)(void *data, FSM **cFSM); - int delayedEvent; + int delayedIndex; void (**transitionDelayTable)(void *data); void (**childFSMStepTable)(FSM **cFSM); diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 6404117..6a349a9 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 19:02:11 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-20 19:44:58 + * @LastEditTime: 2024-04-20 21:15:18 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -41,6 +41,14 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn); } +static void initSignals(KeyFSM *pFSM){ + +} + +static void resetSignals(KeyFSM *pFSM){ + +} + static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(enter, Waiting); addStateActionFcn(during, DownDebouncing); @@ -53,23 +61,16 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(during, MultiDownDebouncing); - addTransitionHandler(Waiting, PhsicalDown); - addTransitionHandler(DownDebouncing, PhsicalUp); - addTransitionHandler(DownDebouncing, DelayCount3); - addTransitionHandler(Downing, PhsicalUp); - addTransitionHandler(Downing, HoldCount4); - addTransitionHandler(UpDebouncing, PhsicalDown); - addTransitionHandler(UpDebouncing, DelayCount3); - addTransitionHandler(Holding, PhsicalUp); - addTransitionHandler(MultiDownWaiting, PhsicalDown); - addTransitionHandler(MultiDownWaiting, DelayCount3); - addTransitionHandler(MultiDowning, PhsicalUp); - addTransitionHandler(HoldUpDebouncing, PhsicalDown); - addTransitionHandler(HoldUpDebouncing, DelayCount3); - addTransitionHandler(MultiDownDebouncing, DelayCount3); - addTransitionHandler(MultiDownDebouncing, PhsicalUp); - addDelayHandler(DelayCount3); + addTransitionHandler(DownDebouncing, Downing); + addDelayHandler(DownDebouncing, Downing); + + addTransitionHandler(UpDebouncing, MultiDownWaiting); + addTransitionHandler(MultiDownDebouncing, MultiDowning); + addTransitionHandler(Downing, Holding); + + + fcns->transitionGeneralAction = &transitionGeneralAction; } /* @@ -79,16 +80,17 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 KeyFSM *createKeyFSM(){ KeyFSM *pFSM; - pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); + pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE); #ifndef DSP28377 pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; #endif - - 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; + pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; + pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; constructFSM((FSM *)pFSM); diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 82c4b47..a8562e8 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -26,35 +26,119 @@ typedef enum _State DownDebouncing, Downing, Holding, + HoldUpDebouncing, UpDebouncing, MultiDownWaiting, MultiDowning, - HoldUpDebouncing, MultiDownDebouncing, Count_State, } State; #define DEFAULT_STATE Waiting - -static Event selectNextStateFcn(Waiting)(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 State selectNextStateFcn(Waiting)(KeyFSMData *data){ + if(data->in == Down){ + FSM_LOG(" 物理按键按下 "); + return DownDebouncing; } + return Idle_State; } +static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){ + if(data->in == Up){ + FSM_LOG(" 物理按键松开 "); + return Waiting; + } + else if(data->countDelay == 5){ + return Downing; + } + return Idle_State; +} + +static State selectNextStateFcn(Downing)(KeyFSMData *data){ + if(data->in == Up){ + FSM_LOG(" 物理按键松开 "); + return UpDebouncing; + } + else if(data->countDelay == 10){ + return Holding; + } + return Idle_State; +} + +static State selectNextStateFcn(Holding)(KeyFSMData *data){ + if(data->in == Up){ + FSM_LOG(" 物理按键松开 "); + return HoldUpDebouncing; + } + return Idle_State; +} + +static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){ + if(data->in == Down){ + FSM_LOG(" 物理按键按下 "); + return Holding; + } + else if(data->countDelay == 5){ + return Waiting; + } + return Idle_State; +} + +static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){ + if(data->in == Down){ + FSM_LOG(" 物理按键按下 "); + if(data->countMultiDown){ + return MultiDowning; + } + else{ + return Downing; + } + } + else if(data->countDelay == 5){ + return MultiDownWaiting; + } + + return Idle_State; +} + +static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){ + if(data->in == Down){ + FSM_LOG(" 物理按键按下 "); + return MultiDownDebouncing; + } + else if(data->countDelay == 5){ + return Waiting; + } + return Idle_State; +} + +static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){ + if(data->in == Up){ + FSM_LOG(" 物理按键松开 "); + return UpDebouncing; + } + return Idle_State; +} + +static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){ + if(data->in == Up){ + FSM_LOG(" 物理按键松开 "); + return MultiDownWaiting; + } + else if(data->countDelay == 5){ + return MultiDowning; + } + return Idle_State; +} + +/* -------------------------------------------------------------------------- */ +/* 对应的 action, exit, during 函数 */ +/* -------------------------------------------------------------------------- */ static void actionFcn(enter, Waiting)(KeyFSMData* data){ - data->out = Idle; data->countDelay = 0; data->countMultiDown = 0; @@ -117,141 +201,47 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data) } - - -/* - 事件和对应的转移函数 - */ - -typedef enum _Event{ - Idle_Event, - PhsicalDown, - PhsicalUp, - DelayCount3, - HoldCount4, - - Count_Event, -}Event; - -static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted) -{ - FSM_LOG(" 物理按键按下 "); +/* -------------------------------------------------------------------------- */ +/* 转移函数 */ +/* -------------------------------------------------------------------------- */ +void transitionGeneralAction(KeyFSMData *data){ data->countDelay = 0; - - switch (curState) - { - case Waiting: - return DownDebouncing; - - case UpDebouncing: - if(data->countMultiDown) - return MultiDowning; - else - return Downing; - - case HoldUpDebouncing: - return Holding; - - case MultiDownWaiting: - return MultiDownDebouncing; - - - default: - FSM_LOG("检查状态转移表设计,不应该到这里"); - assert(0); - - } } -static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, Event *delayedEvent) -{ - FSM_LOG(" 物理按键松开 "); - data->countDelay = 0; - - switch (curState) - { - case DownDebouncing: - if(data->countMultiDown){ - return MultiDownWaiting; - } - return Waiting; - - case Downing: - return UpDebouncing; - case Holding: - return HoldUpDebouncing; - - case MultiDowning: - return UpDebouncing; - - default: - FSM_LOG("检查状态转移表设计,不应该到这里"); - assert(0); - - } +static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data, int *delayedIndex){ + data->out = Down; + *delayedIndex = index(DownDebouncing, Downing); } -static void delayHanlder(DelayCount3)(KeyFSMData* data){ +static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){ data->out = Idle; } -static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){ - FSM_LOG(" 延迟计数到3 "); - data->countDelay = 0; - - switch (curState) - { - case DownDebouncing: - data->out = Down; - *delayedEvent = DelayCount3; - - FSM_LOG("按键按下"); - return Downing; - - case UpDebouncing: - data->out = Idle; - data->countMultiDown++; - - FSM_LOG("按键松开"); - return MultiDownWaiting; - - case MultiDownWaiting: - return Waiting; - - case HoldUpDebouncing: - return Waiting; - - case MultiDownDebouncing: - switch (data->countMultiDown + 1) - { - case 2: - data->out = Down_2times; - break; - case 3: - data->out = Down_3times; - break; - - default: - printf("reach MultiDown Limit!\n"); - break; - } - FSM_LOG(" 多击%d ", data->countMultiDown+1); - *delayedEvent = DelayCount3; - return MultiDowning; - - default: - FSM_LOG("检查状态转移表设计,不应该到这里"); - assert(0); - } +static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data, int *delayedIndex){ + data->out = Idle; + data->countMultiDown++; } +static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data, int *delayedIndex){ + switch (data->countMultiDown + 1) + { + case 2: + data->out = Down_2times; + break; + case 3: + data->out = Down_3times; + break; + + default: + printf("reach MultiDown Limit!\n"); + break; + } + FSM_LOG(" 多击%d ", data->countMultiDown+1); + *delayedIndex = index(MultiDownDebouncing, MultiDowning); +} -static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){ - FSM_LOG(" 计数到2进入长按模式 "); - data->countDelay = 0; - +static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){ data->out = Hold; - return Holding; } @@ -272,17 +262,11 @@ const static char *stateStr[] = { "HoldUpDebouncing", "MultiDownDebouncing", }; -const static char *eventStr[] = { - "Idle", - "PhsicalDown", - "PhsicalUp", - "DelayCount3", - "HoldCount4", -}; + 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 *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]); + FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]); } diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c index f553d87..cbdf941 100644 --- a/vscode/FSM_OOP/template/main.c +++ b/vscode/FSM_OOP/template/main.c @@ -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 20:26:40 + * @FilePath: \vscode\FSM_OOP\template\main.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ #include #include "templateFSM.h" @@ -19,11 +27,11 @@ int main(){ int ovflag = GetPreloaderOverFlag(pFSM); - if(i == 10){ + if(i == 3){ TemplateFSM_Signals(pFSM)->signalA = 1; } - if(i == 11){ - TemplateFSM_Signals(pFSM)->signalB = 1; + if(i == 4){ + TemplateFSM_Signals(pFSM)->signalA = 1; } printf("%d, " ,i); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 67de1e0..b2f3e5a 100644 --- a/vscode/FSM_OOP/template/templateFSM.c +++ b/vscode/FSM_OOP/template/templateFSM.c @@ -1,3 +1,11 @@ +/* + * @Author: godcreator02 qq974980621@gmail.com + * @Date: 2024-04-20 20:08:03 + * @LastEditors: godcreator02 qq974980621@gmail.com + * @LastEditTime: 2024-04-20 21:05:34 + * @FilePath: \vscode\FSM_OOP\template\templateFSM.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ #include #include #include @@ -9,38 +17,11 @@ /* 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 */ -static Event ceventArr[20] = { - Idle_Event, - Idle_Event, - Idle2D, - Idle_Event, - Idle_Event, - D2E, - E2D, - D2E, - Idle_Event, - Idle_Event, - Idle_Event, - Idle_Event, - Idle_Event, - Idle_Event, - Idle_Event, -}; - -static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现 - if(signals->signalA){ - return E2D; - } - if(signals->signalB){ - return D2E; - } - - return ceventArr[data->in.arrindex]; -} static void step(TemplateFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); + FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]); } static void initData(TemplateFSM *pFSM){ // 必须重新实现 @@ -84,7 +65,8 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ - + addSelectNextStateFcn(D); + addSelectNextStateFcn(E); /* ----------------------- 添加状态中事件,action during exit ----------------------- */ @@ -101,7 +83,9 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(D, E); addTransitionHandler(E, D); - addDelayHandler(Idle, D); + addDelayHandler(D, E); + + fcns->transitionGeneralAction = &transitionGeneralAction; } /* diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index 55f188c..1da941e 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -34,10 +34,21 @@ typedef enum _State /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ -static void selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){ - +static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){ + if(signals->signalA){ + return E; + } + return Idle; } +static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){ + if(signals->signalA){ + return D; + } + return Idle; +} + + /* -------------------------------------------------------------------------- */ /* 对应的 action, exit, during 函数 */ @@ -73,13 +84,17 @@ static void actionFcn(exit, E)() /* -------------------------------------------------------------------------- */ /* 转移函数 */ /* -------------------------------------------------------------------------- */ +void transitionGeneralAction(TemplateFSMData *data){ + FSM_LOG("general"); +} + static void transitionHandler(Idle, D)() { FSM_LOG(" Idle2D "); } -static void delayHanlder(Idle, D)(TemplateFSMData *data){ - FSM_LOG(" DelayIdle2D"); +static void delayHanlder(D, E)(TemplateFSMData *data){ + FSM_LOG(" DelayD2E"); } static State transitionHandler(Idle, E)() @@ -87,8 +102,9 @@ static State transitionHandler(Idle, E)() FSM_LOG(" Idle2E "); } -static State transitionHandler(D, E)() +static State transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex) { + *delayedIndex = index(D, E); FSM_LOG(" D2E "); } @@ -111,7 +127,7 @@ const static char *stateStr[] = { static void printFSM(TemplateFSM* pFSM){ FSM_LOG(" \tTemplateFSM: "); - FSM_LOG("下次状态:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", stateStr[getFSMNextState((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM)); + FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]); } From b3c9b79aea95184d2c6f48848e09ee1fdd2cd2af Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 14:03:00 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E6=8C=89=E9=94=AE=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=E5=87=86=E5=A4=87=E5=9C=A8=E6=9D=BF=E5=AD=90=E4=B8=8A?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/FSM_OOP/baseFSM/FSM.c | 13 +++++++++++++ vscode/FSM_OOP/baseFSM/FSM_protected.h | 8 +++++--- vscode/FSM_OOP/keytest/keyFSM.c | 19 ++++++++++++++++--- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 06457b4..4c4d4a7 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -115,6 +115,9 @@ FSM* newBaseFSM(int numState, int defaultState){ pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); + + + FSMVtbl vtbl = { .reset = resetBaseFSM, .step = stepBaseFSM, @@ -139,6 +142,16 @@ void constructFSM(FSM* pFSM){ pFSM->vtbl.initData(pFSM); pFSM->vtbl.initDataLoader(pFSM); pFSM->vtbl.initSignals(pFSM); + + + /* ---------------------------------- 检查状态表 --------------------------------- */ + for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态,Idle状态只能跳转到默认状态 + { + if(!pFSM->privateVars.fcns.selectNextState[i]){ + FSM_LOG("每个状态都要有一个状态选择函数!\n"); + assert(0); // 强制退出 + } + } } diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index aae3886..9c4fdfa 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -32,8 +32,8 @@ typedef struct _FSMHandler FSMHandler; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); -typedef void (*Avoid_WARNING_Delay_Handlers)(void *data); -typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *); +typedef void (*Avoid_WARNING_Delay_General_Handlers)(void *data); +typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int *); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -42,7 +42,9 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); #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) +#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_General_Handlers)delayHanlder(curstate, nextstate) + + typedef struct _FSM FSM; diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 6a349a9..9c0f7d5 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 19:02:11 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-20 21:15:18 + * @LastEditTime: 2024-04-23 13:45:50 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -50,6 +50,19 @@ static void resetSignals(KeyFSM *pFSM){ } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 + /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ + addSelectNextStateFcn(Waiting); + addSelectNextStateFcn(DownDebouncing); + addSelectNextStateFcn(Downing); + addSelectNextStateFcn(Holding); + addSelectNextStateFcn(HoldUpDebouncing); + addSelectNextStateFcn(UpDebouncing); + addSelectNextStateFcn(MultiDownWaiting); + addSelectNextStateFcn(MultiDowning); + addSelectNextStateFcn(MultiDownDebouncing); + + + /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(enter, Waiting); addStateActionFcn(during, DownDebouncing); addStateActionFcn(during, Downing); @@ -61,7 +74,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(during, MultiDownDebouncing); - + /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ addTransitionHandler(DownDebouncing, Downing); addDelayHandler(DownDebouncing, Downing); @@ -70,7 +83,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(Downing, Holding); - fcns->transitionGeneralAction = &transitionGeneralAction; + fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction; } /* From 168010ad67bf1a1ebd85c5c881c31290e435596f Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 14:32:23 +0800 Subject: [PATCH 05/10] =?UTF-8?q?28377D=E6=8C=89=E9=94=AE=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=BA=94=E8=AF=A5=E6=B2=A1=E9=97=AE=E9=A2=98=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E5=8D=95=E5=87=BB=E5=A4=9A=E5=87=BB=E9=95=BF=E5=AE=89?= =?UTF-8?q?=E9=83=BDok=E3=80=82=E6=9C=80=E6=85=A2319=EF=BC=8C=E6=9C=80?= =?UTF-8?q?=E5=BF=AB221?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_on_28377/.cproject | 94 +++++++++---------- .../.launches/02code_speed_test.launch | 28 ------ test_on_28377/.launches/FSM_test.launch | 29 +----- test_on_28377/main.c | 63 +++++++------ .../targetConfigs/TMS320F28377D.ccxml | 42 +-------- vscode/FSM_OOP/baseFSM/FSM.c | 22 ++--- vscode/FSM_OOP/keytest/keyFSM.c | 5 +- vscode/FSM_OOP/keytest/keyFSM_private.h | 11 ++- 8 files changed, 106 insertions(+), 188 deletions(-) delete mode 100644 test_on_28377/.launches/02code_speed_test.launch diff --git a/test_on_28377/.cproject b/test_on_28377/.cproject index 27deca7..37be928 100644 --- a/test_on_28377/.cproject +++ b/test_on_28377/.cproject @@ -15,8 +15,8 @@ - - - + diff --git a/test_on_28377/.launches/02code_speed_test.launch b/test_on_28377/.launches/02code_speed_test.launch deleted file mode 100644 index 59a7ca6..0000000 --- a/test_on_28377/.launches/02code_speed_test.launch +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test_on_28377/.launches/FSM_test.launch b/test_on_28377/.launches/FSM_test.launch index 164d719..94a4d3b 100644 --- a/test_on_28377/.launches/FSM_test.launch +++ b/test_on_28377/.launches/FSM_test.launch @@ -1,28 +1,8 @@ - - - - - - - - - - - - - - - - - - - + - - @@ -32,10 +12,5 @@ - - - - - - + diff --git a/test_on_28377/main.c b/test_on_28377/main.c index c7b5e9f..db97563 100644 --- a/test_on_28377/main.c +++ b/test_on_28377/main.c @@ -30,33 +30,33 @@ int isDown = 0; -ChildFSM *cFSM; -ParentFSM *pFSM; -void childTest(){ - - cFSM = createChildFSM(); - pFSM = createParentFSM(); - - setChildNum((pFSM), 1); - registerChildFSM((pFSM), (cFSM), 0); - - for (int i = 0; i < 15; i++) - { - ParentFSM_Input(pFSM)->arrindex = i; - SetPreloaderReady(pFSM); - - ChildFSM_Input(cFSM)->arrindex = i; - SetPreloaderReady(cFSM); - - ChildFSMData* data = getData((FSM *)(cFSM)); - printf(" %d ", data->arrindex); - - tic(); - _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM); - toc(index++); - printf("\n"); - } -} +//ChildFSM *cFSM; +//ParentFSM *pFSM; +//void childTest(){ +// +// cFSM = createChildFSM(); +// pFSM = createParentFSM(); +// +// setChildNum((pFSM), 1); +// registerChildFSM((pFSM), (cFSM), 0); +// +// for (int i = 0; i < 15; i++) +// { +// ParentFSM_Input(pFSM)->arrindex = i; +// SetPreloaderReady(pFSM); +// +// ChildFSM_Input(cFSM)->arrindex = i; +// SetPreloaderReady(cFSM); +// +// ChildFSMData* data = getData((FSM *)(cFSM)); +// printf(" %d ", data->arrindex); +// +// tic(); +// _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM); +// toc(index++); +// printf("\n"); +// } +//} @@ -67,14 +67,15 @@ KeyFSMData* data; void keyFSMTest(){ keyFSM = createKeyFSM(); - data = getData((FSM *)keyFSM); + data = _getData((FSM *)keyFSM); printf("hello 28377\n"); while(1){ *KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO); - SetPreloaderReady(keyFSM); + PreloaderGetReady(keyFSM); + tic(); Step(keyFSM); @@ -125,8 +126,8 @@ void main(void) GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP); - childTest(); -// keyFSMTest(); +// childTest(); + keyFSMTest(); // funptrTest(); } diff --git a/test_on_28377/targetConfigs/TMS320F28377D.ccxml b/test_on_28377/targetConfigs/TMS320F28377D.ccxml index 5d896ab..85ba6c4 100644 --- a/test_on_28377/targetConfigs/TMS320F28377D.ccxml +++ b/test_on_28377/targetConfigs/TMS320F28377D.ccxml @@ -1,62 +1,22 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 4c4d4a7..c12c621 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -62,18 +62,18 @@ void stepBaseFSM(FSM *pFSM) fcns->delayedIndex = 0; } - if (fcns->transitionTable[index] != NULL) - { - if (fcns->exitActionTable[curState] != NULL) - fcns->exitActionTable[curState](data, childFSM); - - - (*fcns->transitionTable[index])(data, &fcns->delayedIndex); - fcns->transitionGeneralAction(data); - - if (fcns->enterActionTable[nextState] != NULL) - fcns->enterActionTable[nextState](data, childFSM); + if(nextState && curState != nextState){ // 状态切换 + if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数 + { + if (fcns->exitActionTable[curState] != NULL) + fcns->exitActionTable[curState](data, childFSM); + (*fcns->transitionTable[index])(data, &fcns->delayedIndex); + + if (fcns->enterActionTable[nextState] != NULL) + fcns->enterActionTable[nextState](data, childFSM); + } + fcns->transitionGeneralAction(data); // 通用状态转移函数 pFSM->privateVars.curState = nextState; } else if(curState == 0){ // 处理刚运行进入的默认状态 diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 9c0f7d5..8ad5662 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 19:02:11 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-23 13:45:50 + * @LastEditTime: 2024-04-23 14:30:18 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -80,7 +80,10 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(UpDebouncing, MultiDownWaiting); addTransitionHandler(MultiDownDebouncing, MultiDowning); + addDelayHandler(MultiDownDebouncing, MultiDowning); + addTransitionHandler(Downing, Holding); + addTransitionHandler(MultiDownWaiting, Waiting); fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction; diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index a8562e8..198d81f 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -240,10 +240,17 @@ static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* da *delayedIndex = index(MultiDownDebouncing, MultiDowning); } +static void delayHanlder(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){ + data->out = Idle; +} + static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){ data->out = Hold; } +static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){ + data->countMultiDown = 0; +} @@ -256,17 +263,17 @@ const static char *stateStr[] = { "DownDebouncing", "Downing", "Holding", + "HoldUpDebouncing", "UpDebouncing", "MultiDownWaiting", "MultiDowning", - "HoldUpDebouncing", "MultiDownDebouncing", }; 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 *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]); + FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]); } From 02f2cb12b673a5dff8a34d9d9b23635489ca794a Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 14:53:47 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=8E=BB=E6=8E=89delay=E4=BA=86=EF=BC=8C?= =?UTF-8?q?28377=E6=B5=8B=E8=AF=95=E4=B9=9F=E6=B2=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/FSM_OOP/baseFSM/FSM.c | 7 +------ vscode/FSM_OOP/baseFSM/FSM_protected.h | 7 ++----- vscode/FSM_OOP/keytest/keyFSM.c | 10 ++++------ vscode/FSM_OOP/keytest/keyFSM.h | 2 +- vscode/FSM_OOP/keytest/keyFSM_private.h | 13 ++++--------- 5 files changed, 12 insertions(+), 27 deletions(-) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index c12c621..55e5d08 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -57,10 +57,6 @@ void stepBaseFSM(FSM *pFSM) int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; int nextState = pFSM->privateVars.nextState; - if(fcns->delayedIndex){ - fcns->transitionDelayTable[fcns->delayedIndex](data); - fcns->delayedIndex = 0; - } if(nextState && curState != nextState){ // 状态切换 if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数 @@ -68,7 +64,7 @@ void stepBaseFSM(FSM *pFSM) if (fcns->exitActionTable[curState] != NULL) fcns->exitActionTable[curState](data, childFSM); - (*fcns->transitionTable[index])(data, &fcns->delayedIndex); + (*fcns->transitionTable[index])(data); if (fcns->enterActionTable[nextState] != NULL) fcns->enterActionTable[nextState](data, childFSM); @@ -111,7 +107,6 @@ FSM* newBaseFSM(int numState, int defaultState){ pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr)); - pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 9c4fdfa..59231cb 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -33,7 +33,7 @@ typedef struct _FSMHandler FSMHandler; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_Delay_General_Handlers)(void *data); -typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int *); +typedef void (*Avoid_WARNING_Transition_Handler)(void *data); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -51,16 +51,13 @@ typedef struct _FSM FSM; typedef struct _FSMHandler{ int (**selectNextState)(void *data, void *signals); - void (**transitionTable)(void *data, int *delayedIndex); + void (**transitionTable)(void *data); void (*transitionGeneralAction)(void *data); void (**enterActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM); void (**exitActionTable)(void *data, FSM **cFSM); - int delayedIndex; - void (**transitionDelayTable)(void *data); - void (**childFSMStepTable)(FSM **cFSM); }FSMHandler; diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 8ad5662..30524e0 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -2,12 +2,13 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 19:02:11 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-23 14:30:18 + * @LastEditTime: 2024-04-23 14:47:23 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include #include +#include #include "FSM_protected.h" #include "keyFSM.h" @@ -34,6 +35,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现 data->out = Idle; pFSM->base.data = data; + pFSM->base.signals = &data->out; } static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 @@ -46,7 +48,7 @@ static void initSignals(KeyFSM *pFSM){ } static void resetSignals(KeyFSM *pFSM){ - + memset(pFSM->base.signals, 0, sizeof(KeyOutSignal)); } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 @@ -76,12 +78,8 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ addTransitionHandler(DownDebouncing, Downing); - addDelayHandler(DownDebouncing, Downing); - addTransitionHandler(UpDebouncing, MultiDownWaiting); addTransitionHandler(MultiDownDebouncing, MultiDowning); - addDelayHandler(MultiDownDebouncing, MultiDowning); - addTransitionHandler(Downing, Holding); addTransitionHandler(MultiDownWaiting, Waiting); diff --git a/vscode/FSM_OOP/keytest/keyFSM.h b/vscode/FSM_OOP/keytest/keyFSM.h index 620b002..717290e 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.h +++ b/vscode/FSM_OOP/keytest/keyFSM.h @@ -10,7 +10,7 @@ typedef enum _keyIn{ }KeyIn; -typedef enum _keyOutSignal{ +typedef enum _keyOutSignals{ Idle, Down, Hold, diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 198d81f..15ea1d9 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -208,21 +208,20 @@ void transitionGeneralAction(KeyFSMData *data){ data->countDelay = 0; } -static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data, int *delayedIndex){ +static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){ data->out = Down; - *delayedIndex = index(DownDebouncing, Downing); } static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){ data->out = Idle; } -static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data, int *delayedIndex){ +static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){ data->out = Idle; data->countMultiDown++; } -static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data, int *delayedIndex){ +static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){ switch (data->countMultiDown + 1) { case 2: @@ -237,14 +236,10 @@ static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* da break; } FSM_LOG(" 多击%d ", data->countMultiDown+1); - *delayedIndex = index(MultiDownDebouncing, MultiDowning); } -static void delayHanlder(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){ - data->out = Idle; -} -static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){ +static State transitionHandler(Downing, Holding)(KeyFSMData* data){ data->out = Hold; } From ca211e646ae8b869b76d111a5760373cc23b8952 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 15:11:06 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E5=BF=98=E4=BA=86=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E5=95=A5=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_on_28377/.cproject | 66 +++++++++++++------------- test_on_28377/main.c | 4 +- vscode/FSM_OOP/baseFSM/FSM.c | 13 +++-- vscode/FSM_OOP/baseFSM/FSM_protected.h | 1 + vscode/FSM_OOP/keytest/keyFSM.c | 4 +- 5 files changed, 47 insertions(+), 41 deletions(-) diff --git a/test_on_28377/.cproject b/test_on_28377/.cproject index 37be928..e223d50 100644 --- a/test_on_28377/.cproject +++ b/test_on_28377/.cproject @@ -28,21 +28,21 @@ -