From 2571447e49e64bd560f8feb747e112dc6099f06c Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 21:18:30 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E7=9A=84=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E6=98=AF=E7=9B=B4=E6=8E=A5=E5=85=A8=E6=B8=85?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E8=80=8C=E6=98=AF=E6=A0=B9=E6=8D=AE=E4=B8=8A?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E4=BF=A1=E5=8F=B7=E7=9A=84=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=83=85=E5=86=B5=E6=B8=85=E9=99=A4=E3=80=82=E5=9B=A0=E4=B8=BA?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BC=9A=E6=9C=89=E4=B8=AD=E6=96=AD=E6=8F=92?= =?UTF-8?q?=E5=85=A5=EF=BC=8C=E5=9C=A8=E6=B8=85=E7=A9=BA=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E5=89=8D=E8=AE=BE=E7=BD=AEerror=E4=BF=A1=E5=8F=B7=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=8A=8Aerror=E4=BF=A1=E5=8F=B7=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E4=BA=86=E7=8A=B6=E6=80=81=E6=9C=BA=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E5=88=B0=E8=BE=BE=E6=95=85=E9=9A=9C=E7=8A=B6=E6=80=81?= 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 | 16 +++---- vscode/FSM_OOP/baseFSM/FSM_protected.h | 10 +++-- vscode/FSM_OOP/baseFSM/FSM_public.h | 2 +- vscode/FSM_OOP/keytest/keyFSM.c | 2 +- vscode/FSM_OOP/template/main.c | 7 ++-- vscode/FSM_OOP/template/templateFSM.c | 42 ++++++++++++++++--- vscode/FSM_OOP/template/templateFSM.h | 32 +++++++++++--- vscode/FSM_OOP/template/templateFSM_private.h | 10 +++-- 9 files changed, 89 insertions(+), 34 deletions(-) diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index db5c3bf..c2ab643 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 4ea05ec..34cdae4 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -13,7 +13,7 @@ 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->data, pFSM->signalRegs); pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; } @@ -34,10 +34,6 @@ static inline void preload(FSM* pFSM){ pFSM->privateVars.preloader.isReady = 0; } } - -static inline void resetSignals(FSM *pFSM){ - memset(pFSM->signals, 0, pFSM->signalSize); -} /* -------------------------------------------------------------------------- */ /* protected */ @@ -45,8 +41,10 @@ static inline void resetSignals(FSM *pFSM){ void stepBaseFSM(FSM *pFSM) { preload(pFSM); + + pFSM->pureVtbl.setIdleSignal(pFSM->signalRegs); setNextState(pFSM); - resetSignals(pFSM); + pFSM->pureVtbl.resetSignals(pFSM->signalRegs); FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; @@ -122,8 +120,8 @@ const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; } -void *_getSignals(FSM* pFSM){ - return pFSM->signals; +void *_getSignalRegs(FSM* pFSM){ + return pFSM->signalRegs; } @@ -182,6 +180,8 @@ FSM* newBaseFSM(int numState, int defaultState){ .initData = NULL, .initDataLoader = NULL, .initSignals = NULL, + .resetSignals = NULL, + .setIdleSignal = NULL, }; pFSM->pureVtbl = pureVtbl; diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index a6680f6..4ebb04e 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -39,7 +39,8 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); 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); +typedef void (*Avoid_WARNING_ResetSignals_Fcns)(void *); +typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signal, unsigned int *); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -48,7 +49,7 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); /* -------------------------------------------------------------------------- */ typedef struct _FSMHandler{ - int (**selectNextState)(void *data, void *signals); + int (**selectNextState)(void *data, void *signal); void (**transitionTable)(void *data); void (*transitionGeneralAction)(void *data); @@ -97,6 +98,8 @@ typedef struct _FSMPureVtbl { // 状态机控制 void (*initData)(FSM *pFSM); // =0子类必须重新实现 void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 + void (*resetSignals)(void *signalRegs); // =0子类必须重新实现 + void (*setIdleSignal)(void *signalRegs); // =0子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 }FSMPureVtbl; @@ -115,8 +118,7 @@ typedef struct _FSM FSMPureVtbl pureVtbl; void *data; - void *signals; - int signalSize; + void *signalRegs; // private FMSPrivateVars privateVars; } FSM; diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index 69ee93a..2cf30c1 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -30,7 +30,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index); /* ------------------------------ Data和Signals ------------------------------ */ const void *_getData(FSM* pFSM); -void *_getSignals(FSM* pFSM); +void *_getSignalRegs(FSM* pFSM); /* ---------------------------------- 预装载器 ---------------------------------- */ void *_preloadIn(FSM *pFSM); diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index b8b0467..2a96f06 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -26,7 +26,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现 pFSM->base.data = data; - pFSM->base.signals = &data->out; + pFSM->base.signalRegs = &data->out; } static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c index cbdf941..22bf410 100644 --- a/vscode/FSM_OOP/template/main.c +++ b/vscode/FSM_OOP/template/main.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 18:52:14 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-20 20:26:40 + * @LastEditTime: 2024-04-23 21:13:16 * @FilePath: \vscode\FSM_OOP\template\main.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -23,15 +23,14 @@ int main(){ TemplateFSM_Input(pFSM)->arrindex = i; PreloaderGetReady(pFSM); - const TemplateFSMData* data = GetData(pFSM); int ovflag = GetPreloaderOverFlag(pFSM); if(i == 3){ - TemplateFSM_Signals(pFSM)->signalA = 1; + setTemplateFSMSignals(pFSM, Signal_A); } if(i == 4){ - TemplateFSM_Signals(pFSM)->signalA = 1; + setTemplateFSMSignals(pFSM, Signal_A); } printf("%d, " ,i); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 4c2b171..5331784 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-23 19:30:13 + * @LastEditTime: 2024-04-23 21:16:03 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -40,13 +40,33 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData); } -static void initSignals(TemplateFSM *pFSM){ // 必须重新实现 - TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals)); - pFSM->base.signals = signals; - pFSM->base.signalSize = sizeof(TemplateFSMSignals); + + +static void initSignals(TemplateFSM *pFSM){ // 必须重新实现 + TemplateFSMSignalRegs *signalRegs = (TemplateFSMSignalRegs *)calloc(1, sizeof(TemplateFSMSignalRegs)); + + pFSM->base.signalRegs = signalRegs; } + +static void setIdleSignal(TemplateFSMSignalRegs *signalRegs){ // 必须重新实现 + signalRegs->lastTriggeredSignal = Idle_Signal; +} + +static void resetSignals(TemplateFSMSignalRegs *signalRegs){ // 必须重新实现 + switch (signalRegs->lastTriggeredSignal) + { + case Signal_A: + signalRegs->signals.bits.signalA = 0; + break; + + default: + break; + } +} + + static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ addSelectNextStateFcn(D); @@ -96,10 +116,20 @@ TemplateFSM *createTemplateFSM(){ pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; - pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; + pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_ResetSignals_Fcns)setupHandler; + pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; + pFSM->base.pureVtbl.setIdleSignal = setIdleSignal; // 调用父类构造函数 constructFSM((FSM *)pFSM); return pFSM; } + + +void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal){ + union _templateFSMSignals *signals = &(((TemplateFSMSignalRegs *)(pFSM->base.signalRegs))->signals); + + + signals->all |= (1 << Signal); +} \ No newline at end of file diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index 0764ad5..9a82dd5 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -9,11 +9,33 @@ /* -------------------------------------------------------------------------- */ /* 自定义数据和信号 */ /* -------------------------------------------------------------------------- */ -typedef struct _templateFSMSignals +enum TemplateFSMSignals{ + Signal_A = 0, + Signal_B, + + Idle_Signal = 127, +}; + + +struct _templateFSMSignalsBits { - int signalA; - int signalB; -}TemplateFSMSignals; + unsigned char signalA : 1; + unsigned char signalB : 1; + +}; + +union _templateFSMSignals { + unsigned int all; + struct _templateFSMSignalsBits bits; +}; + +typedef struct _templateFSMSignalsRegs +{ + union _templateFSMSignals signals; + unsigned int lastTriggeredSignal; +}TemplateFSMSignalRegs; + + typedef struct _templateFSMExternalData { @@ -31,7 +53,6 @@ typedef struct _templateFSMInnerData /* 下面的改个名字就行了 */ /* -------------------------------------------------------------------------- */ #define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) -#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM)) typedef struct _templateFSMData { @@ -42,6 +63,7 @@ typedef struct _templateFSMData typedef struct _TemplateFSM TemplateFSM; TemplateFSM *createTemplateFSM(); +void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal); #endif diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index 815c312..be1a68a 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -31,15 +31,17 @@ typedef enum _State /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ -static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){ - if(signals->signalA){ +static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignalRegs *signalRegs){ + if(signalRegs->signals.bits.signalA){ + signalRegs->lastTriggeredSignal = Signal_A; return E; } return Idle; } -static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){ - if(signals->signalA){ +static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignalRegs *signalRegs){ + if(signalRegs->signals.bits.signalA){ + signalRegs->lastTriggeredSignal = Signal_A; return D; } return Idle; From 99dd52db308ba7b451b81eb225b00ab63c3181cd Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 22:09:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=8A=8A=E4=BF=A1=E5=8F=B7=E9=9B=86?= =?UTF-8?q?=E6=88=90=E5=88=B0FSM=E5=86=85=E9=83=A8=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=9C=A8=E5=AD=90=E7=B1=BB=E9=87=8C=E5=A3=B0=E6=98=8E=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/FSM_OOP/baseFSM/FSM.c | 21 ++++++----- vscode/FSM_OOP/baseFSM/FSM_protected.h | 36 ++++++++++++++----- vscode/FSM_OOP/baseFSM/FSM_public.h | 10 ++++-- vscode/FSM_OOP/template/main.c | 6 ++-- vscode/FSM_OOP/template/templateFSM.c | 36 ++++--------------- vscode/FSM_OOP/template/templateFSM.h | 21 ----------- vscode/FSM_OOP/template/templateFSM_private.h | 12 +++---- 7 files changed, 62 insertions(+), 80 deletions(-) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 34cdae4..4d3e38a 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -13,7 +13,8 @@ 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->signalRegs); + pFSM->signals.lastTriggeredSignal = Idle_Signal; + pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, &pFSM->signals); pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; } @@ -35,16 +36,18 @@ static inline void preload(FSM* pFSM){ } } + + + + /* -------------------------------------------------------------------------- */ /* protected */ /* -------------------------------------------------------------------------- */ void stepBaseFSM(FSM *pFSM) { preload(pFSM); - - pFSM->pureVtbl.setIdleSignal(pFSM->signalRegs); setNextState(pFSM); - pFSM->pureVtbl.resetSignals(pFSM->signalRegs); + pFSM->pureVtbl.resetSignals(&pFSM->signals); FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; @@ -120,11 +123,10 @@ const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; } -void *_getSignalRegs(FSM* pFSM){ - return pFSM->signalRegs; +void _setSignal(FSM *pFSM, Uint16 signalFlag){ + pFSM->signals.all |= (1 << signalFlag); } - void *_preloadIn(FSM *pFSM){ return pFSM->privateVars.preloader.shadowData; } @@ -154,7 +156,7 @@ FSM* newBaseFSM(int numState, int defaultState){ typedef void (*StateFuncPtr)(void *); typedef void (*ChildFSMStepFuncPtr)(FSM **); typedef int (*TransitionFuncPtr)(void *, int *); - typedef int (*SelectNextStateFcnPtr)(void *, void *); + typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *); FSM *pFSM = calloc(1, sizeof(FSM)); pFSM->privateVars.numState = numState; @@ -181,7 +183,6 @@ FSM* newBaseFSM(int numState, int defaultState){ .initDataLoader = NULL, .initSignals = NULL, .resetSignals = NULL, - .setIdleSignal = NULL, }; pFSM->pureVtbl = pureVtbl; @@ -196,12 +197,10 @@ void constructFSM(FSM* pFSM){ assert(pFSM->pureVtbl.setupHandler); assert(pFSM->pureVtbl.initData); assert(pFSM->pureVtbl.initDataLoader); - assert(pFSM->pureVtbl.initSignals); pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns); pFSM->pureVtbl.initData(pFSM); pFSM->pureVtbl.initDataLoader(pFSM); - pFSM->pureVtbl.initSignals(pFSM); /* ---------------------------------- 检查状态表 --------------------------------- */ diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 4ebb04e..18a7fe0 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -34,13 +34,14 @@ typedef struct _FSMHandler FSMHandler; typedef struct _FSM FSM; +typedef struct _FSMSignals FSMSignals; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); 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 void (*Avoid_WARNING_ResetSignals_Fcns)(void *); -typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signal, unsigned int *); +typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM); +typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals); +typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -49,7 +50,7 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); /* -------------------------------------------------------------------------- */ typedef struct _FSMHandler{ - int (**selectNextState)(void *data, void *signal); + int (**selectNextState)(void *data, FSMSignals* signals); void (**transitionTable)(void *data); void (*transitionGeneralAction)(void *data); @@ -89,7 +90,12 @@ typedef struct _FSMPrivateVars }FMSPrivateVars; - +#define Idle_Signal 16 +typedef struct _FSMSignals +{ + Uint16 all; + Uint16 lastTriggeredSignal; +}FSMSignals; /* -------------------------------------------------------------------------- */ /* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */ @@ -98,13 +104,16 @@ typedef struct _FSMPureVtbl { // 状态机控制 void (*initData)(FSM *pFSM); // =0子类必须重新实现 void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 - void (*resetSignals)(void *signalRegs); // =0子类必须重新实现 - void (*setIdleSignal)(void *signalRegs); // =0子类必须重新实现 + void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 }FSMPureVtbl; + + + + /* -------------------------------------------------------------------------- */ /* 基类定义,纯虚类 */ /* -------------------------------------------------------------------------- */ @@ -118,7 +127,7 @@ typedef struct _FSM FSMPureVtbl pureVtbl; void *data; - void *signalRegs; + FSMSignals signals; // private FMSPrivateVars privateVars; } FSM; @@ -134,4 +143,15 @@ FSM* newBaseFSM(int numState, int defaultState); void resetBaseFSM(FSM *pFSM); +/* -------------------------------------------------------------------------- */ +/* 内联函数 */ +/* -------------------------------------------------------------------------- */ +static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){ + signals->all &= ~(1 << signalFlag); +} +static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){ + return (signals->all >> signalFlag) & 1; +} + + #endif diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index 2cf30c1..f65c33d 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -2,23 +2,29 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 18:52:14 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-23 19:34:34 + * @LastEditTime: 2024-04-23 21:51: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_ +typedef unsigned short Uint16; +typedef unsigned long Uint32; + #define BASE_FSM(ptr) ((FSM *)(ptr)) #define BASE_PTR (FSM *) typedef struct _FSM FSM; +/* -------------------------------- 避免警告的函数定义 ------------------------------- */ #define Step(pFSM) _stepFSM((FSM *)pFSM) #define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); #define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) #define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) #define GetData(pFSM) _getData((FSM*)pFSM) +#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal) + void _stepFSM(FSM *pFSM); @@ -30,7 +36,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index); /* ------------------------------ Data和Signals ------------------------------ */ const void *_getData(FSM* pFSM); -void *_getSignalRegs(FSM* pFSM); +void _setSignal(FSM *pFSM, Uint16 signalFlag); /* ---------------------------------- 预装载器 ---------------------------------- */ void *_preloadIn(FSM *pFSM); diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c index 22bf410..df2e7aa 100644 --- a/vscode/FSM_OOP/template/main.c +++ b/vscode/FSM_OOP/template/main.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 18:52:14 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-23 21:13:16 + * @LastEditTime: 2024-04-23 21:50:59 * @FilePath: \vscode\FSM_OOP\template\main.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -27,10 +27,10 @@ int main(){ int ovflag = GetPreloaderOverFlag(pFSM); if(i == 3){ - setTemplateFSMSignals(pFSM, Signal_A); + SetSignal(pFSM, Signal_A); } if(i == 4){ - setTemplateFSMSignals(pFSM, Signal_A); + SetSignal(pFSM, Signal_A); } printf("%d, " ,i); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 5331784..904c193 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-23 21:16:03 + * @LastEditTime: 2024-04-23 22:08:11 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -41,24 +41,12 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 } - - -static void initSignals(TemplateFSM *pFSM){ // 必须重新实现 - TemplateFSMSignalRegs *signalRegs = (TemplateFSMSignalRegs *)calloc(1, sizeof(TemplateFSMSignalRegs)); - - pFSM->base.signalRegs = signalRegs; -} - - -static void setIdleSignal(TemplateFSMSignalRegs *signalRegs){ // 必须重新实现 - signalRegs->lastTriggeredSignal = Idle_Signal; -} - -static void resetSignals(TemplateFSMSignalRegs *signalRegs){ // 必须重新实现 - switch (signalRegs->lastTriggeredSignal) +static void resetSignals(FSMSignals *signals){ // 必须重新实现 + + switch (signals->lastTriggeredSignal) { case Signal_A: - signalRegs->signals.bits.signalA = 0; + clearSignal(signals, Signal_A); break; default: @@ -115,21 +103,11 @@ TemplateFSM *createTemplateFSM(){ pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; - pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; - pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_ResetSignals_Fcns)setupHandler; - pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; - pFSM->base.pureVtbl.setIdleSignal = setIdleSignal; + pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; + pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals; // 调用父类构造函数 constructFSM((FSM *)pFSM); return pFSM; -} - - -void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal){ - union _templateFSMSignals *signals = &(((TemplateFSMSignalRegs *)(pFSM->base.signalRegs))->signals); - - - signals->all |= (1 << Signal); } \ No newline at end of file diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index 9a82dd5..f7bda4b 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -13,30 +13,9 @@ enum TemplateFSMSignals{ Signal_A = 0, Signal_B, - Idle_Signal = 127, }; -struct _templateFSMSignalsBits -{ - unsigned char signalA : 1; - unsigned char signalB : 1; - -}; - -union _templateFSMSignals { - unsigned int all; - struct _templateFSMSignalsBits bits; -}; - -typedef struct _templateFSMSignalsRegs -{ - union _templateFSMSignals signals; - unsigned int lastTriggeredSignal; -}TemplateFSMSignalRegs; - - - typedef struct _templateFSMExternalData { int arrindex; diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index be1a68a..f2a4ad8 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -31,17 +31,17 @@ typedef enum _State /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ -static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignalRegs *signalRegs){ - if(signalRegs->signals.bits.signalA){ - signalRegs->lastTriggeredSignal = Signal_A; +static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){ + if(getSignal(signals, Signal_A)){ + signals->lastTriggeredSignal = Signal_A; return E; } return Idle; } -static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignalRegs *signalRegs){ - if(signalRegs->signals.bits.signalA){ - signalRegs->lastTriggeredSignal = Signal_A; +static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){ + if(getSignal(signals, Signal_A)){ + signals->lastTriggeredSignal = Signal_A; return D; } return Idle; From c9cb5b2cb46408f79c59a7d423d20a266b13b373 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Wed, 24 Apr 2024 13:18:59 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E9=A2=84=E8=A3=85=E8=BD=BD=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E4=BA=86=EF=BC=8C=E7=8E=B0=E5=9C=A8=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E5=B0=86=E6=95=B0=E6=8D=AE=E8=A3=85=E8=BD=BD=E8=BF=9Bdata?= =?UTF-8?q?=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/.vscode/settings.json | 3 +- vscode/FSM_OOP/baseFSM/FSM.c | 4 +- vscode/FSM_OOP/baseFSM/FSM_protected.h | 11 ++-- vscode/FSM_OOP/template/main.c | 11 +++- vscode/FSM_OOP/template/templateFSM.c | 50 +++++++++++-------- vscode/FSM_OOP/template/templateFSM.h | 2 +- vscode/FSM_OOP/template/templateFSM_private.h | 18 ++++++- 7 files changed, 66 insertions(+), 33 deletions(-) diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json index 31d996f..0ff5a7c 100644 --- a/vscode/.vscode/settings.json +++ b/vscode/.vscode/settings.json @@ -35,7 +35,8 @@ "limits": "c", "*.tcc": "c", "typeinfo": "c", - "templatefsm.h": "c" + "templatefsm.h": "c", + "templatefsm_private.h": "c" }, diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 4d3e38a..70f754b 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -45,7 +45,8 @@ static inline void preload(FSM* pFSM){ /* -------------------------------------------------------------------------- */ void stepBaseFSM(FSM *pFSM) { - preload(pFSM); + pFSM->pureVtbl.loadExternalData(pFSM->data); + // preload(pFSM); setNextState(pFSM); pFSM->pureVtbl.resetSignals(&pFSM->signals); @@ -180,6 +181,7 @@ FSM* newBaseFSM(int numState, int defaultState){ FSMPureVtbl pureVtbl = { .setupHandler = NULL, .initData = NULL, + .loadExternalData = NULL, .initDataLoader = NULL, .initSignals = NULL, .resetSignals = NULL, diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 18a7fe0..23c6c26 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -102,18 +102,19 @@ typedef struct _FSMSignals /* -------------------------------------------------------------------------- */ typedef struct _FSMPureVtbl { // 状态机控制 + void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 + void (*initData)(FSM *pFSM); // =0子类必须重新实现 + void (*loadExternalData)(void *extData); // =0子类必须重新实现 + + void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 + void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现 - void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 - void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 }FSMPureVtbl; - - - /* -------------------------------------------------------------------------- */ /* 基类定义,纯虚类 */ /* -------------------------------------------------------------------------- */ diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c index df2e7aa..8daf96a 100644 --- a/vscode/FSM_OOP/template/main.c +++ b/vscode/FSM_OOP/template/main.c @@ -2,7 +2,7 @@ * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 18:52:14 * @LastEditors: godcreator02 qq974980621@gmail.com - * @LastEditTime: 2024-04-23 21:50:59 + * @LastEditTime: 2024-04-24 13:17:49 * @FilePath: \vscode\FSM_OOP\template\main.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -13,6 +13,9 @@ TemplateFSM *pFSM; +int arrindex = 10; +int x = 5; + int main(){ pFSM = createTemplateFSM(); @@ -32,6 +35,12 @@ int main(){ if(i == 4){ SetSignal(pFSM, Signal_A); } + if(i == 8){ + arrindex = 0; + } + if(i == 7){ + x = 0; + } printf("%d, " ,i); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 904c193..154b233 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-23 22:08:11 + * @LastEditTime: 2024-04-24 13:15:26 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -17,28 +17,11 @@ /* -------------------------------------------------------------------------- */ /* 纯虚函数,允许调用privateVars */ /* -------------------------------------------------------------------------- */ -static void initData(TemplateFSM *pFSM){ // 必须重新实现 - TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); - - TemplateFSMData tempData = { - .external = { - .arrindex = 0, - .x = 0, - }, - .inner = { - .inner1 = 0, - .y1 = 0, - }, - }; - *data = tempData; - - pFSM->base.data = data; +static void loadExternalData(TemplateFSMExternalData *extData){ // 必须重新实现 + extData->arrindex = arrindex; + extData->x = x; } -static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 - pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData)); - pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData); -} static void resetSignals(FSMSignals *signals){ // 必须重新实现 @@ -55,6 +38,29 @@ static void resetSignals(FSMSignals *signals){ // 必须重新实现 } +static void initData(TemplateFSM *pFSM){ // 必须重新实现 + TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); + + TemplateFSMData tempData = { + .external = { + .arrindex = 0, + .x = 0, + }, + .internal = { + .inner1 = 0, + .y1 = 0, + }, + }; + *data = tempData; + + pFSM->base.data = data; +} + +static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 + pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData)); + pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData); +} + static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ addSelectNextStateFcn(D); @@ -78,7 +84,6 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 } - /* -------------------------------------------------------------------------- */ /* 其他重新实现的函数,父类已有实现,实现多态 */ /* -------------------------------------------------------------------------- */ @@ -105,6 +110,7 @@ TemplateFSM *createTemplateFSM(){ pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals; + pFSM->base.pureVtbl.loadExternalData = loadExternalData; // 调用父类构造函数 constructFSM((FSM *)pFSM); diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index f7bda4b..d815038 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -36,7 +36,7 @@ typedef struct _templateFSMInnerData typedef struct _templateFSMData { TemplateFSMExternalData external; - TemplateFSMInnerData inner; + TemplateFSMInnerData internal; }TemplateFSMData; typedef struct _TemplateFSM TemplateFSM; diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index f2a4ad8..eefb40d 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -1,10 +1,18 @@ -#ifndef __TEMPLATE_PRIVATE_FSM_H_ +#ifdef __TEMPLATE_PRIVATE_FSM_H_ +#error only include once + +#else #define __TEMPLATE_PRIVATE_FSM_H_ #include "FSM_protected.h" #include "templateFSM.h" #include +/* -------------------------------------------------------------------------- */ +/* 用到的外部变量 */ +/* -------------------------------------------------------------------------- */ +extern int arrindex; +extern int x; /* -------------------------------------------------------------------------- */ @@ -36,6 +44,9 @@ static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){ signals->lastTriggeredSignal = Signal_A; return E; } + else if(arrindex == 0){ + return E; + } return Idle; } @@ -44,6 +55,9 @@ static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){ signals->lastTriggeredSignal = Signal_A; return D; } + else if(x == 0){ + return D; + } return Idle; } @@ -83,7 +97,7 @@ static void actionFcn(exit, E)() /* -------------------------------------------------------------------------- */ /* 转移函数 */ /* -------------------------------------------------------------------------- */ -void transitionGeneralAction(TemplateFSMData *data){ +static void transitionGeneralAction(TemplateFSMData *data){ FSM_LOG("general"); } From 91900ca6d2cbecfeceb95032f51d03ab964fcb7d Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Wed, 24 Apr 2024 14:25:31 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E9=A2=84=E8=A3=85?= =?UTF-8?q?=E8=BD=BD=E5=99=A8=EF=BC=8CkeyFSM=E7=9A=84=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E8=BF=98=E6=98=AF=E6=94=BE=E5=9C=A8data?= =?UTF-8?q?=E9=87=8C=EF=BC=8C=E4=BD=86=E6=98=AF=E5=8F=AF=E4=BB=A5=E5=9C=A8?= =?UTF-8?q?resetSignals=E9=87=8C=E6=B8=85=E9=99=A4=E3=80=82keyFSM=E5=92=8C?= =?UTF-8?q?templateFSM=E5=9D=87=E6=97=A0=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E9=A2=84=E8=A3=85=E8=BD=BD=E5=99=A8=E5=90=8E?= =?UTF-8?q?=E6=95=B4=E4=BD=93=E8=BF=90=E8=A1=8C=E9=80=9F=E5=BA=A6[180?= =?UTF-8?q?=EF=BC=8C280]=EF=BC=8C=E6=AF=94=E4=B9=8B=E5=89=8D=E5=BF=AB30?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_on_28377/main.c | 9 ++- vscode/CMakeLists.txt | 2 +- vscode/FSM_OOP/baseFSM/FSM.c | 5 +- vscode/FSM_OOP/baseFSM/FSM_protected.h | 14 ++-- vscode/FSM_OOP/baseFSM/FSM_public.h | 4 +- vscode/FSM_OOP/keytest/keyFSM.c | 33 ++++----- vscode/FSM_OOP/keytest/keyFSM.h | 24 ++++--- vscode/FSM_OOP/keytest/keyFSM_private.h | 91 +++++++++++++------------ vscode/FSM_OOP/keytest/main.c | 19 +++--- vscode/FSM_OOP/template/templateFSM.c | 12 ++-- vscode/FSM_OOP/template/templateFSM.h | 2 - 11 files changed, 114 insertions(+), 101 deletions(-) diff --git a/test_on_28377/main.c b/test_on_28377/main.c index d38510c..42c889d 100644 --- a/test_on_28377/main.c +++ b/test_on_28377/main.c @@ -64,6 +64,7 @@ int isDown = 0; KeyFSM* keyFSM; KeyFSMData* data; +KeyIn keystat; void keyFSMTest(){ keyFSM = createKeyFSM(); @@ -73,16 +74,14 @@ void keyFSMTest(){ while(1){ - *KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO); - PreloaderGetReady(keyFSM); - + keystat = !GPIO_ReadPin(INPUT_GPIO); tic(); Step(keyFSM); toc(index++); - if(data->out != Idle){ - printf("%s\n", keyStr[data->out]); + if(data->internal.out != Idle){ + printf("%s\n", keyStr[data->internal.out]); } else{ index--; diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index c2ab643..bb30d7d 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 70f754b..9078b3c 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -48,7 +48,7 @@ void stepBaseFSM(FSM *pFSM) pFSM->pureVtbl.loadExternalData(pFSM->data); // preload(pFSM); setNextState(pFSM); - pFSM->pureVtbl.resetSignals(&pFSM->signals); + pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data); FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; @@ -125,7 +125,7 @@ const void *_getData(FSM* pFSM){ } void _setSignal(FSM *pFSM, Uint16 signalFlag){ - pFSM->signals.all |= (1 << signalFlag); + pFSM->signals.external |= (1 << signalFlag); } void *_preloadIn(FSM *pFSM){ @@ -204,7 +204,6 @@ void constructFSM(FSM* pFSM){ pFSM->pureVtbl.initData(pFSM); pFSM->pureVtbl.initDataLoader(pFSM); - /* ---------------------------------- 检查状态表 --------------------------------- */ for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态,Idle状态只能跳转到默认状态 { diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 23c6c26..81a7c25 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -40,7 +40,8 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); 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 void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals); +typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals, void *); +typedef void (*Avoid_WARNING_loadData_Fcns)(void*); typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); @@ -93,7 +94,7 @@ typedef struct _FSMPrivateVars #define Idle_Signal 16 typedef struct _FSMSignals { - Uint16 all; + Uint16 external; Uint16 lastTriggeredSignal; }FSMSignals; @@ -110,7 +111,7 @@ typedef struct _FSMPureVtbl { void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 - void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现 + void (*resetSignals)(FSMSignals *signalRegs, void *data); // =0子类必须重新实现 }FSMPureVtbl; @@ -148,10 +149,13 @@ void resetBaseFSM(FSM *pFSM); /* 内联函数 */ /* -------------------------------------------------------------------------- */ static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){ - signals->all &= ~(1 << signalFlag); + signals->external &= ~(1 << signalFlag); } static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){ - return (signals->all >> signalFlag) & 1; + return (signals->external >> signalFlag) & 1; +} +static inline void clearAllSignals(FSMSignals *signals){ + signals->external = 0; } diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index f65c33d..f31f047 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -9,7 +9,7 @@ #ifndef __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_ -typedef unsigned short Uint16; +typedef unsigned int Uint16; typedef unsigned long Uint32; #define BASE_FSM(ptr) ((FSM *)(ptr)) @@ -46,4 +46,4 @@ void _clearPreloaderOverFlag(FSM *pFSM); -#endif \ No newline at end of file +#endif diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 2a96f06..f982066 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 19:37:03 + * @LastEditTime: 2024-04-24 14:10:19 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -17,26 +17,26 @@ /* -------------------------------------------------------------------------- */ /* 纯虚函数,允许调用privateVars */ /* -------------------------------------------------------------------------- */ -static void initData(KeyFSM *pFSM){ // 必须重新实现 - KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); - data->countDelay = 0; - data->countMultiDown = 0; - data->in = Up; - data->out = Idle; - - pFSM->base.data = data; - - pFSM->base.signalRegs = &data->out; +static void loadExternalData(KeyFSMData *data){ // 必须重新实现 + data->external.in = keystat; } +static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现 + data->internal.out = Idle; +} + +static void initData(KeyFSM *pFSM){ // 必须重新实现 + KeyFSMData *data = (KeyFSMData *)calloc(1, sizeof(KeyFSMData)); + pFSM->base.data = data; +} + + static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn)); pFSM->base.privateVars.preloader.size = sizeof(KeyIn); } -static void initSignals(KeyFSM *pFSM){ // 必须重新实现 - pFSM->base.signalSize = sizeof(KeyOutSignal); -} + static void setupHandler(FSMHandler* fcns){ // 必须重新实现 @@ -85,7 +85,7 @@ static void step(KeyFSM* pFSM){ KeyFSMData * data = pFSM->base.data; - FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay); + FSM_LOG("\t信号:%d, 计数%d ",data->internal.out, data->internal.countDelay); } @@ -104,7 +104,8 @@ KeyFSM *createKeyFSM(){ pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; - pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; + pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals; + pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData; constructFSM((FSM *)pFSM); diff --git a/vscode/FSM_OOP/keytest/keyFSM.h b/vscode/FSM_OOP/keytest/keyFSM.h index 717290e..73bbe12 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.h +++ b/vscode/FSM_OOP/keytest/keyFSM.h @@ -5,18 +5,18 @@ #define KeyFSM_Input(pFSM) (KeyIn *)_preloadIn((FSM *)pFSM) typedef enum _keyIn{ - Up, + pUp, pDown, }KeyIn; -typedef enum _keyOutSignals{ +typedef enum _keyOut{ Idle, Down, Hold, Down_2times, Down_3times, -}KeyOutSignal; +}KeyOut; const static char *keyStr[] = { @@ -27,17 +27,23 @@ const static char *keyStr[] = "Down_3times", }; -typedef struct _keyFSMData +typedef struct _keyFSMExternalData { - /* ----------------------------------- 输入 ----------------------------------- */ KeyIn in; +}KeyFSMExternalData; - /* ----------------------------------- 输出 ----------------------------------- */ - KeyOutSignal out; - - /* ---------------------------------- 内部变量 ---------------------------------- */ +typedef struct _keyFSMInternalData +{ int countDelay; int countMultiDown; + KeyOut out; + +}KeyFSMInternalData; + +typedef struct _keyFSMData +{ + KeyFSMExternalData external; + KeyFSMInternalData internal; }KeyFSMData; typedef struct _KeyFSM KeyFSM; diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 48122bb..0279f39 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -6,6 +6,9 @@ #include #include +extern KeyIn keystat; + + /* 继承基类 */ @@ -40,7 +43,8 @@ typedef enum _State /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ static State selectNextStateFcn(Waiting)(KeyFSMData *data){ - if(data->in == Down){ + + if(data->external.in == Down){ FSM_LOG(" 物理按键按下 "); return DownDebouncing; } @@ -48,29 +52,30 @@ static State selectNextStateFcn(Waiting)(KeyFSMData *data){ } static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){ - if(data->in == Up){ + if(data->external.in == pUp){ FSM_LOG(" 物理按键松开 "); return Waiting; } - else if(data->countDelay == 5){ + + else if(data->internal.countDelay == 5){ return Downing; } return Idle_State; } static State selectNextStateFcn(Downing)(KeyFSMData *data){ - if(data->in == Up){ + if(data->external.in == pUp){ FSM_LOG(" 物理按键松开 "); return UpDebouncing; } - else if(data->countDelay == 10){ + else if(data->internal.countDelay == 10){ return Holding; } return Idle_State; } static State selectNextStateFcn(Holding)(KeyFSMData *data){ - if(data->in == Up){ + if(data->external.in == pUp){ FSM_LOG(" 物理按键松开 "); return HoldUpDebouncing; } @@ -78,27 +83,27 @@ static State selectNextStateFcn(Holding)(KeyFSMData *data){ } static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){ - if(data->in == Down){ + if(data->external.in == Down){ FSM_LOG(" 物理按键按下 "); return Holding; } - else if(data->countDelay == 5){ + else if(data->internal.countDelay == 5){ return Waiting; } return Idle_State; } static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){ - if(data->in == Down){ + if(data->external.in == Down){ FSM_LOG(" 物理按键按下 "); - if(data->countMultiDown){ + if(data->internal.countMultiDown){ return MultiDowning; } else{ return Downing; } } - else if(data->countDelay == 5){ + else if(data->internal.countDelay == 5){ return MultiDownWaiting; } @@ -106,18 +111,18 @@ static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){ } static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){ - if(data->in == Down){ + if(data->external.in == Down){ FSM_LOG(" 物理按键按下 "); return MultiDownDebouncing; } - else if(data->countDelay == 5){ + else if(data->internal.countDelay == 5){ return Waiting; } return Idle_State; } static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){ - if(data->in == Up){ + if(data->external.in == pUp){ FSM_LOG(" 物理按键松开 "); return UpDebouncing; } @@ -125,11 +130,11 @@ static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){ } static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){ - if(data->in == Up){ + if(data->external.in == pUp){ FSM_LOG(" 物理按键松开 "); return MultiDownWaiting; } - else if(data->countDelay == 5){ + else if(data->internal.countDelay == 5){ return MultiDowning; } return Idle_State; @@ -139,51 +144,51 @@ static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){ /* 对应的 action, exit, during 函数 */ /* -------------------------------------------------------------------------- */ static void actionFcn(enter, Waiting)(KeyFSMData* data){ - data->out = Idle; - data->countDelay = 0; - data->countMultiDown = 0; + data->internal.out = Idle; + data->internal.countDelay = 0; + data->internal.countMultiDown = 0; } static void actionFcn(during, DownDebouncing)(KeyFSMData* data) { - data->countDelay++; + data->internal.countDelay++; FSM_LOG(" during开启消抖 "); } static void actionFcn(during, Downing)(KeyFSMData* data) { - data->countDelay++; - data->out = Idle; + data->internal.countDelay++; + data->internal.out = Idle; } static void actionFcn(during, UpDebouncing)(KeyFSMData* data){ - data->countDelay++; + data->internal.countDelay++; FSM_LOG(" during松开消抖 "); } static void actionFcn(during, Holding)(KeyFSMData* data){ - data->out = Idle; - data->countDelay++; - if(data->countDelay == 2){ - data->out = Hold; - data->countDelay = 0; + data->internal.out = Idle; + data->internal.countDelay++; + if(data->internal.countDelay == 2){ + data->internal.out = Hold; + data->internal.countDelay = 0; } } static void actionFcn(exit, Holding)(KeyFSMData* data){ - data->out = Idle; + data->internal.out = Idle; } static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){ - data->countDelay++; + data->internal.countDelay++; FSM_LOG(" during多击等待 "); } @@ -191,13 +196,13 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){ static void actionFcn(during, HoldUpDebouncing)(KeyFSMData* data) { - data->countDelay++; + data->internal.countDelay++; } static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data) { - data->countDelay++; + data->internal.countDelay++; } @@ -205,43 +210,43 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data) /* 转移函数 */ /* -------------------------------------------------------------------------- */ void transitionGeneralAction(KeyFSMData *data){ - data->countDelay = 0; + data->internal.countDelay = 0; } static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){ - data->out = Down; + data->internal.out = Down; } static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){ - data->out = Idle; - data->countMultiDown++; + data->internal.out = Idle; + data->internal.countMultiDown++; } static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){ - switch (data->countMultiDown + 1) + switch (data->internal.countMultiDown + 1) { case 2: - data->out = Down_2times; + data->internal.out = Down_2times; break; case 3: - data->out = Down_3times; + data->internal.out = Down_3times; break; default: printf("reach MultiDown Limit!\n"); break; } - FSM_LOG(" 多击%d ", data->countMultiDown+1); + FSM_LOG(" 多击%d ", data->internal.countMultiDown+1); } static State transitionHandler(Downing, Holding)(KeyFSMData* data){ - data->out = Hold; + data->internal.out = Hold; } static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){ - data->countMultiDown = 0; + data->internal.countMultiDown = 0; } @@ -265,7 +270,7 @@ const static char *stateStr[] = { 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->internal.countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]); } diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c index 07d4abf..59ac37c 100644 --- a/vscode/FSM_OOP/keytest/main.c +++ b/vscode/FSM_OOP/keytest/main.c @@ -7,18 +7,20 @@ KeyIn testin[NUM] = { - Up,Up,pDown,pDown,Up, + pUp,pUp,pDown,pDown,pUp, pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, - Up,Up,Up,Up,Up, - Up,Up,pDown,pDown,pDown, + pUp,pUp,pUp,pUp,pUp, + pUp,pUp,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, - pDown,pDown,pDown,Up,Up, + pDown,pDown,pDown,pUp,pUp, pDown,pDown,pDown,pDown }; +KeyIn keystat; + int main(){ KeyFSM* keyFSM = createKeyFSM(); @@ -28,13 +30,12 @@ int main(){ printf("第%d次: ",i+1); const KeyFSMData* data = _getData((FSM *)keyFSM); - *KeyFSM_Input(keyFSM) = testin[i]; - PreloaderGetReady(keyFSM); - ClearPreloaderOverFlag(keyFSM); + keystat = testin[i]; + Step(keyFSM); - if(data->out){ - printf("\t\t\t\t%d", data->out); + if(data->internal.out){ + printf("\t\t\t\t%d", data->internal.out); } printf("\n"); } diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 154b233..c556e03 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-24 13:15:26 + * @LastEditTime: 2024-04-24 14:23:07 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -17,14 +17,14 @@ /* -------------------------------------------------------------------------- */ /* 纯虚函数,允许调用privateVars */ /* -------------------------------------------------------------------------- */ -static void loadExternalData(TemplateFSMExternalData *extData){ // 必须重新实现 - extData->arrindex = arrindex; - extData->x = x; +static void loadExternalData(TemplateFSMData *data){ // 必须重新实现 + data->external.arrindex = arrindex; + data->external.x = x; } -static void resetSignals(FSMSignals *signals){ // 必须重新实现 +static void resetSignals(FSMSignals *signals, TemplateFSMData *data){ // 必须重新实现 switch (signals->lastTriggeredSignal) { @@ -110,7 +110,7 @@ TemplateFSM *createTemplateFSM(){ pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals; - pFSM->base.pureVtbl.loadExternalData = loadExternalData; + pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData; // 调用父类构造函数 constructFSM((FSM *)pFSM); diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index d815038..de90031 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -42,7 +42,5 @@ typedef struct _templateFSMData typedef struct _TemplateFSM TemplateFSM; TemplateFSM *createTemplateFSM(); -void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal); - #endif