Merge branch 'feature/重新加入子状态机' into develop

This commit is contained in:
TrashGod 2024-06-28 21:45:08 +08:00
commit 2667b895df
14 changed files with 185 additions and 104 deletions

View File

@ -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)

View File

@ -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); // 有特定的状态转移函数
fcns->enterActionTable[nextState](data); doGeneralTransition(pFSM); // 通用状态转移函数
doEnter(pFSM, nextState);
// 进子状态机,必须从默认状态开始 // 进子状态机,必须从默认状态开始
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;
} }

View File

@ -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

View File

@ -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);
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 内联函数 */ /* 内联函数 */

View File

@ -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

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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="