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"); }