FSM/vscode/FSM_OOP/baseFSM/FSM_private.h

123 lines
3.4 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"
typedef struct FSMHandler FSMHandler;
typedef struct FSM FSM;
typedef struct FSMSignals FSMSignals;
/* -------------------------------------------------------------------------- */
/* private数据类型 */
/* -------------------------------------------------------------------------- */
/**
* @brief
* @deprecated
*
*/
typedef struct FSMDataLoader
{
void *shadowData;
int isReady;
int isOverflow;
size_t size;
}FSMDataLoader;
/**
* @brief 访
*
*/
typedef struct FSMPrivateVars
{
2024-05-07 16:45:57 +08:00
int numState; /**< 状态数量 */
int defaultState; /**< Idle状态不能停留必须指定一个初始状态 */
2024-05-07 16:45:57 +08:00
int curState; /**< 当前状态 */
int nextState; /**< nextState为Idle代表状态机不发生变化 */
int index; /**< 状态转移函数表对应的标号 */
2024-05-07 16:45:57 +08:00
FSMHandler fcns; /**< 状态函数表 */
FSM *childFSM; /**< 限定只能有一个子状态机 */
FSMDataLoader preloader; /**< @deprecated 弃用 */
}FSMPrivateVars;
2024-05-07 16:45:57 +08:00
static void empty_func(){
}
2024-05-07 16:45:57 +08:00
/**
* @brief FSM.c中调用
*
* @param numState
* @param defaultState
* @return FSMPrivateVars*
*/
FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
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->defaultState = defaultState;
privateVars->curState = 0;
privateVars->nextState = 0;
privateVars->childFSM = NULL;
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;
}
privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
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
privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
return privateVars;
}
2024-01-23 20:05:30 +08:00
static int hasChildFSM(FSM *pFSM){
return (pFSM->privateVars->childFSM != NULL);
}
#endif