FSM/vscode/FSM_OOP/baseFSM/FSM.c

253 lines
6.2 KiB
C
Raw Normal View History

2024-05-07 16:45:57 +08:00
/**
* @file FSM.c
* @author (dalaoshi@stu.xjtu.edu.cn)
* @brief
* @version 2.1
* @date 2024-05-07
*
* @copyright 2024
*
*/
2024-01-23 20:05:30 +08:00
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
2024-01-23 20:05:30 +08:00
#include "FSM_private.h"
#include "FSM_protected.h"
#include "FSM_public.h"
2024-05-07 15:52:18 +08:00
/* -------------------------------------------------------------------------- */
/* private函数 */
/* -------------------------------------------------------------------------- */
/**
* @brief
*
* @param pFSM
*/
static inline void updateNextState(FSM* pFSM){
int curState = getCurState(pFSM);
2024-04-23 15:11:06 +08:00
int nextState = doSelectNextState(pFSM, curState);
setNextState(pFSM, nextState);
updateIndex(pFSM);
}
/**
* @brief 退exit函数
*
* @param pFSM
*/
2024-07-02 16:42:07 +08:00
static void shutFSM(FSM *pFSM)
{
int curState = getCurState(pFSM);
if(hasChildFSM(pFSM, curState)){
2024-07-02 16:42:07 +08:00
shutFSM(getChildFSM(pFSM, curState));
}
doExit(pFSM);
2024-06-28 22:13:30 +08:00
setCurState(pFSM, FSM_Idle);
}
/**
* @brief
* @deprecated
* @param pFSM
*/
static inline void preload(FSM* pFSM){
if(pFSM->privateVars->preloader.isReady){
memcpy(pFSM->data, pFSM->privateVars->preloader.shadowData, pFSM->privateVars->preloader.size);
pFSM->privateVars->preloader.isReady = 0;
}
}
/* -------------------------------------------------------------------------- */
/* protected */
/* -------------------------------------------------------------------------- */
/**
* @brief
* @details
* @param pFSM
*/
2024-01-23 20:05:30 +08:00
void stepBaseFSM(FSM *pFSM)
{
2024-06-28 22:13:30 +08:00
pFSM->pureVtbl.loadExternalData(pFSM->data);
// preload(pFSM);
updateNextState(pFSM);
doResetSignals(pFSM);
int curState = getCurState(pFSM);
int index = getIndex(pFSM);
int nextState = getNextState(pFSM);
if(nextState && curState != nextState){ // 状态切换
// 退出子状态机
2024-06-28 19:45:02 +08:00
if(hasChildFSM(pFSM, curState)){
FSM *cFSM = getChildFSM(pFSM, curState);
2024-07-02 16:42:07 +08:00
shutFSM(cFSM);
2024-06-26 20:21:14 +08:00
}
doExit(pFSM);
doTransition(pFSM); // 有特定的状态转移函数
2024-06-28 19:45:02 +08:00
doGeneralTransition(pFSM); // 通用状态转移函数
2024-06-26 20:21:14 +08:00
2024-06-28 19:45:02 +08:00
doEnter(pFSM, nextState);
2024-06-26 20:21:14 +08:00
// 进子状态机,必须从默认状态开始
2024-06-28 19:45:02 +08:00
if(hasChildFSM(pFSM, nextState)){
FSM *cFSM = getChildFSM(pFSM, nextState);
2024-06-28 19:13:27 +08:00
Step(cFSM);
2024-06-26 20:21:14 +08:00
}
2024-06-28 19:45:02 +08:00
setCurState(pFSM, nextState);
2024-01-23 20:05:30 +08:00
}
else // 状态机没动
2024-01-23 20:05:30 +08:00
{
2024-06-28 19:45:02 +08:00
if(!hasChildFSM(pFSM, curState)){
doDuring(pFSM);
2024-06-26 20:21:14 +08:00
}
else{
2024-06-28 19:45:02 +08:00
FSM *cFSM = getChildFSM(pFSM, curState);
Step(cFSM);
2024-06-26 20:21:14 +08:00
}
2024-01-23 20:05:30 +08:00
}
}
/* -------------------------------------------------------------------------- */
/* public 函数 */
/* -------------------------------------------------------------------------- */
void _stepFSM(FSM *pFSM){
2024-05-07 15:52:18 +08:00
pFSM->publicFcns.step(pFSM);
}
2024-07-02 16:42:07 +08:00
const char * _curState2ASCII(FSM *pFSM){
return pFSM->publicFcns.curState2ASCII(pFSM);
}
inline int getFSMCurState(FSM *pFSM){
return pFSM->privateVars->curState;
}
2024-07-02 16:42:07 +08:00
inline int getFSMNextState(FSM *pFSM){
return pFSM->privateVars->nextState;
}
2024-06-26 20:21:14 +08:00
void registerChildFSM(FSM *parent, FSM *child, int state){
parent->privateVars->childFSMTable[state] = child;
}
2024-06-28 19:45:02 +08:00
const void *_getData(FSM* pFSM){
return (const void *)pFSM->data;
}
void _setSignal(FSM *pFSM, Uint16 signalFlag){
pFSM->signals.all |= (1 << signalFlag);
}
2024-07-02 16:42:07 +08:00
/**
* @brief
* @deprecated
* @param pFSM
* @return void*
*/
void *_preloadIn(FSM *pFSM){
return pFSM->privateVars->preloader.shadowData;
}
/**
* @brief
* @deprecated
* @param pFSM
*/
void _preloaderGetReady(FSM *pFSM){
if(pFSM->privateVars->preloader.isReady){
pFSM->privateVars->preloader.isOverflow = 1;
}
pFSM->privateVars->preloader.isReady = 1;
}
/**
* @brief
* @deprecated
* @param pFSM
* @return int
*/
int _getPreloaderOverFlag(FSM *pFSM){
return pFSM->privateVars->preloader.isOverflow;
}
/**
* @brief
* @deprecated
* @param pFSM
*/
void _clearPreloaderOverFlag(FSM *pFSM){
pFSM->privateVars->preloader.isOverflow = 0;
}
/* -------------------------------------------------------------------------- */
/* 构造函数,分两段,先新建再赋值 */
/* -------------------------------------------------------------------------- */
FSM* newBaseFSM(int numState){
typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *);
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
2024-01-23 20:05:30 +08:00
FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars = newFMSPrivateVars(numState);
2024-05-07 15:52:18 +08:00
FSMPureVtbl pureVtbl = {
2024-01-23 20:05:30 +08:00
.setupHandler = NULL,
.initData = NULL,
.loadExternalData = NULL,
.initDataLoader = NULL,
.initSignals = NULL,
.resetSignals = NULL,
2024-01-23 20:05:30 +08:00
};
pFSM->pureVtbl = pureVtbl;
pFSM->publicFcns.step = stepBaseFSM;
2024-01-23 20:05:30 +08:00
return pFSM;
}
void constructFSM(FSM* pFSM){
assert(pFSM->pureVtbl.setupHandler);
assert(pFSM->pureVtbl.initData);
assert(pFSM->pureVtbl.initDataLoader);
2024-01-23 20:05:30 +08:00
pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns);
pFSM->pureVtbl.initData(pFSM);
pFSM->pureVtbl.initDataLoader(pFSM);
/* ---------------------------------- 检查状态表 --------------------------------- */
for (int i = 1; i < pFSM->privateVars->numState; i++) // 跳过Idle状态Idle状态只能跳转到默认状态
{
if(!pFSM->privateVars->fcns.selectNextState[i]){
FSM_LOG("每个状态都要有一个状态选择函数!\n");
assert(0); // 强制退出
}
}
2024-01-23 20:05:30 +08:00
}