把信号集成到FSM内部,不在子类里声明了

This commit is contained in:
godcreator02 2024-04-23 22:09:53 +08:00
parent 2571447e49
commit 99dd52db30
7 changed files with 62 additions and 80 deletions

View File

@ -13,7 +13,8 @@
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){ if(curState != 0){
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signalRegs); pFSM->signals.lastTriggeredSignal = Idle_Signal;
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, &pFSM->signals);
pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
} }
@ -35,16 +36,18 @@ static inline void preload(FSM* pFSM){
} }
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* protected */ /* protected */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
void stepBaseFSM(FSM *pFSM) void stepBaseFSM(FSM *pFSM)
{ {
preload(pFSM); preload(pFSM);
pFSM->pureVtbl.setIdleSignal(pFSM->signalRegs);
setNextState(pFSM); setNextState(pFSM);
pFSM->pureVtbl.resetSignals(pFSM->signalRegs); pFSM->pureVtbl.resetSignals(&pFSM->signals);
FSMHandler *fcns = &pFSM->privateVars.fcns; FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState; int curState = pFSM->privateVars.curState;
@ -120,11 +123,10 @@ const void *_getData(FSM* pFSM){
return (const void *)pFSM->data; return (const void *)pFSM->data;
} }
void *_getSignalRegs(FSM* pFSM){ void _setSignal(FSM *pFSM, Uint16 signalFlag){
return pFSM->signalRegs; pFSM->signals.all |= (1 << signalFlag);
} }
void *_preloadIn(FSM *pFSM){ void *_preloadIn(FSM *pFSM){
return pFSM->privateVars.preloader.shadowData; return pFSM->privateVars.preloader.shadowData;
} }
@ -154,7 +156,7 @@ FSM* newBaseFSM(int numState, int defaultState){
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 *, void *); typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
FSM *pFSM = calloc(1, sizeof(FSM)); FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars.numState = numState; pFSM->privateVars.numState = numState;
@ -181,7 +183,6 @@ FSM* newBaseFSM(int numState, int defaultState){
.initDataLoader = NULL, .initDataLoader = NULL,
.initSignals = NULL, .initSignals = NULL,
.resetSignals = NULL, .resetSignals = NULL,
.setIdleSignal = NULL,
}; };
pFSM->pureVtbl = pureVtbl; pFSM->pureVtbl = pureVtbl;
@ -196,12 +197,10 @@ void constructFSM(FSM* pFSM){
assert(pFSM->pureVtbl.setupHandler); assert(pFSM->pureVtbl.setupHandler);
assert(pFSM->pureVtbl.initData); assert(pFSM->pureVtbl.initData);
assert(pFSM->pureVtbl.initDataLoader); assert(pFSM->pureVtbl.initDataLoader);
assert(pFSM->pureVtbl.initSignals);
pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns); pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns);
pFSM->pureVtbl.initData(pFSM); pFSM->pureVtbl.initData(pFSM);
pFSM->pureVtbl.initDataLoader(pFSM); pFSM->pureVtbl.initDataLoader(pFSM);
pFSM->pureVtbl.initSignals(pFSM);
/* ---------------------------------- 检查状态表 --------------------------------- */ /* ---------------------------------- 检查状态表 --------------------------------- */

View File

@ -34,13 +34,14 @@
typedef struct _FSMHandler FSMHandler; typedef struct _FSMHandler FSMHandler;
typedef struct _FSM FSM; typedef struct _FSM FSM;
typedef struct _FSMSignals FSMSignals;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_General_Handlers)(void *data); typedef void (*Avoid_WARNING_General_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data); typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
typedef void (*Avoid_WARNING_ResetSignals_Fcns)(void *); typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals);
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signal, unsigned int *); typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
@ -49,7 +50,7 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
typedef struct _FSMHandler{ typedef struct _FSMHandler{
int (**selectNextState)(void *data, void *signal); int (**selectNextState)(void *data, FSMSignals* signals);
void (**transitionTable)(void *data); void (**transitionTable)(void *data);
void (*transitionGeneralAction)(void *data); void (*transitionGeneralAction)(void *data);
@ -89,7 +90,12 @@ typedef struct _FSMPrivateVars
}FMSPrivateVars; }FMSPrivateVars;
#define Idle_Signal 16
typedef struct _FSMSignals
{
Uint16 all;
Uint16 lastTriggeredSignal;
}FSMSignals;
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */ /* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
@ -98,13 +104,16 @@ typedef struct _FSMPureVtbl {
// 状态机控制 // 状态机控制
void (*initData)(FSM *pFSM); // =0子类必须重新实现 void (*initData)(FSM *pFSM); // =0子类必须重新实现
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
void (*resetSignals)(void *signalRegs); // =0子类必须重新实现 void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现
void (*setIdleSignal)(void *signalRegs); // =0子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
}FSMPureVtbl; }FSMPureVtbl;
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 基类定义,纯虚类 */ /* 基类定义,纯虚类 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -118,7 +127,7 @@ typedef struct _FSM
FSMPureVtbl pureVtbl; FSMPureVtbl pureVtbl;
void *data; void *data;
void *signalRegs; FSMSignals signals;
// private // private
FMSPrivateVars privateVars; FMSPrivateVars privateVars;
} FSM; } FSM;
@ -134,4 +143,15 @@ FSM* newBaseFSM(int numState, int defaultState);
void resetBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM);
/* -------------------------------------------------------------------------- */
/* 内联函数 */
/* -------------------------------------------------------------------------- */
static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){
signals->all &= ~(1 << signalFlag);
}
static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){
return (signals->all >> signalFlag) & 1;
}
#endif #endif

View File

@ -2,23 +2,29 @@
* @Author: godcreator02 qq974980621@gmail.com * @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 18:52:14 * @Date: 2024-04-20 18:52:14
* @LastEditors: godcreator02 qq974980621@gmail.com * @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 19:34:34 * @LastEditTime: 2024-04-23 21:51:55
* @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h * @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
#ifndef __FSM_PUBLIC_H_ #ifndef __FSM_PUBLIC_H_
#define __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_
typedef unsigned short Uint16;
typedef unsigned long Uint32;
#define BASE_FSM(ptr) ((FSM *)(ptr)) #define BASE_FSM(ptr) ((FSM *)(ptr))
#define BASE_PTR (FSM *) #define BASE_PTR (FSM *)
typedef struct _FSM FSM; typedef struct _FSM FSM;
/* -------------------------------- 避免警告的函数定义 ------------------------------- */
#define Step(pFSM) _stepFSM((FSM *)pFSM) #define Step(pFSM) _stepFSM((FSM *)pFSM)
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); #define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) #define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) #define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
#define GetData(pFSM) _getData((FSM*)pFSM) #define GetData(pFSM) _getData((FSM*)pFSM)
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal)
void _stepFSM(FSM *pFSM); void _stepFSM(FSM *pFSM);
@ -30,7 +36,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index);
/* ------------------------------ Data和Signals ------------------------------ */ /* ------------------------------ Data和Signals ------------------------------ */
const void *_getData(FSM* pFSM); const void *_getData(FSM* pFSM);
void *_getSignalRegs(FSM* pFSM); void _setSignal(FSM *pFSM, Uint16 signalFlag);
/* ---------------------------------- 预装载器 ---------------------------------- */ /* ---------------------------------- 预装载器 ---------------------------------- */
void *_preloadIn(FSM *pFSM); void *_preloadIn(FSM *pFSM);

View File

@ -2,7 +2,7 @@
* @Author: godcreator02 qq974980621@gmail.com * @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 18:52:14 * @Date: 2024-04-20 18:52:14
* @LastEditors: godcreator02 qq974980621@gmail.com * @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 21:13:16 * @LastEditTime: 2024-04-23 21:50:59
* @FilePath: \vscode\FSM_OOP\template\main.c * @FilePath: \vscode\FSM_OOP\template\main.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -27,10 +27,10 @@ int main(){
int ovflag = GetPreloaderOverFlag(pFSM); int ovflag = GetPreloaderOverFlag(pFSM);
if(i == 3){ if(i == 3){
setTemplateFSMSignals(pFSM, Signal_A); SetSignal(pFSM, Signal_A);
} }
if(i == 4){ if(i == 4){
setTemplateFSMSignals(pFSM, Signal_A); SetSignal(pFSM, Signal_A);
} }
printf("%d, " ,i); printf("%d, " ,i);

View File

@ -2,7 +2,7 @@
* @Author: godcreator02 qq974980621@gmail.com * @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 20:08:03 * @Date: 2024-04-20 20:08:03
* @LastEditors: godcreator02 qq974980621@gmail.com * @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 21:16:03 * @LastEditTime: 2024-04-23 22:08:11
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @FilePath: \vscode\FSM_OOP\template\templateFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -41,24 +41,12 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
} }
static void resetSignals(FSMSignals *signals){ // 必须重新实现
static void initSignals(TemplateFSM *pFSM){ // 必须重新实现 switch (signals->lastTriggeredSignal)
TemplateFSMSignalRegs *signalRegs = (TemplateFSMSignalRegs *)calloc(1, sizeof(TemplateFSMSignalRegs));
pFSM->base.signalRegs = signalRegs;
}
static void setIdleSignal(TemplateFSMSignalRegs *signalRegs){ // 必须重新实现
signalRegs->lastTriggeredSignal = Idle_Signal;
}
static void resetSignals(TemplateFSMSignalRegs *signalRegs){ // 必须重新实现
switch (signalRegs->lastTriggeredSignal)
{ {
case Signal_A: case Signal_A:
signalRegs->signals.bits.signalA = 0; clearSignal(signals, Signal_A);
break; break;
default: default:
@ -115,21 +103,11 @@ TemplateFSM *createTemplateFSM(){
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_ResetSignals_Fcns)setupHandler; pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
pFSM->base.pureVtbl.setIdleSignal = setIdleSignal;
// 调用父类构造函数 // 调用父类构造函数
constructFSM((FSM *)pFSM); constructFSM((FSM *)pFSM);
return pFSM; return pFSM;
}
void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal){
union _templateFSMSignals *signals = &(((TemplateFSMSignalRegs *)(pFSM->base.signalRegs))->signals);
signals->all |= (1 << Signal);
} }

View File

@ -13,30 +13,9 @@ enum TemplateFSMSignals{
Signal_A = 0, Signal_A = 0,
Signal_B, Signal_B,
Idle_Signal = 127,
}; };
struct _templateFSMSignalsBits
{
unsigned char signalA : 1;
unsigned char signalB : 1;
};
union _templateFSMSignals {
unsigned int all;
struct _templateFSMSignalsBits bits;
};
typedef struct _templateFSMSignalsRegs
{
union _templateFSMSignals signals;
unsigned int lastTriggeredSignal;
}TemplateFSMSignalRegs;
typedef struct _templateFSMExternalData typedef struct _templateFSMExternalData
{ {
int arrindex; int arrindex;

View File

@ -31,17 +31,17 @@ typedef enum _State
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */ /* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignalRegs *signalRegs){ static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
if(signalRegs->signals.bits.signalA){ if(getSignal(signals, Signal_A)){
signalRegs->lastTriggeredSignal = Signal_A; signals->lastTriggeredSignal = Signal_A;
return E; return E;
} }
return Idle; return Idle;
} }
static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignalRegs *signalRegs){ static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){
if(signalRegs->signals.bits.signalA){ if(getSignal(signals, Signal_A)){
signalRegs->lastTriggeredSignal = Signal_A; signals->lastTriggeredSignal = Signal_A;
return D; return D;
} }
return Idle; return Idle;