From 99dd52db308ba7b451b81eb225b00ab63c3181cd Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 22:09:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E4=BF=A1=E5=8F=B7=E9=9B=86=E6=88=90?= =?UTF-8?q?=E5=88=B0FSM=E5=86=85=E9=83=A8=EF=BC=8C=E4=B8=8D=E5=9C=A8?= =?UTF-8?q?=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;