状态机区别Data和Signal,Signal优先级更高,生命周期更短

This commit is contained in:
godcreator 2024-04-19 15:58:28 +08:00
parent 9edbabb063
commit 6503f3c126
6 changed files with 57 additions and 5 deletions

View File

@ -22,7 +22,7 @@ void resetBaseFSM(FSM *pFSM)
static inline void setEvent(FSM* pFSM){
assert(pFSM->vtbl.selectEvent);
pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data);
pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data, pFSM->signals);
if(0 == pFSM->privateVars.numChild){
return;
@ -114,6 +114,7 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
.setupHandler = NULL,
.initData = NULL,
.initDataLoader = NULL,
.initSignals = NULL,
};
pFSM->vtbl = vtbl;
@ -125,10 +126,12 @@ void constructFSM(FSM* pFSM){
assert(pFSM->vtbl.setupHandler);
assert(pFSM->vtbl.initData);
assert(pFSM->vtbl.initDataLoader);
assert(pFSM->vtbl.initSignals);
pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns);
pFSM->vtbl.initData(pFSM);
pFSM->vtbl.initDataLoader(pFSM);
pFSM->vtbl.initSignals(pFSM);
}
@ -158,6 +161,10 @@ const void *_getData(FSM* pFSM){
return (const void *)pFSM->data;
}
void *_getSignals(FSM* pFSM){
return pFSM->signals;
}
void *_preloadIn(FSM *pFSM){
return pFSM->privateVars.preloader.in;

View File

@ -32,7 +32,7 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
typedef int (*Avoid_WARNING_SelectEvent)(void *data);
typedef int (*Avoid_WARNING_SelectEvent)(void *data, void *signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
@ -94,6 +94,7 @@ typedef struct _FSM
// protected
void *data;
void *signals;
} FSM;

View File

@ -17,10 +17,11 @@ typedef struct _FSMHandler FSMHandler;
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
typedef struct _FSMVtbl {
// 状态机控制
int (*selectEvent)(void *data); // 可以认为是纯虚函数, 子类必须重新实现
int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*initData)(FSM *pFSM); // 子类必须重新实现
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
}FSMVtbl;
@ -31,7 +32,9 @@ int getFSMCurEvent(FSM *pFSM);
void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index);
/* ------------------------------ Data和Signals ------------------------------ */
const void *_getData(FSM* pFSM);
void *_getSignals(FSM* pFSM);
/* ---------------------------------- 预装载器 ---------------------------------- */
void *_preloadIn(FSM *pFSM);

View File

@ -19,7 +19,14 @@ int main(){
int ovflag = GetPreloaderOverFlag(pFSM);
printf("%d, 溢出情况:%d" ,i, ovflag);
if(i == 10){
TemplateFSM_Signals(pFSM)->signalA = 1;
}
if(i == 12){
TemplateFSM_Signals(pFSM)->signalB = 1;
}
printf("%d, " ,i);
Step(pFSM);
printf("\n");

View File

@ -21,9 +21,21 @@ static Event ceventArr[20] = {
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
};
static Event selectEvent(TemplateFSMData *data){ // 必须重新实现
static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现
if(signals->signalA){
signals->signalA = 0;
return E2D;
}
if(signals->signalB){
signals->signalB = 0;
return D2E;
}
return ceventArr[data->in.arrindex];
}
@ -47,6 +59,18 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.data = data;
}
static void initSignals(TemplateFSM *pFSM){
TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals));
TemplateFSMSignals tempSignals = {
.signalA = 0,
.signalB = 0,
};
*signals = tempSignals;
pFSM->base.signals = signals;
}
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn));
pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn);
@ -82,6 +106,7 @@ TemplateFSM *createTemplateFSM(){
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;

View File

@ -3,6 +3,7 @@
#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM))
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
typedef struct _templateFSMIn
{
@ -10,6 +11,12 @@ typedef struct _templateFSMIn
int x;
}TemplateFSMIn;
typedef struct _templateFSMSignals
{
int signalA;
int signalB;
}TemplateFSMSignals;
typedef struct _templateFSMData
{
TemplateFSMIn in;
@ -17,6 +24,8 @@ typedef struct _templateFSMData
int inner1;
}TemplateFSMData;
typedef struct _TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM();