Merge tag '2.0' into develop
This commit is contained in:
commit
ac7266e5ed
|
@ -34,7 +34,8 @@
|
||||||
"type_traits": "c",
|
"type_traits": "c",
|
||||||
"limits": "c",
|
"limits": "c",
|
||||||
"*.tcc": "c",
|
"*.tcc": "c",
|
||||||
"typeinfo": "c"
|
"typeinfo": "c",
|
||||||
|
"templatefsm.h": "c"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,22 +7,14 @@
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
#include "FSM_public.h"
|
#include "FSM_public.h"
|
||||||
|
|
||||||
/*
|
/* -------------------------------------------------------------------------- */
|
||||||
protected 函数
|
/* private函数 */
|
||||||
*/
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void setNextState(FSM* pFSM){
|
static inline void setNextState(FSM* pFSM){
|
||||||
int curState = pFSM->privateVars.curState;
|
int curState = pFSM->privateVars.curState;
|
||||||
if(curState != 0){
|
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)
|
if(0 == pFSM->privateVars.numChild)
|
||||||
|
@ -37,9 +29,9 @@ static inline void setNextState(FSM* pFSM){
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void preload(FSM* pFSM){
|
static inline void preload(FSM* pFSM){
|
||||||
if(pFSM->preloader.isReady){
|
if(pFSM->privateVars.preloader.isReady){
|
||||||
memcpy(pFSM->privateVars.data, pFSM->preloader.shadowData, pFSM->preloader.size);
|
memcpy(pFSM->data, pFSM->privateVars.preloader.shadowData, pFSM->privateVars.preloader.size);
|
||||||
pFSM->preloader.isReady = 0;
|
pFSM->privateVars.preloader.isReady = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,18 +39,20 @@ static inline void resetSignals(FSM *pFSM){
|
||||||
memset(pFSM->signals, 0, pFSM->signalSize);
|
memset(pFSM->signals, 0, pFSM->signalSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* protected */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
void stepBaseFSM(FSM *pFSM)
|
void stepBaseFSM(FSM *pFSM)
|
||||||
{
|
{
|
||||||
preload(pFSM);
|
preload(pFSM);
|
||||||
setNextState(pFSM);
|
setNextState(pFSM);
|
||||||
// pFSM->vtbl.resetSignals(pFSM);
|
|
||||||
resetSignals(pFSM);
|
resetSignals(pFSM);
|
||||||
|
|
||||||
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
||||||
int curState = pFSM->privateVars.curState;
|
int curState = pFSM->privateVars.curState;
|
||||||
void *data = pFSM->privateVars.data;
|
void *data = pFSM->data;
|
||||||
FSM **childFSM = pFSM->privateVars.childFSM;
|
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;
|
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;
|
/* public 函数 */
|
||||||
pFSM->privateVars.defaultState = defaultState;
|
/* -------------------------------------------------------------------------- */
|
||||||
|
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.curState = 0;
|
||||||
pFSM->privateVars.nextState = 0;
|
}
|
||||||
pFSM->privateVars.numChild = 0;
|
|
||||||
|
|
||||||
pFSM->preloader.isReady = 0;
|
void _stepFSM(FSM *pFSM){
|
||||||
|
pFSM->step(pFSM);
|
||||||
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 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){
|
int getFSMCurState(FSM *pFSM){
|
||||||
return pFSM->privateVars.curState;
|
return pFSM->privateVars.curState;
|
||||||
}
|
}
|
||||||
|
@ -173,7 +119,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index){
|
||||||
}
|
}
|
||||||
|
|
||||||
const void *_getData(FSM* pFSM){
|
const void *_getData(FSM* pFSM){
|
||||||
return (const void *)pFSM->privateVars.data;
|
return (const void *)pFSM->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *_getSignals(FSM* pFSM){
|
void *_getSignals(FSM* pFSM){
|
||||||
|
@ -182,25 +128,89 @@ void *_getSignals(FSM* pFSM){
|
||||||
|
|
||||||
|
|
||||||
void *_preloadIn(FSM *pFSM){
|
void *_preloadIn(FSM *pFSM){
|
||||||
return pFSM->preloader.shadowData;
|
return pFSM->privateVars.preloader.shadowData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _preloaderGetReady(FSM *pFSM){
|
void _preloaderGetReady(FSM *pFSM){
|
||||||
if(pFSM->preloader.isReady){
|
if(pFSM->privateVars.preloader.isReady){
|
||||||
pFSM->preloader.isOverflow = 1;
|
pFSM->privateVars.preloader.isOverflow = 1;
|
||||||
}
|
}
|
||||||
pFSM->preloader.isReady = 1;
|
pFSM->privateVars.preloader.isReady = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _getPreloaderOverFlag(FSM *pFSM){
|
int _getPreloaderOverFlag(FSM *pFSM){
|
||||||
return pFSM->preloader.isOverflow;
|
return pFSM->privateVars.preloader.isOverflow;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _clearPreloaderOverFlag(FSM *pFSM){
|
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); // 强制退出
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,19 +17,24 @@
|
||||||
#define FSM_LOG(...) ((void)0)
|
#define FSM_LOG(...) ((void)0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define delay delay
|
|
||||||
#define during during
|
#define during during
|
||||||
#define enter enter
|
#define enter enter
|
||||||
#define exit exit
|
#define exit exit
|
||||||
|
|
||||||
|
|
||||||
#define selectNextStateFcn(curstate) curstate##_##selectNextState
|
#define selectNextStateFcn(curstate) curstate##_##selectNextState
|
||||||
#define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler
|
#define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler
|
||||||
#define actionFcn(action, curstate) curstate##_##action##Action
|
#define actionFcn(action, curstate) curstate##_##action##Action
|
||||||
#define index(curstate, nextstate) (curstate*Count_State + nextstate)
|
#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 _FSMHandler FSMHandler;
|
||||||
|
typedef struct _FSM FSM;
|
||||||
|
|
||||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
||||||
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
|
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
|
||||||
typedef void (*Avoid_WARNING_Transition_Handler)(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);
|
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)
|
/* private数据类型,但是不能声明到private.h里 */
|
||||||
#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate)
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FSM FSM;
|
|
||||||
typedef struct _FSMHandler{
|
typedef struct _FSMHandler{
|
||||||
int (**selectNextState)(void *data, void *signals);
|
int (**selectNextState)(void *data, void *signals);
|
||||||
|
|
||||||
|
@ -75,40 +76,59 @@ typedef struct _FSMPrivateVars
|
||||||
|
|
||||||
int curState;
|
int curState;
|
||||||
int nextState;
|
int nextState;
|
||||||
|
int index;
|
||||||
|
|
||||||
FSMHandler fcns;
|
FSMHandler fcns;
|
||||||
|
|
||||||
int numChild;
|
int numChild;
|
||||||
FSM **childFSM;
|
FSM **childFSM;
|
||||||
|
|
||||||
void *data;
|
FSMDataLoader preloader;
|
||||||
|
|
||||||
}FMSPrivateVars;
|
}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
|
typedef struct _FSM
|
||||||
{
|
{
|
||||||
// public functions
|
// public functions
|
||||||
FSMVtbl vtbl;
|
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
|
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
// private
|
|
||||||
FMSPrivateVars privateVars;
|
|
||||||
|
|
||||||
// protected
|
// protected
|
||||||
FSMDataLoader preloader;
|
FSMPureVtbl pureVtbl;
|
||||||
|
|
||||||
|
void *data;
|
||||||
void *signals;
|
void *signals;
|
||||||
int signalSize;
|
int signalSize;
|
||||||
|
// private
|
||||||
|
FMSPrivateVars privateVars;
|
||||||
} FSM;
|
} FSM;
|
||||||
|
|
||||||
|
|
||||||
// protected, 子类能用, 外界用不了
|
/* -------------------------------------------------------------------------- */
|
||||||
void constructFSM(FSM* pFSM);
|
/* protected函数,子类能用外界用不了 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
// 继承的函数
|
|
||||||
FSM* newBaseFSM(int numState, int defaultState);
|
|
||||||
void stepBaseFSM(FSM *pFSM);
|
void stepBaseFSM(FSM *pFSM);
|
||||||
|
|
||||||
|
void constructFSM(FSM* pFSM);
|
||||||
|
FSM* newBaseFSM(int numState, int defaultState);
|
||||||
void resetBaseFSM(FSM *pFSM);
|
void resetBaseFSM(FSM *pFSM);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: godcreator02 qq974980621@gmail.com
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
* @Date: 2024-04-20 18:52:14
|
* @Date: 2024-04-20 18:52:14
|
||||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
* @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
|
* @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h
|
||||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
*/
|
*/
|
||||||
|
@ -14,26 +14,14 @@
|
||||||
|
|
||||||
typedef struct _FSM FSM;
|
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 PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
|
||||||
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
|
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
|
||||||
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
|
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
|
||||||
#define GetData(pFSM) _getData((FSM*)pFSM)
|
#define GetData(pFSM) _getData((FSM*)pFSM)
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FSMHandler FSMHandler;
|
void _stepFSM(FSM *pFSM);
|
||||||
// 这几个函数可认为是虚函数, 构造函数里不会初始化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;
|
|
||||||
|
|
||||||
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
||||||
int getFSMCurState(FSM *pFSM);
|
int getFSMCurState(FSM *pFSM);
|
||||||
int getFSMNextState(FSM *pFSM);
|
int getFSMNextState(FSM *pFSM);
|
||||||
|
@ -50,8 +38,6 @@ void _preloaderGetReady(FSM *pFSM);
|
||||||
int _getPreloaderOverFlag(FSM *pFSM);
|
int _getPreloaderOverFlag(FSM *pFSM);
|
||||||
void _clearPreloaderOverFlag(FSM *pFSM);
|
void _clearPreloaderOverFlag(FSM *pFSM);
|
||||||
|
|
||||||
/* ---------------------------------- 虚函数表 ---------------------------------- */
|
|
||||||
FSMVtbl *_vptrFSM(FSM* pFSM);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -88,17 +88,17 @@ void B_enterAction(void *data, FSM **childFSM){
|
||||||
FSM_LOG(" enterB ");
|
FSM_LOG(" enterB ");
|
||||||
|
|
||||||
FSM *cFSM = childFSM[0];
|
FSM *cFSM = childFSM[0];
|
||||||
cFSM->vtbl.step(cFSM);
|
cFSM->pureVtbl.step(cFSM);
|
||||||
}
|
}
|
||||||
void B_duringAction(void *data, FSM **childFSM){
|
void B_duringAction(void *data, FSM **childFSM){
|
||||||
FSM_LOG(" duringB ");
|
FSM_LOG(" duringB ");
|
||||||
|
|
||||||
FSM *cFSM = childFSM[0];
|
FSM *cFSM = childFSM[0];
|
||||||
cFSM->vtbl.step(cFSM);
|
cFSM->pureVtbl.step(cFSM);
|
||||||
}
|
}
|
||||||
void B_exitAction(void *data, FSM **childFSM){
|
void B_exitAction(void *data, FSM **childFSM){
|
||||||
FSM *cFSM = childFSM[0];
|
FSM *cFSM = childFSM[0];
|
||||||
cFSM->vtbl.reset(cFSM);
|
cFSM->pureVtbl.reset(cFSM);
|
||||||
|
|
||||||
FSM_LOG(" exitB ");
|
FSM_LOG(" exitB ");
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ static void printFSM(ParentFSM* pFSM){
|
||||||
|
|
||||||
static void step(ParentFSM* pFSM){
|
static void step(ParentFSM* pFSM){
|
||||||
printFSM(pFSM);
|
printFSM(pFSM);
|
||||||
stepBaseFSM(BASE_FSM(pFSM));
|
_stepFSM(BASE_FSM(pFSM));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset(ParentFSM* pFSM){
|
static void reset(ParentFSM* pFSM){
|
||||||
|
@ -197,11 +197,11 @@ ParentFSM *createParentFSM(){
|
||||||
ParentFSM *pFSM;
|
ParentFSM *pFSM;
|
||||||
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = step;
|
pFSM->base.pureVtbl.step = step;
|
||||||
pFSM->base.vtbl.selectNextState = selectEvent;
|
pFSM->base.pureVtbl.selectNextState = selectEvent;
|
||||||
pFSM->base.vtbl.initData = initData;
|
pFSM->base.pureVtbl.initData = initData;
|
||||||
pFSM->base.vtbl.setupHandler = setupHandler;
|
pFSM->base.pureVtbl.setupHandler = setupHandler;
|
||||||
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
pFSM->base.pureVtbl.initDataLoader = initDataLoader;
|
||||||
|
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
return pFSM;
|
return pFSM;
|
||||||
|
|
|
@ -29,7 +29,7 @@ static Event selectEvent(ChildFSMData *data){ // 必须重新实现
|
||||||
|
|
||||||
static void step(ChildFSM* pFSM){
|
static void step(ChildFSM* pFSM){
|
||||||
printFSM(pFSM);
|
printFSM(pFSM);
|
||||||
stepBaseFSM(BASE_FSM(pFSM));
|
_stepFSM(BASE_FSM(pFSM));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initData(ChildFSM *pFSM){ // 必须重新实现
|
static void initData(ChildFSM *pFSM){ // 必须重新实现
|
||||||
|
@ -70,11 +70,11 @@ ChildFSM *createChildFSM(){
|
||||||
ChildFSM *pFSM;
|
ChildFSM *pFSM;
|
||||||
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = step;
|
pFSM->base.pureVtbl.step = step;
|
||||||
pFSM->base.vtbl.selectNextState = selectEvent;
|
pFSM->base.pureVtbl.selectNextState = selectEvent;
|
||||||
pFSM->base.vtbl.initData = initData;
|
pFSM->base.pureVtbl.initData = initData;
|
||||||
pFSM->base.vtbl.setupHandler = setupHandler;
|
pFSM->base.pureVtbl.setupHandler = setupHandler;
|
||||||
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
pFSM->base.pureVtbl.initDataLoader = initDataLoader;
|
||||||
|
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: godcreator02 qq974980621@gmail.com
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
* @Date: 2024-04-20 19:02:11
|
* @Date: 2024-04-20 19:02:11
|
||||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
* @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
|
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
|
||||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
*/
|
*/
|
||||||
|
@ -14,19 +14,9 @@
|
||||||
#include "keyFSM.h"
|
#include "keyFSM.h"
|
||||||
#include "keyFSM_private.h"
|
#include "keyFSM_private.h"
|
||||||
|
|
||||||
/*
|
/* -------------------------------------------------------------------------- */
|
||||||
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
/* 纯虚函数,允许调用privateVars */
|
||||||
*/
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void step(KeyFSM* pFSM){
|
|
||||||
printFSM(pFSM);
|
|
||||||
stepBaseFSM((FSM *)pFSM);
|
|
||||||
|
|
||||||
KeyFSMData * data = pFSM->base.privateVars.data;
|
|
||||||
|
|
||||||
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
||||||
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
|
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
|
||||||
data->countDelay = 0;
|
data->countDelay = 0;
|
||||||
|
@ -34,14 +24,14 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
|
||||||
data->in = Up;
|
data->in = Up;
|
||||||
data->out = Idle;
|
data->out = Idle;
|
||||||
|
|
||||||
pFSM->base.privateVars.data = data;
|
pFSM->base.data = data;
|
||||||
|
|
||||||
pFSM->base.signals = &data->out;
|
pFSM->base.signals = &data->out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
||||||
pFSM->base.preloader.shadowData = malloc(sizeof(KeyIn));
|
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn));
|
||||||
pFSM->base.preloader.size = sizeof(KeyIn);
|
pFSM->base.privateVars.preloader.size = sizeof(KeyIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initSignals(KeyFSM *pFSM){ // 必须重新实现
|
static void initSignals(KeyFSM *pFSM){ // 必须重新实现
|
||||||
|
@ -85,6 +75,20 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
|
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,13 +99,12 @@ KeyFSM *createKeyFSM(){
|
||||||
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
||||||
|
|
||||||
#ifndef DSP28377
|
#ifndef DSP28377
|
||||||
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
#endif
|
#endif
|
||||||
|
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||||
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
||||||
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
|
||||||
|
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
||||||
|
|
|
@ -263,7 +263,7 @@ const static char *stateStr[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void printFSM(KeyFSM* pFSM){
|
static void printFSM(KeyFSM* pFSM){
|
||||||
KeyFSMData* data = pFSM->base.privateVars.data;
|
KeyFSMData* data = pFSM->base.data;
|
||||||
FSM_LOG("KeyFSM: ");
|
FSM_LOG("KeyFSM: ");
|
||||||
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
|
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: godcreator02 qq974980621@gmail.com
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
* @Date: 2024-04-20 20:08:03
|
* @Date: 2024-04-20 20:08:03
|
||||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
* @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
|
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
|
||||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
*/
|
*/
|
||||||
|
@ -14,16 +14,9 @@
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
#include "templateFSM_private.h"
|
#include "templateFSM_private.h"
|
||||||
|
|
||||||
/*
|
/* -------------------------------------------------------------------------- */
|
||||||
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
/* 纯虚函数,允许调用privateVars */
|
||||||
*/
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void step(TemplateFSM* pFSM){
|
|
||||||
printFSM(pFSM);
|
|
||||||
stepBaseFSM(BASE_FSM(pFSM));
|
|
||||||
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
||||||
|
|
||||||
|
@ -39,31 +32,26 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
};
|
};
|
||||||
*data = tempData;
|
*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));
|
TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals));
|
||||||
|
|
||||||
pFSM->base.signals = signals;
|
pFSM->base.signals = signals;
|
||||||
pFSM->base.signalSize = sizeof(TemplateFSMSignals);
|
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){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
addSelectNextStateFcn(D);
|
addSelectNextStateFcn(D);
|
||||||
addSelectNextStateFcn(E);
|
addSelectNextStateFcn(E);
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
||||||
addStateActionFcn(during, E);
|
addStateActionFcn(during, E);
|
||||||
addStateActionFcn(during, D);
|
addStateActionFcn(during, D);
|
||||||
|
@ -81,21 +69,36 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
|
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 *createTemplateFSM(){
|
||||||
TemplateFSM *pFSM;
|
TemplateFSM *pFSM;
|
||||||
pFSM = (TemplateFSM *)newBaseFSM(Count_State, 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.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||||
|
pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
||||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
|
|
||||||
|
// 调用父类构造函数
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
||||||
return pFSM;
|
return pFSM;
|
||||||
|
|
|
@ -1,17 +1,20 @@
|
||||||
#ifndef __TEMPLATE_FSM_H_
|
#ifndef __TEMPLATE_FSM_H_
|
||||||
#define __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
|
typedef struct _templateFSMSignals
|
||||||
{
|
{
|
||||||
int signalA;
|
int signalA;
|
||||||
int signalB;
|
int signalB;
|
||||||
}TemplateFSMSignals;
|
}TemplateFSMSignals;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _templateFSMExternalData
|
typedef struct _templateFSMExternalData
|
||||||
{
|
{
|
||||||
int arrindex;
|
int arrindex;
|
||||||
|
@ -24,6 +27,11 @@ typedef struct _templateFSMInnerData
|
||||||
int inner1;
|
int inner1;
|
||||||
}TemplateFSMInnerData;
|
}TemplateFSMInnerData;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 下面的改个名字就行了 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM))
|
||||||
|
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
|
||||||
|
|
||||||
typedef struct _templateFSMData
|
typedef struct _templateFSMData
|
||||||
{
|
{
|
||||||
|
@ -31,8 +39,6 @@ typedef struct _templateFSMData
|
||||||
TemplateFSMInnerData inner;
|
TemplateFSMInnerData inner;
|
||||||
}TemplateFSMData;
|
}TemplateFSMData;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _TemplateFSM TemplateFSM;
|
typedef struct _TemplateFSM TemplateFSM;
|
||||||
TemplateFSM *createTemplateFSM();
|
TemplateFSM *createTemplateFSM();
|
||||||
|
|
||||||
|
|
|
@ -6,21 +6,18 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
继承基类
|
/* -------------------------------------------------------------------------- */
|
||||||
*/
|
/* 继承基类 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
typedef struct _TemplateFSM
|
typedef struct _TemplateFSM
|
||||||
{
|
{
|
||||||
// 继承父类
|
|
||||||
FSM base;
|
FSM base;
|
||||||
}TemplateFSM;
|
}TemplateFSM;
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 状态 */
|
/* 状态定义 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
typedef enum _State
|
typedef enum _State
|
||||||
{
|
{
|
||||||
Idle,
|
Idle,
|
||||||
|
@ -110,11 +107,9 @@ static State transitionHandler(E, D)()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 打印调试 */
|
||||||
/*
|
/* -------------------------------------------------------------------------- */
|
||||||
用户自定义事件选择逻辑—————————————————begin
|
|
||||||
*/
|
|
||||||
const static char *stateStr[] = {
|
const static char *stateStr[] = {
|
||||||
"Idle",
|
"Idle",
|
||||||
"D",
|
"D",
|
||||||
|
|
Loading…
Reference in New Issue