去掉了template的默认状态,和plecs对标
This commit is contained in:
parent
d6791ef8d4
commit
6cefb9dae5
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)){
|
||||||
|
|
Loading…
Reference in New Issue