From 8f259cb0227076390919c531fa2159e54ea8d8a0 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 19:35:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=95=B4=E7=90=86public?= =?UTF-8?q?=EF=BC=8Cprotected=EF=BC=8Cprivate=E5=85=B3=E7=B3=BB=EF=BC=8Cte?= =?UTF-8?q?mplate=E6=96=87=E4=BB=B6=E6=9B=B4=E6=96=B0=E4=BA=86=EF=BC=8Ckey?= =?UTF-8?q?=E8=BF=98=E6=B2=A1=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/.vscode/settings.json | 3 +- vscode/CMakeLists.txt | 2 +- vscode/FSM_OOP/baseFSM/FSM.c | 184 +++++++++--------- vscode/FSM_OOP/baseFSM/FSM_protected.h | 64 +++--- vscode/FSM_OOP/baseFSM/FSM_public.h | 20 +- vscode/FSM_OOP/childtest/ParentFSM.c | 18 +- vscode/FSM_OOP/childtest/childFSM.c | 12 +- vscode/FSM_OOP/keytest/keyFSM.c | 12 +- vscode/FSM_OOP/template/templateFSM.c | 67 ++++--- vscode/FSM_OOP/template/templateFSM.h | 16 +- vscode/FSM_OOP/template/templateFSM_private.h | 21 +- 11 files changed, 220 insertions(+), 199 deletions(-) diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json index 395c5dc..31d996f 100644 --- a/vscode/.vscode/settings.json +++ b/vscode/.vscode/settings.json @@ -34,7 +34,8 @@ "type_traits": "c", "limits": "c", "*.tcc": "c", - "typeinfo": "c" + "typeinfo": "c", + "templatefsm.h": "c" }, 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 68208f6..4ea05ec 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -7,22 +7,14 @@ #include "FSM_protected.h" #include "FSM_public.h" -/* - protected 函数 - */ - -void resetBaseFSM(FSM *pFSM) -{ - if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL) - pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->privateVars.data, pFSM->privateVars.childFSM); - - pFSM->privateVars.curState = 0; -} - +/* -------------------------------------------------------------------------- */ +/* private函数 */ +/* -------------------------------------------------------------------------- */ static inline void setNextState(FSM* pFSM){ int curState = pFSM->privateVars.curState; if(curState != 0){ - pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->privateVars.data, pFSM->signals); + pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals); + pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; } if(0 == pFSM->privateVars.numChild) @@ -37,9 +29,9 @@ static inline void setNextState(FSM* pFSM){ } static inline void preload(FSM* pFSM){ - if(pFSM->preloader.isReady){ - memcpy(pFSM->privateVars.data, pFSM->preloader.shadowData, pFSM->preloader.size); - pFSM->preloader.isReady = 0; + if(pFSM->privateVars.preloader.isReady){ + memcpy(pFSM->data, pFSM->privateVars.preloader.shadowData, pFSM->privateVars.preloader.size); + pFSM->privateVars.preloader.isReady = 0; } } @@ -47,18 +39,20 @@ static inline void resetSignals(FSM *pFSM){ memset(pFSM->signals, 0, pFSM->signalSize); } +/* -------------------------------------------------------------------------- */ +/* protected */ +/* -------------------------------------------------------------------------- */ void stepBaseFSM(FSM *pFSM) { preload(pFSM); setNextState(pFSM); - // pFSM->vtbl.resetSignals(pFSM); resetSignals(pFSM); FSMHandler *fcns = &pFSM->privateVars.fcns; int curState = pFSM->privateVars.curState; - void *data = pFSM->privateVars.data; + void *data = pFSM->data; FSM **childFSM = pFSM->privateVars.childFSM; - int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; + int index = pFSM->privateVars.index; int nextState = pFSM->privateVars.nextState; @@ -90,71 +84,23 @@ void stepBaseFSM(FSM *pFSM) } } -FSM* newBaseFSM(int numState, int defaultState){ - typedef void (*StateFuncPtr)(void *); - typedef void (*ChildFSMStepFuncPtr)(FSM **); - typedef int (*TransitionFuncPtr)(void *, int *); - typedef int (*SelectNextStateFcnPtr)(void *, void *); - FSM *pFSM = calloc(1, sizeof(FSM)); - pFSM->privateVars.numState = numState; - pFSM->privateVars.defaultState = defaultState; +/* -------------------------------------------------------------------------- */ +/* public 函数 */ +/* -------------------------------------------------------------------------- */ +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.curState = 0; - pFSM->privateVars.nextState = 0; - pFSM->privateVars.numChild = 0; +} - pFSM->preloader.isReady = 0; - - pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); - pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); - pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); - - pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); - pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); - pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr)); - - pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); - - FSMVtbl vtbl = { - .reset = resetBaseFSM, - .step = stepBaseFSM, - .setupHandler = NULL, - .initData = NULL, - .initDataLoader = NULL, - .initSignals = NULL, - }; - - pFSM->vtbl = vtbl; - return pFSM; +void _stepFSM(FSM *pFSM){ + pFSM->step(pFSM); } -void constructFSM(FSM* pFSM){ - assert(pFSM->vtbl.setupHandler); - assert(pFSM->vtbl.initData); - assert(pFSM->vtbl.initDataLoader); - assert(pFSM->vtbl.initSignals); - - pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns); - pFSM->vtbl.initData(pFSM); - pFSM->vtbl.initDataLoader(pFSM); - pFSM->vtbl.initSignals(pFSM); - - - /* ---------------------------------- 检查状态表 --------------------------------- */ - for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态,Idle状态只能跳转到默认状态 - { - if(!pFSM->privateVars.fcns.selectNextState[i]){ - FSM_LOG("每个状态都要有一个状态选择函数!\n"); - assert(0); // 强制退出 - } - } -} - - -/* - public 函数 - */ int getFSMCurState(FSM *pFSM){ return pFSM->privateVars.curState; } @@ -173,7 +119,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index){ } const void *_getData(FSM* pFSM){ - return (const void *)pFSM->privateVars.data; + return (const void *)pFSM->data; } void *_getSignals(FSM* pFSM){ @@ -182,25 +128,89 @@ void *_getSignals(FSM* pFSM){ void *_preloadIn(FSM *pFSM){ - return pFSM->preloader.shadowData; + return pFSM->privateVars.preloader.shadowData; } void _preloaderGetReady(FSM *pFSM){ - if(pFSM->preloader.isReady){ - pFSM->preloader.isOverflow = 1; + if(pFSM->privateVars.preloader.isReady){ + pFSM->privateVars.preloader.isOverflow = 1; } - pFSM->preloader.isReady = 1; + pFSM->privateVars.preloader.isReady = 1; } int _getPreloaderOverFlag(FSM *pFSM){ - return pFSM->preloader.isOverflow; + return pFSM->privateVars.preloader.isOverflow; } void _clearPreloaderOverFlag(FSM *pFSM){ - pFSM->preloader.isOverflow = 0; + pFSM->privateVars.preloader.isOverflow = 0; } -FSMVtbl *_vptrFSM(FSM* pFSM){ - return &pFSM->vtbl; + + +/* -------------------------------------------------------------------------- */ +/* 构造函数,分两段,先新建再赋值 */ +/* -------------------------------------------------------------------------- */ +FSM* newBaseFSM(int numState, int defaultState){ + typedef void (*StateFuncPtr)(void *); + typedef void (*ChildFSMStepFuncPtr)(FSM **); + typedef int (*TransitionFuncPtr)(void *, int *); + typedef int (*SelectNextStateFcnPtr)(void *, void *); + + FSM *pFSM = calloc(1, sizeof(FSM)); + pFSM->privateVars.numState = numState; + pFSM->privateVars.defaultState = defaultState; + pFSM->privateVars.curState = 0; + pFSM->privateVars.nextState = 0; + pFSM->privateVars.numChild = 0; + + pFSM->privateVars.preloader.isReady = 0; + + pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); + pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); + pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); + + pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); + pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); + pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr)); + + pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr)); + + FSMPureVtbl pureVtbl = { + .setupHandler = NULL, + .initData = NULL, + .initDataLoader = NULL, + .initSignals = NULL, + }; + pFSM->pureVtbl = pureVtbl; + + pFSM->step = stepBaseFSM; + pFSM->reset = resetBaseFSM; + + return pFSM; } + + +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); + + + /* ---------------------------------- 检查状态表 --------------------------------- */ + for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态,Idle状态只能跳转到默认状态 + { + if(!pFSM->privateVars.fcns.selectNextState[i]){ + FSM_LOG("每个状态都要有一个状态选择函数!\n"); + assert(0); // 强制退出 + } + } +} + diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index d6cfe57..a6680f6 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -17,19 +17,24 @@ #define FSM_LOG(...) ((void)0) #endif -#define delay delay #define during during #define enter enter #define exit exit - #define selectNextStateFcn(curstate) curstate##_##selectNextState #define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler #define actionFcn(action, curstate) curstate##_##action##Action #define index(curstate, nextstate) (curstate*Count_State + nextstate) +#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) + + typedef struct _FSMHandler FSMHandler; +typedef struct _FSM FSM; + 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); @@ -38,14 +43,10 @@ typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals); 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) +/* -------------------------------------------------------------------------- */ +/* private数据类型,但是不能声明到private.h里 */ +/* -------------------------------------------------------------------------- */ - - - -typedef struct _FSM FSM; typedef struct _FSMHandler{ int (**selectNextState)(void *data, void *signals); @@ -75,40 +76,59 @@ typedef struct _FSMPrivateVars int curState; int nextState; + int index; FSMHandler fcns; int numChild; FSM **childFSM; - void *data; - + FSMDataLoader preloader; + }FMSPrivateVars; -// 类似于纯虚类, vptr中的函数必须继承后重新实现 + +/* -------------------------------------------------------------------------- */ +/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */ +/* -------------------------------------------------------------------------- */ +typedef struct _FSMPureVtbl { + // 状态机控制 + void (*initData)(FSM *pFSM); // =0子类必须重新实现 + void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 + void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 + void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 +}FSMPureVtbl; + + +/* -------------------------------------------------------------------------- */ +/* 基类定义,纯虚类 */ +/* -------------------------------------------------------------------------- */ typedef struct _FSM { // public functions - FSMVtbl vtbl; - - // private - FMSPrivateVars privateVars; + void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 + void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 // protected - FSMDataLoader preloader; + FSMPureVtbl pureVtbl; + + void *data; void *signals; int signalSize; + // private + FMSPrivateVars privateVars; } FSM; -// protected, 子类能用, 外界用不了 -void constructFSM(FSM* pFSM); - -// 继承的函数 -FSM* newBaseFSM(int numState, int defaultState); +/* -------------------------------------------------------------------------- */ +/* protected函数,子类能用外界用不了 */ +/* -------------------------------------------------------------------------- */ void stepBaseFSM(FSM *pFSM); + +void constructFSM(FSM* pFSM); +FSM* newBaseFSM(int numState, int defaultState); void resetBaseFSM(FSM *pFSM); diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index 365e891..69ee93a 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -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 19:12:55 + * @LastEditTime: 2024-04-23 19:34:34 * @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -14,26 +14,14 @@ typedef struct _FSM FSM; -#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) +#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) -typedef struct _FSMHandler FSMHandler; -// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现 -typedef struct _FSMVtbl { - // 状态机控制 - void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 - void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 - - void (*initData)(FSM *pFSM); // 子类必须重新实现 - void (*initSignals)(FSM *pFSM); // 子类必须重新实现 - void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现 - void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现 -}FSMVtbl; - +void _stepFSM(FSM *pFSM); /* --------------------------------- 状态机信息获取 -------------------------------- */ int getFSMCurState(FSM *pFSM); int getFSMNextState(FSM *pFSM); @@ -50,8 +38,6 @@ void _preloaderGetReady(FSM *pFSM); int _getPreloaderOverFlag(FSM *pFSM); void _clearPreloaderOverFlag(FSM *pFSM); -/* ---------------------------------- 虚函数表 ---------------------------------- */ -FSMVtbl *_vptrFSM(FSM* pFSM); #endif \ No newline at end of file diff --git a/vscode/FSM_OOP/childtest/ParentFSM.c b/vscode/FSM_OOP/childtest/ParentFSM.c index 5739770..a84f4b8 100644 --- a/vscode/FSM_OOP/childtest/ParentFSM.c +++ b/vscode/FSM_OOP/childtest/ParentFSM.c @@ -88,17 +88,17 @@ void B_enterAction(void *data, FSM **childFSM){ FSM_LOG(" enterB "); FSM *cFSM = childFSM[0]; - cFSM->vtbl.step(cFSM); + cFSM->pureVtbl.step(cFSM); } void B_duringAction(void *data, FSM **childFSM){ FSM_LOG(" duringB "); FSM *cFSM = childFSM[0]; - cFSM->vtbl.step(cFSM); + cFSM->pureVtbl.step(cFSM); } void B_exitAction(void *data, FSM **childFSM){ FSM *cFSM = childFSM[0]; - cFSM->vtbl.reset(cFSM); + cFSM->pureVtbl.reset(cFSM); FSM_LOG(" exitB "); } @@ -171,7 +171,7 @@ static void printFSM(ParentFSM* pFSM){ static void step(ParentFSM* pFSM){ printFSM(pFSM); - stepBaseFSM(BASE_FSM(pFSM)); + _stepFSM(BASE_FSM(pFSM)); } static void reset(ParentFSM* pFSM){ @@ -197,11 +197,11 @@ ParentFSM *createParentFSM(){ ParentFSM *pFSM; pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); - pFSM->base.vtbl.step = step; - pFSM->base.vtbl.selectNextState = selectEvent; - pFSM->base.vtbl.initData = initData; - pFSM->base.vtbl.setupHandler = setupHandler; - pFSM->base.vtbl.initDataLoader = initDataLoader; + pFSM->base.pureVtbl.step = step; + pFSM->base.pureVtbl.selectNextState = selectEvent; + pFSM->base.pureVtbl.initData = initData; + pFSM->base.pureVtbl.setupHandler = setupHandler; + pFSM->base.pureVtbl.initDataLoader = initDataLoader; constructFSM((FSM *)pFSM); return pFSM; diff --git a/vscode/FSM_OOP/childtest/childFSM.c b/vscode/FSM_OOP/childtest/childFSM.c index 29a4e22..e887f19 100644 --- a/vscode/FSM_OOP/childtest/childFSM.c +++ b/vscode/FSM_OOP/childtest/childFSM.c @@ -29,7 +29,7 @@ static Event selectEvent(ChildFSMData *data){ // 必须重新实现 static void step(ChildFSM* pFSM){ printFSM(pFSM); - stepBaseFSM(BASE_FSM(pFSM)); + _stepFSM(BASE_FSM(pFSM)); } static void initData(ChildFSM *pFSM){ // 必须重新实现 @@ -70,11 +70,11 @@ ChildFSM *createChildFSM(){ ChildFSM *pFSM; pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); - pFSM->base.vtbl.step = step; - pFSM->base.vtbl.selectNextState = selectEvent; - pFSM->base.vtbl.initData = initData; - pFSM->base.vtbl.setupHandler = setupHandler; - pFSM->base.vtbl.initDataLoader = initDataLoader; + pFSM->base.pureVtbl.step = step; + pFSM->base.pureVtbl.selectNextState = selectEvent; + pFSM->base.pureVtbl.initData = initData; + pFSM->base.pureVtbl.setupHandler = setupHandler; + pFSM->base.pureVtbl.initDataLoader = initDataLoader; constructFSM((FSM *)pFSM); diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index a996328..b12e837 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -20,7 +20,7 @@ static void step(KeyFSM* pFSM){ printFSM(pFSM); - stepBaseFSM((FSM *)pFSM); + _stepFSM((FSM *)pFSM); KeyFSMData * data = pFSM->base.privateVars.data; @@ -95,13 +95,13 @@ KeyFSM *createKeyFSM(){ pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE); #ifndef DSP28377 - pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; + pFSM->base.pureVtbl.step = (Avoid_WARNING_Overrider_Fcns)step; #endif - pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; - 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.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; constructFSM((FSM *)pFSM); diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c index 11ccaee..4c2b171 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 17:09:52 + * @LastEditTime: 2024-04-23 19:30:13 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -14,16 +14,9 @@ #include "templateFSM.h" #include "templateFSM_private.h" -/* - 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 -*/ - -static void step(TemplateFSM* pFSM){ - printFSM(pFSM); - stepBaseFSM(BASE_FSM(pFSM)); - FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]); -} - +/* -------------------------------------------------------------------------- */ +/* 纯虚函数,允许调用privateVars */ +/* -------------------------------------------------------------------------- */ static void initData(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); @@ -39,31 +32,26 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现 }; *data = tempData; - pFSM->base.privateVars.data = data; + 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 initSignals(TemplateFSM *pFSM){ +static void initSignals(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals)); pFSM->base.signals = signals; pFSM->base.signalSize = sizeof(TemplateFSMSignals); } - -static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 - pFSM->base.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData)); - pFSM->base.preloader.size = sizeof(TemplateFSMExternalData); -} - - - static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ addSelectNextStateFcn(D); addSelectNextStateFcn(E); - /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(during, E); addStateActionFcn(during, D); @@ -81,22 +69,37 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } -/* - 唯一外界调用的函数 - */ + +/* -------------------------------------------------------------------------- */ +/* 其他重新实现的函数,父类已有实现,实现多态 */ +/* -------------------------------------------------------------------------- */ +static void step(TemplateFSM* pFSM){ + printFSM(pFSM); + stepBaseFSM(BASE_FSM(pFSM)); + FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]); +} + + + + + +/* -------------------------------------------------------------------------- */ +/* 子类构造函数 */ +/* -------------------------------------------------------------------------- */ TemplateFSM *createTemplateFSM(){ TemplateFSM *pFSM; pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE); - pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; - 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.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_void_fcns)setupHandler; - pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; - - constructFSM((FSM *)pFSM); + // 调用父类构造函数 + constructFSM((FSM *)pFSM); return pFSM; } diff --git a/vscode/FSM_OOP/template/templateFSM.h b/vscode/FSM_OOP/template/templateFSM.h index c9edb79..0764ad5 100644 --- a/vscode/FSM_OOP/template/templateFSM.h +++ b/vscode/FSM_OOP/template/templateFSM.h @@ -1,17 +1,20 @@ #ifndef __TEMPLATE_FSM_H_ #define __TEMPLATE_FSM_H_ +/* -------------------------------------------------------------------------- */ +/* 提前做类型声明 */ +/* -------------------------------------------------------------------------- */ -#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) -#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM)) +/* -------------------------------------------------------------------------- */ +/* 自定义数据和信号 */ +/* -------------------------------------------------------------------------- */ typedef struct _templateFSMSignals { int signalA; int signalB; }TemplateFSMSignals; - typedef struct _templateFSMExternalData { int arrindex; @@ -24,6 +27,11 @@ typedef struct _templateFSMInnerData int inner1; }TemplateFSMInnerData; +/* -------------------------------------------------------------------------- */ +/* 下面的改个名字就行了 */ +/* -------------------------------------------------------------------------- */ +#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) +#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM)) typedef struct _templateFSMData { @@ -31,8 +39,6 @@ typedef struct _templateFSMData TemplateFSMInnerData inner; }TemplateFSMData; - - typedef struct _TemplateFSM TemplateFSM; TemplateFSM *createTemplateFSM(); diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index 6fb94d4..815c312 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -6,21 +6,18 @@ #include -/* - 继承基类 - */ + +/* -------------------------------------------------------------------------- */ +/* 继承基类 */ +/* -------------------------------------------------------------------------- */ typedef struct _TemplateFSM { - // 继承父类 FSM base; }TemplateFSM; - /* -------------------------------------------------------------------------- */ -/* 状态 */ +/* 状态定义 */ /* -------------------------------------------------------------------------- */ - - typedef enum _State { Idle, @@ -110,11 +107,9 @@ static State transitionHandler(E, D)() } - - -/* - 用户自定义事件选择逻辑—————————————————begin -*/ +/* -------------------------------------------------------------------------- */ +/* 打印调试 */ +/* -------------------------------------------------------------------------- */ const static char *stateStr[] = { "Idle", "D", From 89da4251ca41e26d79fad3a85dfa94dd8eab4f12 Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 19:38:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?key=E5=9C=A828377=E4=B8=8A=E6=B5=8B?= =?UTF-8?q?=E8=AF=95ok=EF=BC=8C=E8=BF=90=E8=A1=8C=E9=80=9F=E5=BA=A6?= =?UTF-8?q?=E4=B8=8A=E6=B2=A1=E6=9C=89=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/CMakeLists.txt | 2 +- vscode/FSM_OOP/keytest/keyFSM.c | 41 +++++++++++++------------ vscode/FSM_OOP/keytest/keyFSM_private.h | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index c2ab643..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/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index b12e837..b8b0467 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 17:15:11 + * @LastEditTime: 2024-04-23 19:37:03 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -14,19 +14,9 @@ #include "keyFSM.h" #include "keyFSM_private.h" -/* - 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 -*/ - -static void step(KeyFSM* pFSM){ - printFSM(pFSM); - _stepFSM((FSM *)pFSM); - - KeyFSMData * data = pFSM->base.privateVars.data; - - FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay); -} - +/* -------------------------------------------------------------------------- */ +/* 纯虚函数,允许调用privateVars */ +/* -------------------------------------------------------------------------- */ static void initData(KeyFSM *pFSM){ // 必须重新实现 KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); data->countDelay = 0; @@ -34,14 +24,14 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现 data->in = Up; data->out = Idle; - pFSM->base.privateVars.data = data; + pFSM->base.data = data; pFSM->base.signals = &data->out; } static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 - pFSM->base.preloader.shadowData = malloc(sizeof(KeyIn)); - pFSM->base.preloader.size = sizeof(KeyIn); + pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn)); + pFSM->base.privateVars.preloader.size = sizeof(KeyIn); } static void initSignals(KeyFSM *pFSM){ // 必须重新实现 @@ -85,6 +75,20 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } + +/* -------------------------------------------------------------------------- */ +/* 其他重新实现的函数,父类已有实现,实现多态 */ +/* -------------------------------------------------------------------------- */ +static void step(KeyFSM* pFSM){ + printFSM(pFSM); + stepBaseFSM(BASE_FSM(pFSM)); + + KeyFSMData * data = pFSM->base.data; + + FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay); +} + + /* 唯一外界调用的函数 */ @@ -95,9 +99,8 @@ KeyFSM *createKeyFSM(){ pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE); #ifndef DSP28377 - pFSM->base.pureVtbl.step = (Avoid_WARNING_Overrider_Fcns)step; + pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step; #endif - 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; diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 516ee20..48122bb 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -263,7 +263,7 @@ const static char *stateStr[] = { }; static void printFSM(KeyFSM* pFSM){ - KeyFSMData* data = pFSM->base.privateVars.data; + 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)]); }