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; }