diff --git a/test_on_28377/.cproject b/test_on_28377/.cproject
index 27deca7..e223d50 100644
--- a/test_on_28377/.cproject
+++ b/test_on_28377/.cproject
@@ -15,8 +15,8 @@
-
-
-
+
diff --git a/test_on_28377/.launches/02code_speed_test.launch b/test_on_28377/.launches/02code_speed_test.launch
deleted file mode 100644
index 59a7ca6..0000000
--- a/test_on_28377/.launches/02code_speed_test.launch
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test_on_28377/.launches/FSM_test.launch b/test_on_28377/.launches/FSM_test.launch
index 164d719..94a4d3b 100644
--- a/test_on_28377/.launches/FSM_test.launch
+++ b/test_on_28377/.launches/FSM_test.launch
@@ -1,28 +1,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
@@ -32,10 +12,5 @@
-
-
-
-
-
-
+
diff --git a/test_on_28377/main.c b/test_on_28377/main.c
index c7b5e9f..d38510c 100644
--- a/test_on_28377/main.c
+++ b/test_on_28377/main.c
@@ -30,33 +30,33 @@ int isDown = 0;
-ChildFSM *cFSM;
-ParentFSM *pFSM;
-void childTest(){
-
- cFSM = createChildFSM();
- pFSM = createParentFSM();
-
- setChildNum((pFSM), 1);
- registerChildFSM((pFSM), (cFSM), 0);
-
- for (int i = 0; i < 15; i++)
- {
- ParentFSM_Input(pFSM)->arrindex = i;
- SetPreloaderReady(pFSM);
-
- ChildFSM_Input(cFSM)->arrindex = i;
- SetPreloaderReady(cFSM);
-
- ChildFSMData* data = getData((FSM *)(cFSM));
- printf(" %d ", data->arrindex);
-
- tic();
- _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
- toc(index++);
- printf("\n");
- }
-}
+//ChildFSM *cFSM;
+//ParentFSM *pFSM;
+//void childTest(){
+//
+// cFSM = createChildFSM();
+// pFSM = createParentFSM();
+//
+// setChildNum((pFSM), 1);
+// registerChildFSM((pFSM), (cFSM), 0);
+//
+// for (int i = 0; i < 15; i++)
+// {
+// ParentFSM_Input(pFSM)->arrindex = i;
+// SetPreloaderReady(pFSM);
+//
+// ChildFSM_Input(cFSM)->arrindex = i;
+// SetPreloaderReady(cFSM);
+//
+// ChildFSMData* data = getData((FSM *)(cFSM));
+// printf(" %d ", data->arrindex);
+//
+// tic();
+// _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
+// toc(index++);
+// printf("\n");
+// }
+//}
@@ -67,24 +67,25 @@ KeyFSMData* data;
void keyFSMTest(){
keyFSM = createKeyFSM();
- data = getData((FSM *)keyFSM);
+ data = _getData((FSM *)keyFSM);
printf("hello 28377\n");
while(1){
*KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO);
- SetPreloaderReady(keyFSM);
+ PreloaderGetReady(keyFSM);
+
tic();
Step(keyFSM);
+ toc(index++);
if(data->out != Idle){
- toc(++index);
printf("%s\n", keyStr[data->out]);
}
else{
- toc(0);
+ index--;
}
DELAY_US(20*1000);
@@ -125,8 +126,8 @@ void main(void)
GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP);
- childTest();
-// keyFSMTest();
+// childTest();
+ keyFSMTest();
// funptrTest();
}
diff --git a/test_on_28377/targetConfigs/TMS320F28377D.ccxml b/test_on_28377/targetConfigs/TMS320F28377D.ccxml
index 5d896ab..85ba6c4 100644
--- a/test_on_28377/targetConfigs/TMS320F28377D.ccxml
+++ b/test_on_28377/targetConfigs/TMS320F28377D.ccxml
@@ -1,62 +1,22 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json
index 6a6f9c2..31d996f 100644
--- a/vscode/.vscode/settings.json
+++ b/vscode/.vscode/settings.json
@@ -1,11 +1,46 @@
{
+ "terminal.integrated.profiles.windows": {
+ "PowerShell": {
+ "source": "PowerShell",
+ "icon": "terminal-powershell",
+ "args": ["-NoExit","chcp 65001"]
+ },
+ "Command Prompt": {
+ "path": [
+ "${env:windir}\\Sysnative\\cmd.exe",
+ "${env:windir}\\System32\\cmd.exe"
+ ],
+ "args": ["/K","chcp 65001"],
+ "icon": "terminal-cmd"
+ },
+ "Git Bash": {
+ "source": "Git Bash"
+ }
+ },
+
"files.associations": {
"filter.h": "c",
"fsm_protected.h": "c",
"keyfsm.h": "c",
"fsm_public.h": "c",
"stdio.h": "c",
- "assert.h": "c"
+ "assert.h": "c",
+ "climits": "c",
+ "cmath": "c",
+ "cstdarg": "c",
+ "cstdint": "c",
+ "cstdio": "c",
+ "cstdlib": "c",
+ "type_traits": "c",
+ "limits": "c",
+ "*.tcc": "c",
+ "typeinfo": "c",
+ "templatefsm.h": "c"
},
- "files.encoding": "utf8"
-}
\ No newline at end of file
+
+
+ "files.encoding": "utf8",
+
+
+}
+
diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt
index bdbcfa0..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/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c
index 946b286..4ea05ec 100644
--- a/vscode/FSM_OOP/baseFSM/FSM.c
+++ b/vscode/FSM_OOP/baseFSM/FSM.c
@@ -7,148 +7,108 @@
#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->data, pFSM->privateVars.childFSM);
-
- pFSM->privateVars.curState = 0;
-}
-
-static inline void setEvent(FSM* pFSM){
- assert(pFSM->vtbl.selectEvent);
- pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data, pFSM->signals);
-
- if(0 == pFSM->privateVars.numChild){
- return;
+/* -------------------------------------------------------------------------- */
+/* private函数 */
+/* -------------------------------------------------------------------------- */
+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.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
}
+ if(0 == pFSM->privateVars.numChild)
+ return;
+
+
for (int i = 0; i < pFSM->privateVars.numChild; i++)
{
FSM *cFSM = pFSM->privateVars.childFSM[i];
- setEvent(cFSM);
+ setNextState(cFSM);
}
}
static inline void preload(FSM* pFSM){
if(pFSM->privateVars.preloader.isReady){
- memcpy(pFSM->data, pFSM->privateVars.preloader.in, pFSM->privateVars.preloader.preloadSize);
+ memcpy(pFSM->data, pFSM->privateVars.preloader.shadowData, pFSM->privateVars.preloader.size);
pFSM->privateVars.preloader.isReady = 0;
}
}
+static inline void resetSignals(FSM *pFSM){
+ memset(pFSM->signals, 0, pFSM->signalSize);
+}
+/* -------------------------------------------------------------------------- */
+/* protected */
+/* -------------------------------------------------------------------------- */
void stepBaseFSM(FSM *pFSM)
{
preload(pFSM);
- setEvent(pFSM);
- pFSM->vtbl.resetSignals(pFSM);
-
+ setNextState(pFSM);
+ resetSignals(pFSM);
+
FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState;
void *data = pFSM->data;
FSM **childFSM = pFSM->privateVars.childFSM;
- int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent;
- int nextState;
+ int index = pFSM->privateVars.index;
+ int nextState = pFSM->privateVars.nextState;
- if(fcns->delayedEvent){
- fcns->transitionDelayTable[fcns->delayedEvent](data);
- fcns->delayedEvent = 0;
- }
- if (fcns->transitionTable[index] != NULL)
- {
- if (fcns->exitActionTable[curState] != NULL)
- fcns->exitActionTable[curState](data, childFSM);
-
- nextState = (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
-
- if (fcns->enterActionTable[nextState] != NULL)
- fcns->enterActionTable[nextState](data, childFSM);
+ if(nextState && curState != nextState){ // 状态切换
+ if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数
+ {
+ if (fcns->exitActionTable[curState] != NULL)
+ fcns->exitActionTable[curState](data, childFSM);
+ (*fcns->transitionTable[index])(data);
+
+ if (fcns->enterActionTable[nextState] != NULL)
+ fcns->enterActionTable[nextState](data, childFSM);
+ }
+ if(fcns->transitionGeneralAction != NULL)
+ fcns->transitionGeneralAction(data); // 通用状态转移函数
pFSM->privateVars.curState = nextState;
}
- else if(curState == 0){
+ else if(curState == 0){ // 处理刚运行进入的默认状态
nextState = pFSM->privateVars.defaultState;
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
pFSM->privateVars.curState = nextState;
}
- else
+ else // 状态机没动
{
if (fcns->duringActionTable[curState] != NULL)
fcns->duringActionTable[curState](data, childFSM);
}
}
-FSM* newBaseFSM(int numState, int numEvent, int defaultState){
- typedef void (*StateFuncPtr)(void *data);
- typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
- typedef int (*TransitionFuncPtr)(void *data, int currentState);
- FSM *pFSM = calloc(1, sizeof(FSM));
- pFSM->privateVars.curEvent = 0;
+/* -------------------------------------------------------------------------- */
+/* 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.numEvent = numEvent;
- pFSM->privateVars.defaultState = defaultState;
- 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.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr));
- pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numEvent, sizeof(ChildFSMStepFuncPtr));
- pFSM->privateVars.fcns.transitionDelayTable = calloc(numEvent, sizeof(StateFuncPtr));
-
- FSMVtbl vtbl = {
- .reset = resetBaseFSM,
- .step = stepBaseFSM,
- .selectEvent = NULL,
- .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);
-}
-
-
-/*
- public 函数
- */
int getFSMCurState(FSM *pFSM){
return pFSM->privateVars.curState;
}
-int getFSMCurEvent(FSM *pFSM){
- return pFSM->privateVars.curEvent;
+int getFSMNextState(FSM *pFSM){
+ return pFSM->privateVars.nextState;
}
-
-
void setChildNum(FSM *pFSM, int num){
pFSM->privateVars.numChild = num;
pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *));
@@ -168,7 +128,7 @@ void *_getSignals(FSM* pFSM){
void *_preloadIn(FSM *pFSM){
- return pFSM->privateVars.preloader.in;
+ return pFSM->privateVars.preloader.shadowData;
}
void _preloaderGetReady(FSM *pFSM){
@@ -187,6 +147,70 @@ void _clearPreloaderOverFlag(FSM *pFSM){
}
-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 565eca3..a6680f6 100644
--- a/vscode/FSM_OOP/baseFSM/FSM_protected.h
+++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h
@@ -17,93 +17,118 @@
#define FSM_LOG(...) ((void)0)
#endif
-#define delay delay
#define during during
#define enter enter
#define exit exit
-#define transitionHandler(event) event##Handler
-#define delayHanlder(event) event##DelayHandler
-#define actionFcn(action, state) state##_##action##Action
-#define index(state, event) (state*Count_Event + event)
+#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_Delay_Handlers)(void *data);
-typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
+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_SelectEvent)(void *data, void *signals);
+typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
-
-#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
-#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event)
-#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event)
+/* -------------------------------------------------------------------------- */
+/* private数据类型,但是不能声明到private.h里 */
+/* -------------------------------------------------------------------------- */
-
-typedef struct _FSM FSM;
typedef struct _FSMHandler{
- int (**transitionTable)(void *data, int currentState, int *);
+ int (**selectNextState)(void *data, void *signals);
+
+ void (**transitionTable)(void *data);
+ void (*transitionGeneralAction)(void *data);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
- int delayedEvent;
- void (**transitionDelayTable)(void *data);
-
void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler;
typedef struct _FSMDataLoader
{
- void *in;
+ void *shadowData;
int isReady;
int isOverflow;
- size_t preloadSize;
+ size_t size;
}FSMDataLoader;
typedef struct _FSMPrivateVars
{
- int curState;
+ int numState;
int defaultState; // Idle状态不能停留,必须指定一个初始状态
-
- int curEvent;
- int numEvent;
-
- FSMDataLoader preloader;
+
+ int curState;
+ int nextState;
+ int index;
FSMHandler fcns;
int numChild;
FSM **childFSM;
+
+ 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
+ FSMPureVtbl pureVtbl;
+
void *data;
void *signals;
+ int signalSize;
+ // private
+ FMSPrivateVars privateVars;
} FSM;
-// protected, 子类能用, 外界用不了
-void constructFSM(FSM* pFSM);
-
-// 继承的函数
-FSM *newBaseFSM(int numState, int numEvent, 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 a394855..69ee93a 100644
--- a/vscode/FSM_OOP/baseFSM/FSM_public.h
+++ b/vscode/FSM_OOP/baseFSM/FSM_public.h
@@ -1,3 +1,11 @@
+/*
+ * @Author: godcreator02 qq974980621@gmail.com
+ * @Date: 2024-04-20 18:52:14
+ * @LastEditors: godcreator02 qq974980621@gmail.com
+ * @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
+ */
#ifndef __FSM_PUBLIC_H_
#define __FSM_PUBLIC_H_
@@ -6,30 +14,17 @@
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 {
- // 状态机控制
- int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现
- void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
- void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
- void (*initData)(FSM *pFSM); // 子类必须重新实现
- void (*initSignals)(FSM *pFSM); // 子类必须重新实现
- void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
- void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
- void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
-}FSMVtbl;
-
+void _stepFSM(FSM *pFSM);
/* --------------------------------- 状态机信息获取 -------------------------------- */
int getFSMCurState(FSM *pFSM);
-int getFSMCurEvent(FSM *pFSM);
+int getFSMNextState(FSM *pFSM);
void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index);
@@ -43,7 +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 b145f7a..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.selectEvent = 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 c3b1c63..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.selectEvent = 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 575b107..b8b0467 100644
--- a/vscode/FSM_OOP/keytest/keyFSM.c
+++ b/vscode/FSM_OOP/keytest/keyFSM.c
@@ -1,39 +1,22 @@
+/*
+ * @Author: godcreator02 qq974980621@gmail.com
+ * @Date: 2024-04-20 19:02:11
+ * @LastEditors: godcreator02 qq974980621@gmail.com
+ * @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
+ */
#include
#include
+#include
#include "FSM_protected.h"
#include "keyFSM.h"
#include "keyFSM_private.h"
-/*
- 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
-*/
-
-static Event selectEvent(KeyFSMData *data){ // 必须重新实现
-
- if(data->countDelay == 10){
- return HoldCount4;
- }
- else if(data->countDelay == 5){
- return DelayCount3;
- }
- else if(data->in == Up){
- return PhsicalUp;
- }
- else{
- return PhsicalDown;
- }
-}
-
-static void step(KeyFSM* pFSM){
- printFSM(pFSM);
- stepBaseFSM((FSM *)pFSM);
-
- KeyFSMData * data = pFSM->base.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;
@@ -42,14 +25,34 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
data->out = Idle;
pFSM->base.data = data;
+
+ pFSM->base.signals = &data->out;
}
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
- pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn));
- pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
+ 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){ // 必须重新实现
+ /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
+ addSelectNextStateFcn(Waiting);
+ addSelectNextStateFcn(DownDebouncing);
+ addSelectNextStateFcn(Downing);
+ addSelectNextStateFcn(Holding);
+ addSelectNextStateFcn(HoldUpDebouncing);
+ addSelectNextStateFcn(UpDebouncing);
+ addSelectNextStateFcn(MultiDownWaiting);
+ addSelectNextStateFcn(MultiDowning);
+ addSelectNextStateFcn(MultiDownDebouncing);
+
+
+ /* ----------------------- 添加状态中事件,action during exit ----------------------- */
addStateActionFcn(enter, Waiting);
addStateActionFcn(during, DownDebouncing);
addStateActionFcn(during, Downing);
@@ -61,25 +64,31 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, MultiDownDebouncing);
- addTransitionHandler(Waiting, PhsicalDown);
- addTransitionHandler(DownDebouncing, PhsicalUp);
- addTransitionHandler(DownDebouncing, DelayCount3);
- addTransitionHandler(Downing, PhsicalUp);
- addTransitionHandler(Downing, HoldCount4);
- addTransitionHandler(UpDebouncing, PhsicalDown);
- addTransitionHandler(UpDebouncing, DelayCount3);
- addTransitionHandler(Holding, PhsicalUp);
- addTransitionHandler(MultiDownWaiting, PhsicalDown);
- addTransitionHandler(MultiDownWaiting, DelayCount3);
- addTransitionHandler(MultiDowning, PhsicalUp);
- addTransitionHandler(HoldUpDebouncing, PhsicalDown);
- addTransitionHandler(HoldUpDebouncing, DelayCount3);
- addTransitionHandler(MultiDownDebouncing, DelayCount3);
- addTransitionHandler(MultiDownDebouncing, PhsicalUp);
+ /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
+ addTransitionHandler(DownDebouncing, Downing);
+ addTransitionHandler(UpDebouncing, MultiDownWaiting);
+ addTransitionHandler(MultiDownDebouncing, MultiDowning);
+ addTransitionHandler(Downing, Holding);
+ addTransitionHandler(MultiDownWaiting, Waiting);
- addDelayHandler(DelayCount3);
+
+ 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);
+}
+
+
/*
唯一外界调用的函数
*/
@@ -87,16 +96,15 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
KeyFSM *createKeyFSM(){
KeyFSM *pFSM;
- pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
+ pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
#ifndef DSP28377
- pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
+ pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
#endif
-
- pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
- 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.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/keytest/keyFSM.h b/vscode/FSM_OOP/keytest/keyFSM.h
index 620b002..717290e 100644
--- a/vscode/FSM_OOP/keytest/keyFSM.h
+++ b/vscode/FSM_OOP/keytest/keyFSM.h
@@ -10,7 +10,7 @@ typedef enum _keyIn{
}KeyIn;
-typedef enum _keyOutSignal{
+typedef enum _keyOutSignals{
Idle,
Down,
Hold,
diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h
index 2e290fe..48122bb 100644
--- a/vscode/FSM_OOP/keytest/keyFSM_private.h
+++ b/vscode/FSM_OOP/keytest/keyFSM_private.h
@@ -26,19 +26,119 @@ typedef enum _State
DownDebouncing,
Downing,
Holding,
+ HoldUpDebouncing,
UpDebouncing,
MultiDownWaiting,
MultiDowning,
- HoldUpDebouncing,
MultiDownDebouncing,
Count_State,
} State;
#define DEFAULT_STATE Waiting
+/* -------------------------------------------------------------------------- */
+/* 下一个状态选择函数 */
+/* -------------------------------------------------------------------------- */
+static State selectNextStateFcn(Waiting)(KeyFSMData *data){
+ if(data->in == Down){
+ FSM_LOG(" 物理按键按下 ");
+ return DownDebouncing;
+ }
+ return Idle_State;
+}
+static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
+ if(data->in == Up){
+ FSM_LOG(" 物理按键松开 ");
+ return Waiting;
+ }
+ else if(data->countDelay == 5){
+ return Downing;
+ }
+ return Idle_State;
+}
+
+static State selectNextStateFcn(Downing)(KeyFSMData *data){
+ if(data->in == Up){
+ FSM_LOG(" 物理按键松开 ");
+ return UpDebouncing;
+ }
+ else if(data->countDelay == 10){
+ return Holding;
+ }
+ return Idle_State;
+}
+
+static State selectNextStateFcn(Holding)(KeyFSMData *data){
+ if(data->in == Up){
+ FSM_LOG(" 物理按键松开 ");
+ return HoldUpDebouncing;
+ }
+ return Idle_State;
+}
+
+static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
+ if(data->in == Down){
+ FSM_LOG(" 物理按键按下 ");
+ return Holding;
+ }
+ else if(data->countDelay == 5){
+ return Waiting;
+ }
+ return Idle_State;
+}
+
+static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
+ if(data->in == Down){
+ FSM_LOG(" 物理按键按下 ");
+ if(data->countMultiDown){
+ return MultiDowning;
+ }
+ else{
+ return Downing;
+ }
+ }
+ else if(data->countDelay == 5){
+ return MultiDownWaiting;
+ }
+
+ return Idle_State;
+}
+
+static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
+ if(data->in == Down){
+ FSM_LOG(" 物理按键按下 ");
+ return MultiDownDebouncing;
+ }
+ else if(data->countDelay == 5){
+ return Waiting;
+ }
+ return Idle_State;
+}
+
+static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
+ if(data->in == Up){
+ FSM_LOG(" 物理按键松开 ");
+ return UpDebouncing;
+ }
+ return Idle_State;
+}
+
+static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
+ if(data->in == Up){
+ FSM_LOG(" 物理按键松开 ");
+ return MultiDownWaiting;
+ }
+ else if(data->countDelay == 5){
+ return MultiDowning;
+ }
+ return Idle_State;
+}
+
+/* -------------------------------------------------------------------------- */
+/* 对应的 action, exit, during 函数 */
+/* -------------------------------------------------------------------------- */
static void actionFcn(enter, Waiting)(KeyFSMData* data){
-
data->out = Idle;
data->countDelay = 0;
data->countMultiDown = 0;
@@ -101,143 +201,48 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
}
-
-
-/*
- 事件和对应的转移函数
- */
-
-typedef enum _Event{
- Idle_Event,
- PhsicalDown,
- PhsicalUp,
- DelayCount3,
- HoldCount4,
-
- Count_Event,
-}Event;
-
-static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted)
-{
- FSM_LOG(" 物理按键按下 ");
+/* -------------------------------------------------------------------------- */
+/* 转移函数 */
+/* -------------------------------------------------------------------------- */
+void transitionGeneralAction(KeyFSMData *data){
data->countDelay = 0;
-
- switch (curState)
- {
- case Waiting:
- return DownDebouncing;
-
- case UpDebouncing:
- if(data->countMultiDown)
- return MultiDowning;
- else
- return Downing;
-
- case HoldUpDebouncing:
- return Holding;
-
- case MultiDownWaiting:
- return MultiDownDebouncing;
-
-
- default:
- FSM_LOG("检查状态转移表设计,不应该到这里");
- assert(0);
-
- }
}
-static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, Event *delayedEvent)
-{
- FSM_LOG(" 物理按键松开 ");
- data->countDelay = 0;
-
- switch (curState)
- {
- case DownDebouncing:
- if(data->countMultiDown){
- return MultiDownWaiting;
- }
- return Waiting;
-
- case Downing:
- return UpDebouncing;
- case Holding:
- return HoldUpDebouncing;
-
- case MultiDowning:
- return UpDebouncing;
-
- default:
- FSM_LOG("检查状态转移表设计,不应该到这里");
- assert(0);
-
- }
+static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
+ data->out = Down;
}
-static void delayHanlder(DelayCount3)(KeyFSMData* data){
+
+static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
data->out = Idle;
+ data->countMultiDown++;
}
-static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){
- FSM_LOG(" 延迟计数到3 ");
- data->countDelay = 0;
-
- switch (curState)
+static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
+ switch (data->countMultiDown + 1)
{
- case DownDebouncing:
- data->out = Down;
- *delayedEvent = DelayCount3;
-
- FSM_LOG("按键按下");
- return Downing;
-
- case UpDebouncing:
- data->out = Idle;
- data->countMultiDown++;
-
- FSM_LOG("按键松开");
- return MultiDownWaiting;
-
- case MultiDownWaiting:
- return Waiting;
-
- case HoldUpDebouncing:
- return Waiting;
-
- case MultiDownDebouncing:
- switch (data->countMultiDown + 1)
- {
- case 2:
- data->out = Down_2times;
- break;
- case 3:
- data->out = Down_3times;
- break;
-
- default:
- printf("reach MultiDown Limit!\n");
- break;
- }
- FSM_LOG(" 多击%d ", data->countMultiDown+1);
- *delayedEvent = DelayCount3;
- return MultiDowning;
-
+ case 2:
+ data->out = Down_2times;
+ break;
+ case 3:
+ data->out = Down_3times;
+ break;
+
default:
- FSM_LOG("检查状态转移表设计,不应该到这里");
- assert(0);
+ printf("reach MultiDown Limit!\n");
+ break;
}
+ FSM_LOG(" 多击%d ", data->countMultiDown+1);
}
-static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){
- FSM_LOG(" 计数到2进入长按模式 ");
- data->countDelay = 0;
-
+static State transitionHandler(Downing, Holding)(KeyFSMData* data){
data->out = Hold;
- return Holding;
}
+static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
+ data->countMultiDown = 0;
+}
@@ -250,23 +255,17 @@ const static char *stateStr[] = {
"DownDebouncing",
"Downing",
"Holding",
+ "HoldUpDebouncing",
"UpDebouncing",
"MultiDownWaiting",
"MultiDowning",
- "HoldUpDebouncing",
"MultiDownDebouncing",
};
-const static char *eventStr[] = {
- "Idle",
- "PhsicalDown",
- "PhsicalUp",
- "DelayCount3",
- "HoldCount4",
-};
+
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)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
+ FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
}
diff --git a/vscode/FSM_OOP/template/main.c b/vscode/FSM_OOP/template/main.c
index f553d87..cbdf941 100644
--- a/vscode/FSM_OOP/template/main.c
+++ b/vscode/FSM_OOP/template/main.c
@@ -1,3 +1,11 @@
+/*
+ * @Author: godcreator02 qq974980621@gmail.com
+ * @Date: 2024-04-20 18:52:14
+ * @LastEditors: godcreator02 qq974980621@gmail.com
+ * @LastEditTime: 2024-04-20 20:26:40
+ * @FilePath: \vscode\FSM_OOP\template\main.c
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
#include
#include "templateFSM.h"
@@ -19,11 +27,11 @@ int main(){
int ovflag = GetPreloaderOverFlag(pFSM);
- if(i == 10){
+ if(i == 3){
TemplateFSM_Signals(pFSM)->signalA = 1;
}
- if(i == 11){
- TemplateFSM_Signals(pFSM)->signalB = 1;
+ if(i == 4){
+ TemplateFSM_Signals(pFSM)->signalA = 1;
}
printf("%d, " ,i);
diff --git a/vscode/FSM_OOP/template/templateFSM.c b/vscode/FSM_OOP/template/templateFSM.c
index 43376d4..4c2b171 100644
--- a/vscode/FSM_OOP/template/templateFSM.c
+++ b/vscode/FSM_OOP/template/templateFSM.c
@@ -1,3 +1,11 @@
+/*
+ * @Author: godcreator02 qq974980621@gmail.com
+ * @Date: 2024-04-20 20:08:03
+ * @LastEditors: godcreator02 qq974980621@gmail.com
+ * @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
+ */
#include
#include
#include
@@ -6,84 +14,45 @@
#include "templateFSM.h"
#include "templateFSM_private.h"
-/*
- 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
-*/
-static Event ceventArr[20] = {
- Idle_Event,
- Idle_Event,
- Idle2D,
- Idle_Event,
- Idle_Event,
- D2E,
- E2D,
- D2E,
- Idle_Event,
- Idle_Event,
- Idle_Event,
- Idle_Event,
- Idle_Event,
- Idle_Event,
- Idle_Event,
-};
-
-static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现
- if(signals->signalA){
- return E2D;
- }
- if(signals->signalB){
- return D2E;
- }
-
- return ceventArr[data->in.arrindex];
-}
-
-static void step(TemplateFSM* pFSM){
- printFSM(pFSM);
- stepBaseFSM(BASE_FSM(pFSM));
-}
-
+/* -------------------------------------------------------------------------- */
+/* 纯虚函数,允许调用privateVars */
+/* -------------------------------------------------------------------------- */
static void initData(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
+
TemplateFSMData tempData = {
- .in = {
+ .external = {
.arrindex = 0,
.x = 0,
},
- .inner1 = 0,
- .y1 = 0,
+ .inner = {
+ .inner1 = 0,
+ .y1 = 0,
+ },
};
*data = tempData;
pFSM->base.data = data;
}
-
-static void initSignals(TemplateFSM *pFSM){
- TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals));
- TemplateFSMSignals tempSignals = {
- .signalA = 0,
- .signalB = 0,
- };
- *signals = tempSignals;
- pFSM->base.signals = signals;
-}
-
-static void resetSignals(TemplateFSM *pFSM){
- memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals));
-}
-
-
-
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
- pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn));
- pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn);
+ pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData));
+ 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 setupHandler(FSMHandler* fcns){ // 必须重新实现
+ /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
+ addSelectNextStateFcn(D);
+ addSelectNextStateFcn(E);
+ /* ----------------------- 添加状态中事件,action during exit ----------------------- */
addStateActionFcn(during, E);
addStateActionFcn(during, D);
addStateActionFcn(enter, E);
@@ -91,32 +60,46 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(exit, E);
addStateActionFcn(exit, D);
- addTransitionHandler(Idle, Idle2D);
- addTransitionHandler(Idle, Idle2E);
- addTransitionHandler(D, D2E);
- addTransitionHandler(E, E2D);
+ /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
+ addTransitionHandler(Idle, D);
+ addTransitionHandler(Idle, E);
+ addTransitionHandler(D, E);
+ addTransitionHandler(E, D);
- addDelayHandler(Idle2D);
+ 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, Count_Event, DEFAULT_STATE);
+ 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.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
+ // 重新实现的函数
+ 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.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
- 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 a902b9f..0764ad5 100644
--- a/vscode/FSM_OOP/template/templateFSM.h
+++ b/vscode/FSM_OOP/template/templateFSM.h
@@ -1,31 +1,44 @@
#ifndef __TEMPLATE_FSM_H_
#define __TEMPLATE_FSM_H_
+/* -------------------------------------------------------------------------- */
+/* 提前做类型声明 */
+/* -------------------------------------------------------------------------- */
-#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM))
-#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
-
-typedef struct _templateFSMIn
-{
- int arrindex;
- int x;
-}TemplateFSMIn;
+/* -------------------------------------------------------------------------- */
+/* 自定义数据和信号 */
+/* -------------------------------------------------------------------------- */
typedef struct _templateFSMSignals
{
int signalA;
int signalB;
}TemplateFSMSignals;
-typedef struct _templateFSMData
+typedef struct _templateFSMExternalData
+{
+ int arrindex;
+ int x;
+}TemplateFSMExternalData;
+
+typedef struct _templateFSMInnerData
{
- TemplateFSMIn in;
int y1;
int inner1;
+}TemplateFSMInnerData;
+
+/* -------------------------------------------------------------------------- */
+/* 下面的改个名字就行了 */
+/* -------------------------------------------------------------------------- */
+#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM))
+#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
+
+typedef struct _templateFSMData
+{
+ TemplateFSMExternalData external;
+ 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 af07c1c..815c312 100644
--- a/vscode/FSM_OOP/template/templateFSM_private.h
+++ b/vscode/FSM_OOP/template/templateFSM_private.h
@@ -6,19 +6,18 @@
#include
-/*
- 继承基类
- */
+
+/* -------------------------------------------------------------------------- */
+/* 继承基类 */
+/* -------------------------------------------------------------------------- */
typedef struct _TemplateFSM
{
- // 继承父类
FSM base;
}TemplateFSM;
-/*
- 状态和对应的 action, exit, during 函数
- */
-
+/* -------------------------------------------------------------------------- */
+/* 状态定义 */
+/* -------------------------------------------------------------------------- */
typedef enum _State
{
Idle,
@@ -29,6 +28,28 @@ typedef enum _State
} State;
#define DEFAULT_STATE E
+/* -------------------------------------------------------------------------- */
+/* 下一个状态选择函数 */
+/* -------------------------------------------------------------------------- */
+static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
+ if(signals->signalA){
+ return E;
+ }
+ return Idle;
+}
+
+static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){
+ if(signals->signalA){
+ return D;
+ }
+ return Idle;
+}
+
+
+
+/* -------------------------------------------------------------------------- */
+/* 对应的 action, exit, during 函数 */
+/* -------------------------------------------------------------------------- */
static void actionFcn(enter, D)()
{
FSM_LOG(" enterD ");
@@ -55,70 +76,49 @@ static void actionFcn(exit, E)()
FSM_LOG(" exitE ");
}
-/*
- 事件和对应的转移函数
- */
-
-typedef enum _Event{
- Idle_Event,
- Idle2D,
- Idle2E,
- D2E,
- E2D,
-
- Count_Event,
-}Event;
-static State transitionHandler(Idle2D)()
+/* -------------------------------------------------------------------------- */
+/* 转移函数 */
+/* -------------------------------------------------------------------------- */
+void transitionGeneralAction(TemplateFSMData *data){
+ FSM_LOG("general");
+}
+
+static void transitionHandler(Idle, D)()
{
FSM_LOG(" Idle2D ");
- return D;
}
-static void delayHanlder(Idle2D)(TemplateFSMData *data){
- FSM_LOG(" DelayIdle2D");
-}
-
-static State transitionHandler(Idle2E)()
+static State transitionHandler(Idle, E)()
{
FSM_LOG(" Idle2E ");
- return E;
}
-static State transitionHandler(D2E)()
+static State transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex)
{
+ *delayedIndex = index(D, E);
FSM_LOG(" D2E ");
- return E;
}
-static State transitionHandler(E2D)()
+static State transitionHandler(E, D)()
{
FSM_LOG(" E2D ");
- return D;
}
-
-
-/*
- 用户自定义事件选择逻辑—————————————————begin
-*/
+/* -------------------------------------------------------------------------- */
+/* 打印调试 */
+/* -------------------------------------------------------------------------- */
const static char *stateStr[] = {
"Idle",
"D",
"E",
- };
-const static char *eventStr[] = {
- "Idle",
- "Idle2D",
- "Idle2E",
- "D2E",
- "E2D",
};
+
static void printFSM(TemplateFSM* pFSM){
FSM_LOG(" \tTemplateFSM: ");
- FSM_LOG("上次事件:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM));
+ FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]);
}