去掉了template的默认状态,和plecs对标

This commit is contained in:
TrashGod 2024-06-28 17:43:17 +08:00
parent d6791ef8d4
commit 6cefb9dae5
6 changed files with 14 additions and 34 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

@ -29,8 +29,6 @@
*/ */
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)
return;
pFSM->signals.lastTriggeredSignal = Idle_Signal; pFSM->signals.lastTriggeredSignal = Idle_Signal;
pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals); pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals);
@ -101,20 +99,6 @@ void stepBaseFSM(FSM *pFSM)
pFSM->privateVars->curState = nextState; pFSM->privateVars->curState = nextState;
} }
else if(curState == 0){ // 处理刚运行进入的默认状态
nextState = pFSM->privateVars->defaultState;
// 进父状态机
fcns->enterActionTable[nextState](data);
// 进子状态机
if(childFSMTable[nextState] != NULL){
FSM *cFSM = childFSMTable[nextState];
int cFSMNextState = cFSM->privateVars->defaultState;
cFSM->privateVars->fcns.enterActionTable[cFSMNextState](cFSM->data);
cFSM->privateVars->curState = cFSMNextState;
}
pFSM->privateVars->curState = nextState;
}
else // 状态机没动 else // 状态机没动
{ {
if(childFSMTable[curState] == NULL){ if(childFSMTable[curState] == NULL){
@ -156,11 +140,6 @@ 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;
} }
@ -169,9 +148,6 @@ void _setSignal(FSM *pFSM, Uint16 signalFlag){
pFSM->signals.all |= (1 << signalFlag); pFSM->signals.all |= (1 << signalFlag);
} }
/** /**
* @brief * @brief
* @deprecated * @deprecated
@ -219,14 +195,14 @@ void _clearPreloaderOverFlag(FSM *pFSM){
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 构造函数,分两段,先新建再赋值 */ /* 构造函数,分两段,先新建再赋值 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
FSM* newBaseFSM(int numState, int defaultState){ FSM* newBaseFSM(int numState){
typedef void (*StateFuncPtr)(void *); typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **); typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *); typedef int (*TransitionFuncPtr)(void *, int *);
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *); typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
FSM *pFSM = calloc(1, sizeof(FSM)); FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars = newFMSPrivateVars(numState, defaultState); pFSM->privateVars = newFMSPrivateVars(numState);
FSMPureVtbl pureVtbl = { FSMPureVtbl pureVtbl = {
.setupHandler = NULL, .setupHandler = NULL,

View File

@ -69,10 +69,9 @@ static void empty_func(){
* @brief FSM.c中调用 * @brief FSM.c中调用
* *
* @param numState * @param numState
* @param defaultState
* @return FSMPrivateVars* * @return FSMPrivateVars*
*/ */
FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){ FSMPrivateVars* newFMSPrivateVars(int numState){
typedef void (*StateFuncPtr)(void *); typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **); typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *); typedef int (*TransitionFuncPtr)(void *, int *);
@ -80,7 +79,6 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars)); FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars));
privateVars->numState = numState; privateVars->numState = numState;
privateVars->defaultState = defaultState;
privateVars->curState = 0; privateVars->curState = 0;
privateVars->nextState = 0; privateVars->nextState = 0;
privateVars->childFSMTable = calloc(numState, sizeof(FSM)); privateVars->childFSMTable = calloc(numState, sizeof(FSM));
@ -99,7 +97,8 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
} }
privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); // 包括默认状态
privateVars->fcns.selectNextState = calloc(numState+1, sizeof(SelectNextStateFcnPtr));
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++)
{ {

View File

@ -133,7 +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, int defaultState); FSM* newBaseFSM(int numState);
void resetBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM);

View File

@ -92,6 +92,7 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
*/ */
static void setupHandler(FSMHandler* fcns){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle);
addSelectNextStateFcn(D); addSelectNextStateFcn(D);
addSelectNextStateFcn(E); addSelectNextStateFcn(E);
@ -142,7 +143,7 @@ static void step(TemplateFSM* pFSM){
*/ */
TemplateFSM *createTemplateFSM(){ TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM; TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE); pFSM = (TemplateFSM *)newBaseFSM(Count_State);
// 重新实现的函数 // 重新实现的函数
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;

View File

@ -50,12 +50,16 @@ typedef enum _State
Count_State, /**< 必须在结尾,用来统计状态数量 */ Count_State, /**< 必须在结尾,用来统计状态数量 */
} State; } State;
#define DEFAULT_STATE E /**< 默认状态Idle状态会先跳转到默认状态 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */ /* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle)(TemplateFSMData *data, FSMSignals *signals){
return E;
}
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){ static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_A)){ if(getSignal(signals, Signal_A)){