From d48de807e26db4e9d0f560d33ae5c0a74d174f30 Mon Sep 17 00:00:00 2001 From: godcreator <974980621@qq.com> Date: Tue, 30 Jan 2024 19:38:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=8E=E4=B9=88=E4=BB=A3=E7=A0=81=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E4=B8=8D=E8=BF=9B=E5=8E=BB=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 + test_on_28377/.ccsproject | 2 + test_on_28377/.cproject | 92 ++--- test_on_28377/.launches/FSM_test.launch | 23 ++ .../targetConfigs/TMS320F28377D.ccxml | 340 ++---------------- vscode/CMakeLists.txt | 2 +- vscode/FSM_OOP/baseFSM/FSM.c | 27 +- vscode/FSM_OOP/baseFSM/FSM_protected.h | 11 +- vscode/FSM_OOP/keytest/keyFSM.c | 4 +- vscode/FSM_OOP/keytest/keyFSM_private.h | 23 +- vscode/FSM_OOP/keytest/main.c | 3 +- 11 files changed, 133 insertions(+), 397 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 test_on_28377/.launches/FSM_test.launch diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3389bf2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cmake.sourceDirectory": "D:/godsays/indexfiles/AZ8OJKZLGK/FSM/vscode" +} \ No newline at end of file diff --git a/test_on_28377/.ccsproject b/test_on_28377/.ccsproject index e499556..16fe6ab 100644 --- a/test_on_28377/.ccsproject +++ b/test_on_28377/.ccsproject @@ -2,4 +2,6 @@ + + diff --git a/test_on_28377/.cproject b/test_on_28377/.cproject index 91cf160..8ac92ce 100644 --- a/test_on_28377/.cproject +++ b/test_on_28377/.cproject @@ -15,8 +15,8 @@ - - diff --git a/test_on_28377/.launches/FSM_test.launch b/test_on_28377/.launches/FSM_test.launch new file mode 100644 index 0000000..44c9b58 --- /dev/null +++ b/test_on_28377/.launches/FSM_test.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test_on_28377/targetConfigs/TMS320F28377D.ccxml b/test_on_28377/targetConfigs/TMS320F28377D.ccxml index 242481c..99f29d0 100644 --- a/test_on_28377/targetConfigs/TMS320F28377D.ccxml +++ b/test_on_28377/targetConfigs/TMS320F28377D.ccxml @@ -1,342 +1,42 @@ - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index 72e13d1..e2e892e 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -5,7 +5,7 @@ project(controller) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) -# set(keytest 123) +set(keytest 789) if(DEFINED keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index b4e8c2e..ea8cb8c 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -41,6 +41,18 @@ static inline void preload(FSM* pFSM){ pFSM->privateVars.preloader.isReady = 0; } } + + +static inline void excuteDelay(FSM* pFSM){ + FSMHandler *fcns = &pFSM->privateVars.fcns; + for (int event = 0; event < pFSM->privateVars.numEvent; event++) + { + if(!fcns->isDelayExcuted[event] && fcns->transitionDelayTable[event] != NULL ){ + fcns->transitionDelayTable[event](pFSM->data); + fcns->isDelayExcuted[event] = 1; + } + } +} void stepBaseFSM(FSM *pFSM) { @@ -51,11 +63,7 @@ void stepBaseFSM(FSM *pFSM) int curState = pFSM->privateVars.curState; void *data = pFSM->data; - if(!fcns->isDelayActionExcuted[curState] && fcns->delayActionTable[curState] != NULL ){ - fcns->delayActionTable[curState](data, NULL); - fcns->isDelayActionExcuted[curState] = 1; - } - + excuteDelay(pFSM); FSM **childFSM = pFSM->privateVars.childFSM; int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent; @@ -63,11 +71,11 @@ void stepBaseFSM(FSM *pFSM) if (fcns->transitionTable[index] != NULL) { - fcns->isDelayActionExcuted[curState] = 0; + fcns->isDelayExcuted[curState] = 0; if (fcns->exitActionTable[curState] != NULL) fcns->exitActionTable[curState](data, childFSM); - nextState = (*fcns->transitionTable[index])(data, curState); + nextState = (*fcns->transitionTable[index])(data, curState, fcns->isDelayExcuted); if (fcns->enterActionTable[nextState] != NULL) fcns->enterActionTable[nextState](data, childFSM); @@ -102,9 +110,10 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){ pFSM->privateVars.preloader.isReady = 0; pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); - pFSM->privateVars.fcns.isDelayActionExcuted = calloc(numState, sizeof(int)); + pFSM->privateVars.fcns.isDelayExcuted = calloc(numEvent, sizeof(int)); + memset(pFSM->privateVars.fcns.isDelayExcuted, 1, sizeof(int)); - pFSM->privateVars.fcns.delayActionTable = calloc(numState, sizeof(StateFuncPtr)); + pFSM->privateVars.fcns.transitionDelayTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index eb760ec..8b67be8 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -23,12 +23,14 @@ #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) typedef struct _FSMHandler FSMHandler; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); -typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState); +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 void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -36,19 +38,20 @@ 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) typedef struct _FSM FSM; typedef struct _FSMHandler{ - int (**transitionTable)(void *data, int currentState); + int (**transitionTable)(void *data, int currentState, int *); void (**enterActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM); void (**exitActionTable)(void *data, FSM **cFSM); - int *isDelayActionExcuted; - void (**delayActionTable)(void *data, FSM **childFSM); + int *isDelayExcuted; + 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 d04f724..3192211 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -51,12 +51,10 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(enter, Waiting); addStateActionFcn(during, DownDebouncing); addStateActionFcn(during, Downing); - addStateActionFcn(delay, Downing); addStateActionFcn(during, UpDebouncing); addStateActionFcn(during, Holding); addStateActionFcn(exit, Holding); addStateActionFcn(during, MultiDownWaiting); - addStateActionFcn(delay, MultiDowning); addStateActionFcn(during, HoldUpDebouncing); addStateActionFcn(during, MultiDownDebouncing); @@ -76,6 +74,8 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(HoldUpDebouncing, DelayCount3); addTransitionHandler(MultiDownDebouncing, DelayCount3); addTransitionHandler(MultiDownDebouncing, PhsicalUp); + + addDelayHandler(DelayCount3); } /* diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 3deb8ff..3c31ec0 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -52,10 +52,6 @@ static void actionFcn(during, DownDebouncing)(KeyFSMData* data) FSM_LOG(" during开启消抖 "); } -static void actionFcn(delay, Downing)(KeyFSMData* data) -{ - data->out = Idle; -} static void actionFcn(during, Downing)(KeyFSMData* data) { @@ -93,11 +89,6 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){ } -static void actionFcn(delay, MultiDowning)(KeyFSMData* data) -{ - data->out = Idle; -} - static void actionFcn(during, HoldUpDebouncing)(KeyFSMData* data) { @@ -127,7 +118,7 @@ typedef enum _Event{ Count_Event, }Event; -static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState) +static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted) { FSM_LOG(" 物理按键按下 "); data->countDelay = 0; @@ -157,7 +148,7 @@ static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState) } } -static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState) +static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, int *isDelayExecuted) { FSM_LOG(" 物理按键松开 "); data->countDelay = 0; @@ -185,7 +176,11 @@ static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState) } } -static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){ +static void delayHanlder(DelayCount3)(KeyFSMData* data){ + data->out = Idle; +} + +static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, int *isDelayExecuted){ FSM_LOG(" 延迟计数到3 "); data->countDelay = 0; @@ -193,6 +188,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){ { case DownDebouncing: data->out = Down; + isDelayExecuted[DelayCount3] = 0; FSM_LOG("按键按下"); return Downing; @@ -225,6 +221,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){ break; } FSM_LOG(" 多击%d ", data->countMultiDown+1); + isDelayExecuted[DelayCount3] = 0; return MultiDowning; default: @@ -234,7 +231,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){ } -static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState){ +static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){ FSM_LOG(" 计数到2进入长按模式 "); data->countDelay = 0; diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c index dd3c598..ffe2413 100644 --- a/vscode/FSM_OOP/keytest/main.c +++ b/vscode/FSM_OOP/keytest/main.c @@ -35,8 +35,7 @@ int main(){ printf("第%d次: ",i+1); const KeyFSMData* data = getData((FSM_Ptr)keyFSM); - KeyIn *in = preloadIn((FSM_Ptr)keyFSM); - *in = testin[i]; + *(KeyIn *)preloadIn((FSM_Ptr)keyFSM) = testin[i]; preloaderReady((FSM_Ptr)keyFSM); Step(keyFSM);