From 2571447e49e64bd560f8feb747e112dc6099f06c Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 21:18:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E7=9A=84=E6=B8=85=E9=99=A4?= =?UTF-8?q?=E4=B8=8D=E6=98=AF=E7=9B=B4=E6=8E=A5=E5=85=A8=E6=B8=85=E9=99=A4?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E6=98=AF=E6=A0=B9=E6=8D=AE=E4=B8=8A=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E4=BF=A1=E5=8F=B7=E7=9A=84=E5=93=8D=E5=BA=94=E6=83=85?= =?UTF-8?q?=E5=86=B5=E6=B8=85=E9=99=A4=E3=80=82=E5=9B=A0=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=BC=9A=E6=9C=89=E4=B8=AD=E6=96=AD=E6=8F=92=E5=85=A5?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E6=B8=85=E7=A9=BA=E4=BF=A1=E5=8F=B7=E5=89=8D?= =?UTF-8?q?=E8=AE=BE=E7=BD=AEerror=E4=BF=A1=E5=8F=B7=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E6=8A=8Aerror=E4=BF=A1=E5=8F=B7=E6=B8=85=E9=99=A4?= =?UTF-8?q?=E4=BA=86=E7=8A=B6=E6=80=81=E6=9C=BA=E4=B8=8D=E4=BC=9A=E5=88=B0?= =?UTF-8?q?=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;