Merge branch 'feature/重新加入子状态机' into develop
This commit is contained in:
commit
2667b895df
|
@ -7,7 +7,7 @@ aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
||||||
|
|
||||||
|
|
||||||
# set(keytest 789)
|
# set(keytest 789)
|
||||||
# set(child_parent 789)
|
set(child_parent 789)
|
||||||
if(DEFINED keytest)
|
if(DEFINED keytest)
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)
|
||||||
|
|
|
@ -27,15 +27,32 @@
|
||||||
*
|
*
|
||||||
* @param pFSM 状态机变量的基类指针
|
* @param pFSM 状态机变量的基类指针
|
||||||
*/
|
*/
|
||||||
static inline void setNextState(FSM* pFSM){
|
static inline void updateNextState(FSM* pFSM){
|
||||||
int curState = pFSM->privateVars->curState;
|
int curState = getCurState(pFSM);
|
||||||
|
|
||||||
pFSM->signals.lastTriggeredSignal = Idle_Signal;
|
|
||||||
pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals);
|
|
||||||
pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState;
|
|
||||||
|
|
||||||
|
|
||||||
|
int nextState = doSelectNextState(pFSM, curState);
|
||||||
|
setNextState(pFSM, nextState);
|
||||||
|
updateIndex(pFSM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 递归退出整个状态机包括其子状态机,执行exit函数
|
||||||
|
*
|
||||||
|
* @param pFSM 状态机变量的基类指针
|
||||||
|
*/
|
||||||
|
static void exitFSM(FSM *pFSM)
|
||||||
|
{
|
||||||
|
int curState = getCurState(pFSM);
|
||||||
|
if(hasChildFSM(pFSM, curState)){
|
||||||
|
exitFSM(getChildFSM(pFSM, curState));
|
||||||
|
}
|
||||||
|
doExit(pFSM);
|
||||||
|
setCurState(pFSM, Idle_State);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief
|
||||||
* @deprecated 去掉了所有和预装载器相关的内容
|
* @deprecated 去掉了所有和预装载器相关的内容
|
||||||
|
@ -59,53 +76,44 @@ static inline void preload(FSM* pFSM){
|
||||||
*/
|
*/
|
||||||
void stepBaseFSM(FSM *pFSM)
|
void stepBaseFSM(FSM *pFSM)
|
||||||
{
|
{
|
||||||
pFSM->pureVtbl.loadExternalData(pFSM->data);
|
// pFSM->pureVtbl.loadExternalData(pFSM->data);
|
||||||
// preload(pFSM);
|
// preload(pFSM);
|
||||||
setNextState(pFSM);
|
updateNextState(pFSM);
|
||||||
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
|
doResetSignals(pFSM);
|
||||||
|
|
||||||
FSMHandler *fcns = &pFSM->privateVars->fcns;
|
int curState = getCurState(pFSM);
|
||||||
int curState = pFSM->privateVars->curState;
|
int index = getIndex(pFSM);
|
||||||
void *data = pFSM->data;
|
int nextState = getNextState(pFSM);
|
||||||
FSM **childFSMTable = pFSM->privateVars->childFSMTable;
|
|
||||||
int index = pFSM->privateVars->index;
|
|
||||||
int nextState = pFSM->privateVars->nextState;
|
|
||||||
|
|
||||||
if(nextState && curState != nextState){ // 状态切换
|
if(nextState && curState != nextState){ // 状态切换
|
||||||
// 退子状态机
|
// 退出子状态机
|
||||||
if(childFSMTable[curState] != NULL){
|
if(hasChildFSM(pFSM, curState)){
|
||||||
FSM *cFSM = childFSMTable[curState];
|
FSM *cFSM = getChildFSM(pFSM, curState);
|
||||||
int cFSMCurState = cFSM->privateVars->curState;
|
exitFSM(cFSM);
|
||||||
cFSM->privateVars->fcns.exitActionTable[cFSMCurState](cFSM->data);
|
|
||||||
resetBaseFSM(cFSM);
|
|
||||||
}
|
}
|
||||||
// 退父状态机
|
|
||||||
fcns->exitActionTable[curState](data);
|
|
||||||
|
|
||||||
// 转移函数
|
doExit(pFSM);
|
||||||
fcns->transitionTable[index](data); // 有特定的状态转移函数
|
|
||||||
fcns->transitionGeneralAction(data); // 通用状态转移函数
|
doTransition(pFSM); // 有特定的状态转移函数
|
||||||
|
doGeneralTransition(pFSM); // 通用状态转移函数
|
||||||
|
|
||||||
// 进父状态机
|
doEnter(pFSM, nextState);
|
||||||
fcns->enterActionTable[nextState](data);
|
|
||||||
|
|
||||||
// 进子状态机,必须从默认状态开始
|
// 进子状态机,必须从默认状态开始
|
||||||
if(childFSMTable[nextState] != NULL){
|
if(hasChildFSM(pFSM, nextState)){
|
||||||
FSM *cFSM = childFSMTable[nextState];
|
FSM *cFSM = getChildFSM(pFSM, nextState);
|
||||||
int cFSMNextState = cFSM->privateVars->defaultState;
|
Step(cFSM);
|
||||||
cFSM->privateVars->fcns.enterActionTable[cFSMNextState](cFSM->data);
|
|
||||||
cFSM->privateVars->curState = cFSMNextState;
|
|
||||||
}
|
}
|
||||||
|
setCurState(pFSM, nextState);
|
||||||
pFSM->privateVars->curState = nextState;
|
|
||||||
}
|
}
|
||||||
else // 状态机没动
|
else // 状态机没动
|
||||||
{
|
{
|
||||||
if(childFSMTable[curState] == NULL){
|
if(!hasChildFSM(pFSM, curState)){
|
||||||
fcns->duringActionTable[curState](data);
|
doDuring(pFSM);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Step(childFSMTable[curState]);
|
FSM *cFSM = getChildFSM(pFSM, curState);
|
||||||
|
Step(cFSM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,12 +124,6 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* public 函数 */
|
/* public 函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
void resetBaseFSM(FSM *pFSM)
|
|
||||||
{
|
|
||||||
|
|
||||||
pFSM->privateVars->curState = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _stepFSM(FSM *pFSM){
|
void _stepFSM(FSM *pFSM){
|
||||||
pFSM->publicFcns.step(pFSM);
|
pFSM->publicFcns.step(pFSM);
|
||||||
}
|
}
|
||||||
|
@ -140,6 +142,8 @@ void registerChildFSM(FSM *parent, FSM *child, int state){
|
||||||
parent->privateVars->childFSMTable[state] = child;
|
parent->privateVars->childFSMTable[state] = child;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const void *_getData(FSM* pFSM){
|
const void *_getData(FSM* pFSM){
|
||||||
return (const void *)pFSM->data;
|
return (const void *)pFSM->data;
|
||||||
}
|
}
|
||||||
|
@ -215,7 +219,6 @@ FSM* newBaseFSM(int numState){
|
||||||
pFSM->pureVtbl = pureVtbl;
|
pFSM->pureVtbl = pureVtbl;
|
||||||
|
|
||||||
pFSM->publicFcns.step = stepBaseFSM;
|
pFSM->publicFcns.step = stepBaseFSM;
|
||||||
pFSM->publicFcns.reset = resetBaseFSM;
|
|
||||||
|
|
||||||
return pFSM;
|
return pFSM;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,9 @@ typedef struct FSMPrivateVars
|
||||||
|
|
||||||
}FSMPrivateVars;
|
}FSMPrivateVars;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 纯纯空函数
|
||||||
|
*/
|
||||||
static void empty_func(){
|
static void empty_func(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,8 +99,8 @@ FSMPrivateVars* newFMSPrivateVars(int numState){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 包括默认状态
|
|
||||||
privateVars->fcns.selectNextState = calloc(numState+1, sizeof(SelectNextStateFcnPtr));
|
privateVars->fcns.selectNextState = calloc(numState+1, sizeof(SelectNextStateFcnPtr)); // 包括默认状态,所以要+1
|
||||||
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
|
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
|
||||||
for (int i = 0; i < numState * numState; i++)
|
for (int i = 0; i < numState * numState; i++)
|
||||||
{
|
{
|
||||||
|
@ -108,15 +110,80 @@ FSMPrivateVars* newFMSPrivateVars(int numState){
|
||||||
privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
|
privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
|
||||||
privateVars->fcns.transitionGeneralAction = empty_func;
|
privateVars->fcns.transitionGeneralAction = empty_func;
|
||||||
|
|
||||||
privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
|
||||||
|
|
||||||
return privateVars;
|
return privateVars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int hasChildFSM(FSM *pFSM, int state){
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 以下开始是FSM私有函数 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static inline FSM * getChildFSM(FSM *pFSM, int state){
|
||||||
|
return pFSM->privateVars->childFSMTable[state];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int hasChildFSM(FSM *pFSM, int state){
|
||||||
return (pFSM->privateVars->childFSMTable[state] != NULL);
|
return (pFSM->privateVars->childFSMTable[state] != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void setCurState(FSM *pFSM, int state){
|
||||||
|
pFSM->privateVars->curState = state;
|
||||||
|
}
|
||||||
|
static inline int getCurState(FSM *pFSM){
|
||||||
|
return pFSM->privateVars->curState;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int setNextState(FSM *pFSM, int state){
|
||||||
|
return pFSM->privateVars->nextState = state;
|
||||||
|
}
|
||||||
|
static inline int getNextState(FSM *pFSM){
|
||||||
|
return pFSM->privateVars->nextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int getIndex(FSM *pFSM){
|
||||||
|
return pFSM->privateVars->index;
|
||||||
|
}
|
||||||
|
static inline void updateIndex(FSM *pFSM){
|
||||||
|
pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void doExit(FSM *pFSM){
|
||||||
|
pFSM->privateVars->fcns.exitActionTable[getCurState(pFSM)](pFSM->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void doEnter(FSM *pFSM, int state){
|
||||||
|
pFSM->privateVars->fcns.enterActionTable[state](pFSM->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void doDuring(FSM *pFSM){
|
||||||
|
pFSM->privateVars->fcns.duringActionTable[getCurState(pFSM)](pFSM->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void doGeneralTransition(FSM *pFSM){
|
||||||
|
pFSM->privateVars->fcns.transitionGeneralAction(pFSM->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void doTransition(FSM *pFSM){
|
||||||
|
int index = getIndex(pFSM);
|
||||||
|
pFSM->privateVars->fcns.transitionTable[index](pFSM->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int doSelectNextState(FSM *pFSM, int state){
|
||||||
|
return pFSM->privateVars->fcns.selectNextState[state](pFSM->data, &pFSM->signals);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static inline void doResetSignals(FSM *pFSM){
|
||||||
|
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void clearLastTriggeredSignal(FSM *pFSM){
|
||||||
|
pFSM->signals.lastTriggeredSignal = Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -48,7 +48,7 @@ typedef struct FSM FSM;
|
||||||
typedef struct FSMSignals FSMSignals;
|
typedef struct FSMSignals FSMSignals;
|
||||||
typedef struct FSMPrivateVars FSMPrivateVars;
|
typedef struct FSMPrivateVars FSMPrivateVars;
|
||||||
|
|
||||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
typedef void (*Avoid_WARNING_State_Fcns)(void *data);
|
||||||
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);
|
||||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
|
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
|
||||||
|
@ -74,7 +74,6 @@ typedef struct FSMHandler{
|
||||||
void (**duringActionTable)(void *data); /**< 状态不变时运行的函数,和plecs对标 */
|
void (**duringActionTable)(void *data); /**< 状态不变时运行的函数,和plecs对标 */
|
||||||
void (**exitActionTable)(void *data); /**< 状态退出时运行的函数,和plecs对标 */
|
void (**exitActionTable)(void *data); /**< 状态退出时运行的函数,和plecs对标 */
|
||||||
|
|
||||||
void (**childFSMStepTable)(FSM **cFSM); /**< @deprecated 子状态机暂时弃用 */
|
|
||||||
}FSMHandler;
|
}FSMHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,7 +87,7 @@ typedef struct FSMSignals
|
||||||
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
||||||
}FSMSignals;
|
}FSMSignals;
|
||||||
#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */
|
#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */
|
||||||
|
#define Idle_State 0
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -134,8 +133,7 @@ typedef struct FSM
|
||||||
void stepBaseFSM(FSM *pFSM);
|
void stepBaseFSM(FSM *pFSM);
|
||||||
void constructFSM(FSM* pFSM);
|
void constructFSM(FSM* pFSM);
|
||||||
FSM* newBaseFSM(int numState);
|
FSM* newBaseFSM(int numState);
|
||||||
void resetBaseFSM(FSM *pFSM);
|
void registerChildFSM(FSM *parent, FSM *child, int state);
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 内联函数 */
|
/* 内联函数 */
|
||||||
|
|
|
@ -31,7 +31,6 @@ typedef struct FSMPublicFcns
|
||||||
#define GetData(pFSM) _getData((FSM*)pFSM) /**< 外界调用这个 */
|
#define GetData(pFSM) _getData((FSM*)pFSM) /**< 外界调用这个 */
|
||||||
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal) /**< 外界调用这个 */
|
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal) /**< 外界调用这个 */
|
||||||
|
|
||||||
|
|
||||||
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); /**< @deprecated */
|
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); /**< @deprecated */
|
||||||
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
||||||
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
||||||
|
@ -52,7 +51,6 @@ void _preloaderGetReady(FSM *pFSM);
|
||||||
int _getPreloaderOverFlag(FSM *pFSM);
|
int _getPreloaderOverFlag(FSM *pFSM);
|
||||||
void _clearPreloaderOverFlag(FSM *pFSM);
|
void _clearPreloaderOverFlag(FSM *pFSM);
|
||||||
|
|
||||||
/* ---------------------------------- 子状态机 ---------------------------------- */
|
|
||||||
void registerChildFSM(FSM *parent, FSM *child, int state);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,允许调用privateVars */
|
/* 纯虚函数,允许调用privateVars */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -73,6 +72,7 @@ static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
|
||||||
*/
|
*/
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
addSelectNextStateFcn(Idle);
|
||||||
addSelectNextStateFcn(A);
|
addSelectNextStateFcn(A);
|
||||||
addSelectNextStateFcn(B);
|
addSelectNextStateFcn(B);
|
||||||
addSelectNextStateFcn(C);
|
addSelectNextStateFcn(C);
|
||||||
|
@ -114,9 +114,14 @@ static void step(ParentFSM* pFSM){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 绑定子状态机
|
/**
|
||||||
void bindChildFSM(FSM *pFSM, FSM *cFSM){
|
* @brief 绑定子状态机,需要自己实现逻辑
|
||||||
registerChildFSM(pFSM, cFSM, B);
|
*
|
||||||
|
* @param pFSM 父状态机指针
|
||||||
|
* @param B_FSM B状态对应的子状态机的指针,后续按照这种命名方式写
|
||||||
|
*/
|
||||||
|
void bind_ParentFSM_ChildFSMs(ParentFSM *pFSM, FSM *B_FSM){
|
||||||
|
registerChildFSM((FSM *)pFSM, B_FSM, B);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,7 +136,7 @@ void bindChildFSM(FSM *pFSM, FSM *cFSM){
|
||||||
*/
|
*/
|
||||||
ParentFSM *createParentFSM(){
|
ParentFSM *createParentFSM(){
|
||||||
ParentFSM *pFSM;
|
ParentFSM *pFSM;
|
||||||
pFSM = (ParentFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
pFSM = (ParentFSM *)newBaseFSM(Count_State);
|
||||||
|
|
||||||
// 重新实现的函数
|
// 重新实现的函数
|
||||||
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
|
|
|
@ -28,21 +28,24 @@ typedef struct ParentFSM
|
||||||
*/
|
*/
|
||||||
typedef enum _State
|
typedef enum _State
|
||||||
{
|
{
|
||||||
Idle, /**< 必须在开头,并且枚举值=0 */
|
Idle, /**< 必须在开头,并且枚举值=0,表示空状态 */
|
||||||
A,
|
A,
|
||||||
B,
|
B,
|
||||||
C,
|
C,
|
||||||
|
|
||||||
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
||||||
} State;
|
} State;
|
||||||
#define DEFAULT_STATE A /**< 默认状态,Idle状态会先跳转到默认状态 */
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下一个状态选择函数 */
|
/* 下一个状态选择函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
static State selectNextStateFcn(A)(ParentFSM *data, FSMSignals *signals){
|
static State selectNextStateFcn(Idle)(ParentFSMData *data, FSMSignals *signals){
|
||||||
|
return A;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(A)(ParentFSMData *data, FSMSignals *signals){
|
||||||
if(getSignal(signals, Signal_toB)){
|
if(getSignal(signals, Signal_toB)){
|
||||||
signals->lastTriggeredSignal = Signal_toB;
|
signals->lastTriggeredSignal = Signal_toB;
|
||||||
return B;
|
return B;
|
||||||
|
@ -50,7 +53,7 @@ static State selectNextStateFcn(A)(ParentFSM *data, FSMSignals *signals){
|
||||||
return Idle;
|
return Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(B)(ParentFSM *data, FSMSignals *signals){
|
static State selectNextStateFcn(B)(ParentFSMData *data, FSMSignals *signals){
|
||||||
if(getSignal(signals, Signal_toA)){
|
if(getSignal(signals, Signal_toA)){
|
||||||
signals->lastTriggeredSignal = Signal_toA;
|
signals->lastTriggeredSignal = Signal_toA;
|
||||||
return A;
|
return A;
|
||||||
|
@ -116,14 +119,10 @@ static void actionFcn(exit, C)()
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 转移函数 */
|
/* 转移函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
static void transitionGeneralAction(FSM pFSM){
|
static void transitionGeneralAction(ParentFSMData *data){
|
||||||
// FSM_LOG("general");
|
FSM_LOG("general");
|
||||||
}
|
}
|
||||||
|
|
||||||
// static void transitionGeneralAction(TemplateFSMData *data){
|
|
||||||
// FSM_LOG("general");
|
|
||||||
// }
|
|
||||||
|
|
||||||
static void transitionHandler(Idle, A)()
|
static void transitionHandler(Idle, A)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" Idle2A ");
|
FSM_LOG(" Idle2A ");
|
||||||
|
|
|
@ -73,6 +73,7 @@ static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现
|
||||||
*/
|
*/
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
addSelectNextStateFcn(Idle);
|
||||||
addSelectNextStateFcn(D);
|
addSelectNextStateFcn(D);
|
||||||
addSelectNextStateFcn(E);
|
addSelectNextStateFcn(E);
|
||||||
|
|
||||||
|
@ -123,7 +124,7 @@ static void step(ChildFSM* pFSM){
|
||||||
*/
|
*/
|
||||||
ChildFSM *createChildFSM(){
|
ChildFSM *createChildFSM(){
|
||||||
ChildFSM *pFSM;
|
ChildFSM *pFSM;
|
||||||
pFSM = (ChildFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
pFSM = (ChildFSM *)newBaseFSM(Count_State);
|
||||||
|
|
||||||
// 重新实现的函数
|
// 重新实现的函数
|
||||||
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
|
|
|
@ -42,8 +42,6 @@ typedef struct ChildFSMInnerData
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下面的改个名字就行了 */
|
/* 下面的改个名字就行了 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
#define ChildFSM_Input(pFSM) ((ChildFSMExternalData *)_preloadIn((FSM *)pFSM)) /**< @deprecated 暂时弃用 */
|
|
||||||
|
|
||||||
typedef struct ChildFSMData
|
typedef struct ChildFSMData
|
||||||
{
|
{
|
||||||
ChildFSMExternalData external;
|
ChildFSMExternalData external;
|
||||||
|
|
|
@ -34,14 +34,18 @@ typedef enum _State
|
||||||
|
|
||||||
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
||||||
} State;
|
} State;
|
||||||
#define DEFAULT_STATE D /**< 默认状态,Idle状态会先跳转到默认状态 */
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下一个状态选择函数 */
|
/* 下一个状态选择函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static State selectNextStateFcn(Idle)(ChildFSMData *data, FSMSignals *signals){
|
||||||
|
if(data->external.x == 1)
|
||||||
|
return D;
|
||||||
|
else
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(D)(ChildFSMData *data, FSMSignals *signals){
|
||||||
static State selectNextStateFcn(D)(ChildFSM *data, FSMSignals *signals){
|
|
||||||
if(getSignal(signals, Signal_toE)){
|
if(getSignal(signals, Signal_toE)){
|
||||||
signals->lastTriggeredSignal = Signal_toE;
|
signals->lastTriggeredSignal = Signal_toE;
|
||||||
return E;
|
return E;
|
||||||
|
@ -49,7 +53,7 @@ static State selectNextStateFcn(D)(ChildFSM *data, FSMSignals *signals){
|
||||||
return Idle;
|
return Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(E)(ChildFSM *data, FSMSignals *signals){
|
static State selectNextStateFcn(E)(ChildFSMData *data, FSMSignals *signals){
|
||||||
if(getSignal(signals, Signal_toD)){
|
if(getSignal(signals, Signal_toD)){
|
||||||
signals->lastTriggeredSignal = Signal_toD;
|
signals->lastTriggeredSignal = Signal_toD;
|
||||||
return D;
|
return D;
|
||||||
|
|
|
@ -15,7 +15,9 @@ int main(){
|
||||||
cFSM = createChildFSM();
|
cFSM = createChildFSM();
|
||||||
pFSM = createParentFSM();
|
pFSM = createParentFSM();
|
||||||
|
|
||||||
registerChildFSM(pFSM, cFSM, 2);
|
bind_ParentFSM_ChildFSMs(pFSM, (FSM *)cFSM);
|
||||||
|
|
||||||
|
((ParentFSMData *)GetData(cFSM))->external.x = 1;
|
||||||
|
|
||||||
for (int k = 0; k < 15; k++)
|
for (int k = 0; k < 15; k++)
|
||||||
{
|
{
|
||||||
|
@ -23,6 +25,10 @@ int main(){
|
||||||
SetSignal(pFSM, i[k]);
|
SetSignal(pFSM, i[k]);
|
||||||
SetSignal(cFSM, j[k]);
|
SetSignal(cFSM, j[k]);
|
||||||
|
|
||||||
|
if(k > 5){
|
||||||
|
((ParentFSMData *)GetData(cFSM))->external.x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
Step(pFSM);
|
Step(pFSM);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,19 @@
|
||||||
#ifndef __PARENT_FSM_H_
|
#ifndef __PARENT_FSM_H_
|
||||||
#define __PARENT_FSM_H_
|
#define __PARENT_FSM_H_
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 提前做类型声明 */
|
/* 提前做类型声明 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
typedef struct FSM FSM;
|
||||||
|
typedef struct ParentFSM ParentFSM;
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 子状态机绑定,需要自己实现逻辑 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
void bind_ParentFSM_ChildFSMs(ParentFSM *pFSM, FSM *B_FSM);
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 自定义数据和信号 */
|
/* 自定义数据和信号 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -41,12 +50,9 @@ typedef struct ParentFSMInnerData
|
||||||
}ParentFSMInnerData;
|
}ParentFSMInnerData;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下面的改个名字就行了 */
|
/* 这一块改个名字就行了 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
#define ParentFSM_Input(pFSM) ((ParentFSMExternalData *)_preloadIn((FSM *)pFSM)) /**< @deprecated 暂时弃用 */
|
|
||||||
|
|
||||||
typedef struct ParentFSMData
|
typedef struct ParentFSMData
|
||||||
{
|
{
|
||||||
|
@ -54,10 +60,8 @@ typedef struct ParentFSMData
|
||||||
ParentFSMInnerData internal;
|
ParentFSMInnerData internal;
|
||||||
}ParentFSMData;
|
}ParentFSMData;
|
||||||
|
|
||||||
typedef struct ParentFSM ParentFSM;
|
|
||||||
ParentFSM *createParentFSM();
|
ParentFSM *createParentFSM();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -54,8 +54,6 @@ typedef struct TemplateFSMInnerData
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下面的改个名字就行了 */
|
/* 下面的改个名字就行了 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) /**< @deprecated 暂时弃用 */
|
|
||||||
|
|
||||||
typedef struct TemplateFSMData
|
typedef struct TemplateFSMData
|
||||||
{
|
{
|
||||||
TemplateFSMExternalData external;
|
TemplateFSMExternalData external;
|
||||||
|
|
|
@ -47,7 +47,7 @@ Plecs {
|
||||||
ScriptsDialogGeometry ""
|
ScriptsDialogGeometry ""
|
||||||
ScriptsDialogSplitterPos "0"
|
ScriptsDialogSplitterPos "0"
|
||||||
Schematic {
|
Schematic {
|
||||||
Location [147, 417; 789, 840]
|
Location [306, 311; 948, 731]
|
||||||
ZoomFactor 1.71498
|
ZoomFactor 1.71498
|
||||||
SliderPosition [0, 0]
|
SliderPosition [0, 0]
|
||||||
ShowBrowser off
|
ShowBrowser off
|
||||||
|
@ -139,7 +139,7 @@ Plecs {
|
||||||
Show off
|
Show off
|
||||||
}
|
}
|
||||||
FSM {
|
FSM {
|
||||||
Location [661, 192; 2579, 1112]
|
Location [190, 122; 1746, 914]
|
||||||
ZoomFactor 0.76361
|
ZoomFactor 0.76361
|
||||||
SliderPosition [0, 47]
|
SliderPosition [0, 47]
|
||||||
FsmState {
|
FsmState {
|
||||||
|
@ -161,8 +161,8 @@ Plecs {
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "B"
|
Name "B"
|
||||||
Position [1220, 400]
|
Position [1210, 400]
|
||||||
Frame [-530, -240; 530, 240]
|
Frame [-520, -240; 520, 240]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
Value "printf(\" enterB \");"
|
Value "printf(\" enterB \");"
|
||||||
|
@ -177,7 +177,7 @@ Plecs {
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "D"
|
Name "D"
|
||||||
Position [-350, 20]
|
Position [-340, 20]
|
||||||
Frame [-100, -90; 100, 90]
|
Frame [-100, -90; 100, 90]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
|
@ -194,15 +194,15 @@ Plecs {
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name ".Junction"
|
Name ".Junction"
|
||||||
Position [-200, -130]
|
Position [-190, -130]
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name ".PointState"
|
Name ".PointState"
|
||||||
Position [-200, -170]
|
Position [-190, -170]
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "E"
|
Name "E"
|
||||||
Position [230, 20]
|
Position [240, 20]
|
||||||
Frame [-230, -90; 230, 90]
|
Frame [-230, -90; 230, 90]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
|
@ -571,7 +571,7 @@ Plecs {
|
||||||
LabelPosition south
|
LabelPosition south
|
||||||
Parameter {
|
Parameter {
|
||||||
Variable "DialogGeometry"
|
Variable "DialogGeometry"
|
||||||
Value "[782 587 655 313]"
|
Value "[947 556 655 313]"
|
||||||
Show off
|
Show off
|
||||||
}
|
}
|
||||||
Parameter {
|
Parameter {
|
||||||
|
@ -683,17 +683,17 @@ Plecs {
|
||||||
Direction up
|
Direction up
|
||||||
Flipped off
|
Flipped off
|
||||||
LabelPosition south
|
LabelPosition south
|
||||||
Location [849, 525; 1199, 784]
|
Location [974, 426; 1324, 693]
|
||||||
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
|
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
|
||||||
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
|
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
|
||||||
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
|
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
|
||||||
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADoAAAA"
|
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADwAAAA"
|
||||||
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
|
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
|
||||||
"AAAAA=="
|
"AAAAA=="
|
||||||
SavedViews "AAAAAgAAAAA="
|
SavedViews "AAAAAgAAAAA="
|
||||||
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA"
|
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA"
|
||||||
"QAAAGQAAAADAAAAZAAAAAIAAABkAAAABQAAAGQAAAAEAAAAZAAAAAcAAABkAAAABgAAAGQAAAAJAA"
|
"gAAAGQAAAAJAAAAZAAAAAgAAABkAAAABQAAAGQAAAAEAAAAZAAAAAcAAABkAAAABgAAAGQAAAABAA"
|
||||||
"AAZAAAAAgAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
|
"AAZAAAAAMAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
|
||||||
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
|
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
|
||||||
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
|
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
|
||||||
"AAYAAAAAQAAAAAAAAPoAAAAABg="
|
"AAYAAAAAQAAAAAAAAPoAAAAABg="
|
||||||
|
@ -781,4 +781,4 @@ Plecs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DemoSignature "GVuBD7S6RWz7S12avKXRuEMLBGx74onrKaOKhUN+KRs="
|
DemoSignature "jw8KDReJrMPoo1lAaPtOZeufBUfPGFLDXzJKLXRaW0c="
|
||||||
|
|
Loading…
Reference in New Issue