暂存以下,回去看一眼原来的状态图结构

This commit is contained in:
godcreator02 2024-04-20 20:05:10 +08:00
parent 44a434f39b
commit 23a07ea75e
8 changed files with 103 additions and 69 deletions

View File

@ -1,4 +1,23 @@
{
"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",
@ -7,5 +26,10 @@
"stdio.h": "c",
"assert.h": "c"
},
"files.encoding": "utf8"
}
"files.encoding": "utf8",
}

View File

@ -13,16 +13,15 @@
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);
static inline void setNextState(FSM* pFSM){
int curState = pFSM->privateVars.curState;
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
if(0 == pFSM->privateVars.numChild){
return;
@ -31,7 +30,7 @@ static inline void setEvent(FSM* pFSM){
for (int i = 0; i < pFSM->privateVars.numChild; i++)
{
FSM *cFSM = pFSM->privateVars.childFSM[i];
setEvent(cFSM);
setNextState(cFSM);
}
}
@ -46,15 +45,15 @@ static inline void preload(FSM* pFSM){
void stepBaseFSM(FSM *pFSM)
{
preload(pFSM);
setEvent(pFSM);
setNextState(pFSM);
pFSM->vtbl.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.curState * pFSM->privateVars.numState + pFSM->privateVars.numState;
int nextState = pFSM->privateVars.nextState;
if(fcns->delayedEvent){
fcns->transitionDelayTable[fcns->delayedEvent](data);
@ -66,36 +65,37 @@ void stepBaseFSM(FSM *pFSM)
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM);
nextState = (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
(*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
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){
FSM* newBaseFSM(int numState, int defaultState){
typedef void (*StateFuncPtr)(void *data);
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
typedef int (*TransitionFuncPtr)(void *data, int currentState);
typedef int (*SelectNextStateFcnPtr)(void *data, void *signals);
FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars.curEvent = 0;
pFSM->privateVars.curState = 0;
pFSM->privateVars.numEvent = numEvent;
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;
@ -104,14 +104,15 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
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));
pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
FSMVtbl vtbl = {
.reset = resetBaseFSM,
.step = stepBaseFSM,
.selectEvent = NULL,
.setupHandler = NULL,
.initData = NULL,
.initDataLoader = NULL,
@ -142,13 +143,11 @@ void constructFSM(FSM* pFSM){
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 *));

View File

@ -22,29 +22,35 @@
#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 delayHanlder(curstate, nextstate) curstate##2##nextstate##DelayHandler
#define actionFcn(action, curstate) curstate##_##action##Action
#define index(curstate, nextstate) (curstate*Count_State + nextstate)
typedef struct _FSMHandler FSMHandler;
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_Transition_Handler)(void *data, int curState, int *);
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)
#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)
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**transitionTable)(void *data, int currentState, int *);
int (**selectNextState)(void *data, void *signals);
void (**transitionTable)(void *data, int currentState, int *);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
@ -67,11 +73,11 @@ typedef struct _FSMDataLoader
typedef struct _FSMPrivateVars
{
int curState;
int numState;
int defaultState; // Idle状态不能停留必须指定一个初始状态
int curEvent;
int numEvent;
int curState;
int nextState;
FSMDataLoader preloader;
@ -102,7 +108,7 @@ typedef struct _FSM
void constructFSM(FSM* pFSM);
// 继承的函数
FSM *newBaseFSM(int numState, int numEvent, int defaultState);
FSM* newBaseFSM(int numState, int defaultState);
void stepBaseFSM(FSM *pFSM);
void resetBaseFSM(FSM *pFSM);

View File

@ -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 19:12: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_
@ -17,9 +25,9 @@ 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); // 子类必须重新实现
@ -29,7 +37,7 @@ typedef struct _FSMVtbl {
/* --------------------------------- 状态机信息获取 -------------------------------- */
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,6 +51,7 @@ void _preloaderGetReady(FSM *pFSM);
int _getPreloaderOverFlag(FSM *pFSM);
void _clearPreloaderOverFlag(FSM *pFSM);
/* ---------------------------------- 虚函数表 ---------------------------------- */
FSMVtbl *_vptrFSM(FSM* pFSM);

View File

@ -198,7 +198,7 @@ ParentFSM *createParentFSM(){
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = step;
pFSM->base.vtbl.selectEvent = selectEvent;
pFSM->base.vtbl.selectNextState = selectEvent;
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader;

View File

@ -71,7 +71,7 @@ ChildFSM *createChildFSM(){
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = step;
pFSM->base.vtbl.selectEvent = selectEvent;
pFSM->base.vtbl.selectNextState = selectEvent;
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader;

View File

@ -1,3 +1,11 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 19:02:11
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-20 19:44:58
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h>
#include <stdlib.h>
@ -9,22 +17,6 @@
*/
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);
@ -93,7 +85,7 @@ KeyFSM *createKeyFSM(){
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
#endif
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.selectNextState = (Avoid_WARNING_SelectNextState)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;

View File

@ -83,7 +83,11 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(during, E);
addStateActionFcn(during, D);
addStateActionFcn(enter, E);
@ -91,12 +95,13 @@ 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);
addDelayHandler(Idle, D);
}
/*
@ -105,7 +110,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
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;
@ -113,7 +118,6 @@ TemplateFSM *createTemplateFSM(){
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
constructFSM((FSM *)pFSM);