FSM/vscode/FSM_OOP/baseFSM/FSM_private.h

153 lines
4.3 KiB
C
Raw Normal View History

/**
* @file FSM_private.h
* @author (dalaoshi@stu.xjtu.edu.cn)
* @brief 使
2024-05-07 16:45:57 +08:00
* @details 访
* @version 2.1
* @date 2024-05-07
*
* @copyright 2024
*
*/
2024-01-23 20:05:30 +08:00
#ifndef __FSM_PRIVATE_H_
#define __FSM_PRIVATE_H_
#include <string.h>
#include "FSM_protected.h"
#include "FSM_private_vars.h"
typedef struct FSMHandler FSMHandler;
typedef struct FSM FSM;
typedef struct FSMSignals FSMSignals;
2024-06-28 19:45:02 +08:00
/**
* @brief
*/
2024-06-28 22:39:41 +08:00
static void empty_func(void * a){
}
2024-05-07 16:45:57 +08:00
/**
* @brief FSM.c中调用
*
* @param numState
* @return FSMPrivateVars*
*/
FSMPrivateVars* newFMSPrivateVars(int numState){
typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *);
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars));
privateVars->numState = numState;
privateVars->curState = 0;
privateVars->nextState = 0;
2024-06-26 20:21:14 +08:00
privateVars->childFSMTable = calloc(numState, sizeof(FSM));
privateVars->preloader.isReady = 0;
privateVars->fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
privateVars->fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
for (int i = 0; i < numState; i++)
{
privateVars->fcns.duringActionTable[i] = empty_func;
privateVars->fcns.enterActionTable[i] = empty_func;
privateVars->fcns.exitActionTable[i] = empty_func;
}
2024-06-28 22:13:30 +08:00
privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); // 包括默认状态,所以要+1
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
for (int i = 0; i < numState * numState; i++)
{
privateVars->fcns.transitionTable[i] = empty_func;
}
privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
privateVars->fcns.transitionGeneralAction = empty_func;
2024-01-23 20:05:30 +08:00
return privateVars;
}
2024-01-23 20:05:30 +08:00
2024-06-28 19:45:02 +08:00
/* -------------------------------------------------------------------------- */
/* 以下开始是FSM私有函数 */
/* -------------------------------------------------------------------------- */
static inline FSM * getChildFSM(FSM *pFSM, int state){
return pFSM->privateVars->childFSMTable[state];
}
static inline int hasChildFSM(FSM *pFSM, int state){
2024-06-26 20:21:14 +08:00
return (pFSM->privateVars->childFSMTable[state] != NULL);
}
2024-06-28 19:45:02 +08:00
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;
}
2024-06-28 19:45:02 +08:00
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);
2024-06-28 19:45:02 +08:00
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);
}
2024-06-28 19:45:02 +08:00
static inline void doResetSignals(FSM *pFSM){
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
}
static inline void clearLastTriggeredSignal(FSM *pFSM){
2024-06-28 22:13:30 +08:00
pFSM->signals.lastTriggeredSignal = FSM_Idle;
2024-06-28 19:45:02 +08:00
}
#endif