From c063cfe90f9c0c93e4dc0aab8fab474ee58c10a4 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 17:37:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=85=E9=A1=BB=E4=BF=9D=E7=95=99=E9=A2=84?= =?UTF-8?q?=E8=A3=85=E8=BD=BD=E5=99=A8=EF=BC=8C=E5=8A=A0=E9=94=81=E5=81=9A?= =?UTF-8?q?=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/.vscode/settings.json | 12 ++++++- vscode/CMakeLists.txt | 2 +- vscode/FSM_OOP/baseFSM/FSM.c | 33 ++++++++--------- vscode/FSM_OOP/baseFSM/FSM_protected.h | 15 ++++---- vscode/FSM_OOP/baseFSM/FSM_public.h | 1 - vscode/FSM_OOP/keytest/keyFSM.c | 19 +++++----- vscode/FSM_OOP/keytest/keyFSM_private.h | 5 +-- vscode/FSM_OOP/template/templateFSM.c | 36 ++++++++----------- vscode/FSM_OOP/template/templateFSM.h | 25 ++++++++----- vscode/FSM_OOP/template/templateFSM_private.h | 4 --- 10 files changed, 73 insertions(+), 79 deletions(-) diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json index 6f50b72..395c5dc 100644 --- a/vscode/.vscode/settings.json +++ b/vscode/.vscode/settings.json @@ -24,7 +24,17 @@ "keyfsm.h": "c", "fsm_public.h": "c", "stdio.h": "c", - "assert.h": "c" + "assert.h": "c", + "climits": "c", + "cmath": "c", + "cstdarg": "c", + "cstdint": "c", + "cstdio": "c", + "cstdlib": "c", + "type_traits": "c", + "limits": "c", + "*.tcc": "c", + "typeinfo": "c" }, diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index 7dbe98e..db5c3bf 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 a169665..68208f6 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -14,7 +14,7 @@ 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.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->privateVars.data, pFSM->privateVars.childFSM); pFSM->privateVars.curState = 0; } @@ -22,7 +22,7 @@ void resetBaseFSM(FSM *pFSM) static inline void setNextState(FSM* pFSM){ int curState = pFSM->privateVars.curState; if(curState != 0){ - pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals); + pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->privateVars.data, pFSM->signals); } if(0 == pFSM->privateVars.numChild) @@ -37,9 +37,9 @@ static inline void setNextState(FSM* pFSM){ } static inline void preload(FSM* pFSM){ - if(pFSM->privateVars.preloader.isReady){ - memcpy(pFSM->data, pFSM->privateVars.preloader.in, pFSM->privateVars.preloader.preloadSize); - pFSM->privateVars.preloader.isReady = 0; + if(pFSM->preloader.isReady){ + memcpy(pFSM->privateVars.data, pFSM->preloader.shadowData, pFSM->preloader.size); + pFSM->preloader.isReady = 0; } } @@ -53,10 +53,10 @@ void stepBaseFSM(FSM *pFSM) setNextState(pFSM); // pFSM->vtbl.resetSignals(pFSM); resetSignals(pFSM); - + FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; - void *data = pFSM->data; + void *data = pFSM->privateVars.data; FSM **childFSM = pFSM->privateVars.childFSM; int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; int nextState = pFSM->privateVars.nextState; @@ -103,7 +103,7 @@ FSM* newBaseFSM(int numState, int defaultState){ pFSM->privateVars.nextState = 0; pFSM->privateVars.numChild = 0; - pFSM->privateVars.preloader.isReady = 0; + pFSM->preloader.isReady = 0; pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); @@ -114,10 +114,7 @@ FSM* newBaseFSM(int numState, int defaultState){ pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); - - - FSMVtbl vtbl = { .reset = resetBaseFSM, .step = stepBaseFSM, @@ -176,7 +173,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index){ } const void *_getData(FSM* pFSM){ - return (const void *)pFSM->data; + return (const void *)pFSM->privateVars.data; } void *_getSignals(FSM* pFSM){ @@ -185,22 +182,22 @@ void *_getSignals(FSM* pFSM){ void *_preloadIn(FSM *pFSM){ - return pFSM->privateVars.preloader.in; + return pFSM->preloader.shadowData; } void _preloaderGetReady(FSM *pFSM){ - if(pFSM->privateVars.preloader.isReady){ - pFSM->privateVars.preloader.isOverflow = 1; + if(pFSM->preloader.isReady){ + pFSM->preloader.isOverflow = 1; } - pFSM->privateVars.preloader.isReady = 1; + pFSM->preloader.isReady = 1; } int _getPreloaderOverFlag(FSM *pFSM){ - return pFSM->privateVars.preloader.isOverflow; + return pFSM->preloader.isOverflow; } void _clearPreloaderOverFlag(FSM *pFSM){ - pFSM->privateVars.preloader.isOverflow = 0; + pFSM->preloader.isOverflow = 0; } diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index e44d777..d6cfe57 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -25,14 +25,13 @@ #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_General_Handlers)(void *data); +typedef void (*Avoid_WARNING_General_Handlers)(void *data); 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); @@ -42,7 +41,6 @@ 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_General_Handlers)delayHanlder(curstate, nextstate) @@ -63,10 +61,10 @@ typedef struct _FSMHandler{ typedef struct _FSMDataLoader { - void *in; + void *shadowData; int isReady; int isOverflow; - size_t preloadSize; + size_t size; }FSMDataLoader; @@ -78,12 +76,13 @@ typedef struct _FSMPrivateVars int curState; int nextState; - FSMDataLoader preloader; - FSMHandler fcns; int numChild; FSM **childFSM; + + void *data; + }FMSPrivateVars; @@ -98,7 +97,7 @@ typedef struct _FSM FMSPrivateVars privateVars; // protected - void *data; + FSMDataLoader preloader; void *signals; int signalSize; } FSM; diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index de53c39..365e891 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -30,7 +30,6 @@ typedef struct _FSMVtbl { void (*initData)(FSM *pFSM); // 子类必须重新实现 void (*initSignals)(FSM *pFSM); // 子类必须重新实现 - void (*resetSignals)(FSM *pFSM); // 子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现 }FSMVtbl; diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index a9a4a2f..a996328 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 15:07:57 + * @LastEditTime: 2024-04-23 17:15:11 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -22,7 +22,7 @@ static void step(KeyFSM* pFSM){ printFSM(pFSM); stepBaseFSM((FSM *)pFSM); - KeyFSMData * data = pFSM->base.data; + KeyFSMData * data = pFSM->base.privateVars.data; FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay); } @@ -34,22 +34,20 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现 data->in = Up; data->out = Idle; - pFSM->base.data = data; + pFSM->base.privateVars.data = data; + pFSM->base.signals = &data->out; } static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 - pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn)); - pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn); + pFSM->base.preloader.shadowData = malloc(sizeof(KeyIn)); + pFSM->base.preloader.size = sizeof(KeyIn); } -static void initSignals(KeyFSM *pFSM){ +static void initSignals(KeyFSM *pFSM){ // 必须重新实现 pFSM->base.signalSize = sizeof(KeyOutSignal); } -static void resetSignals(KeyFSM *pFSM){ - memset(pFSM->base.signals, 0, sizeof(KeyOutSignal)); -} static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ @@ -84,7 +82,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(MultiDownWaiting, Waiting); - fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction; + fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } /* @@ -104,7 +102,6 @@ KeyFSM *createKeyFSM(){ 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 15ea1d9..516ee20 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -212,9 +212,6 @@ static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){ data->out = Down; } -static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){ - data->out = Idle; -} static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){ data->out = Idle; @@ -266,7 +263,7 @@ const static char *stateStr[] = { }; static void printFSM(KeyFSM* pFSM){ - KeyFSMData* data = pFSM->base.data; + KeyFSMData* data = pFSM->base.privateVars.data; FSM_LOG("KeyFSM: "); FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]); } diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index b2f3e5a..11ccaee 100644 --- a/vscode/FSM_OOP/template/templateFSM.c +++ b/vscode/FSM_OOP/template/templateFSM.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 20:08:03 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-20 21:05:34 + * @LastEditTime: 2024-04-23 17:09:52 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -26,39 +26,34 @@ static void step(TemplateFSM* pFSM){ static void initData(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); + TemplateFSMData tempData = { - .in = { + .external = { .arrindex = 0, .x = 0, }, - .inner1 = 0, - .y1 = 0, + .inner = { + .inner1 = 0, + .y1 = 0, + }, }; *data = tempData; - pFSM->base.data = data; + pFSM->base.privateVars.data = data; } static void initSignals(TemplateFSM *pFSM){ - TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals)); - TemplateFSMSignals tempSignals = { - .signalA = 0, - .signalB = 0, - }; - *signals = tempSignals; + TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals)); + pFSM->base.signals = signals; + pFSM->base.signalSize = sizeof(TemplateFSMSignals); } -static void resetSignals(TemplateFSM *pFSM){ - memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals)); -} - - static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 - pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn)); - pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn); + pFSM->base.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData)); + pFSM->base.preloader.size = sizeof(TemplateFSMExternalData); } @@ -83,9 +78,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(D, E); addTransitionHandler(E, D); - addDelayHandler(D, E); - - fcns->transitionGeneralAction = &transitionGeneralAction; + fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } /* @@ -100,7 +93,6 @@ TemplateFSM *createTemplateFSM(){ pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; - pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index a902b9f..c9edb79 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -2,26 +2,33 @@ #define __TEMPLATE_FSM_H_ -#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM)) +#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) #define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM)) -typedef struct _templateFSMIn -{ - int arrindex; - int x; -}TemplateFSMIn; - typedef struct _templateFSMSignals { int signalA; int signalB; }TemplateFSMSignals; -typedef struct _templateFSMData + +typedef struct _templateFSMExternalData +{ + int arrindex; + int x; +}TemplateFSMExternalData; + +typedef struct _templateFSMInnerData { - TemplateFSMIn in; int y1; int inner1; +}TemplateFSMInnerData; + + +typedef struct _templateFSMData +{ + TemplateFSMExternalData external; + TemplateFSMInnerData inner; }TemplateFSMData; diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index 1da941e..6fb94d4 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -93,10 +93,6 @@ static void transitionHandler(Idle, D)() FSM_LOG(" Idle2D "); } -static void delayHanlder(D, E)(TemplateFSMData *data){ - FSM_LOG(" DelayD2E"); -} - static State transitionHandler(Idle, E)() { FSM_LOG(" Idle2E ");