信号的清除不是直接全清除,而是根据上一次信号的响应情况清除。因为可能会有中断插入,在清空信号前设置error信号,如果把error信号清除了状态机不会到达故障状态

This commit is contained in:
godcreator02 2024-04-23 21:18:30 +08:00
parent ac7266e5ed
commit 2571447e49
9 changed files with 89 additions and 34 deletions

View File

@ -6,7 +6,7 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
set(keytest 789) #set(keytest 789)
# set(child_parent 789) # set(child_parent 789)
if(DEFINED keytest) if(DEFINED keytest)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)

View File

@ -13,7 +13,7 @@
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->signals); pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signalRegs);
pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState; pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
} }
@ -34,10 +34,6 @@ static inline void preload(FSM* pFSM){
pFSM->privateVars.preloader.isReady = 0; pFSM->privateVars.preloader.isReady = 0;
} }
} }
static inline void resetSignals(FSM *pFSM){
memset(pFSM->signals, 0, pFSM->signalSize);
}
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* protected */ /* protected */
@ -45,8 +41,10 @@ static inline void resetSignals(FSM *pFSM){
void stepBaseFSM(FSM *pFSM) void stepBaseFSM(FSM *pFSM)
{ {
preload(pFSM); preload(pFSM);
pFSM->pureVtbl.setIdleSignal(pFSM->signalRegs);
setNextState(pFSM); setNextState(pFSM);
resetSignals(pFSM); pFSM->pureVtbl.resetSignals(pFSM->signalRegs);
FSMHandler *fcns = &pFSM->privateVars.fcns; FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState; int curState = pFSM->privateVars.curState;
@ -122,8 +120,8 @@ const void *_getData(FSM* pFSM){
return (const void *)pFSM->data; return (const void *)pFSM->data;
} }
void *_getSignals(FSM* pFSM){ void *_getSignalRegs(FSM* pFSM){
return pFSM->signals; return pFSM->signalRegs;
} }
@ -182,6 +180,8 @@ FSM* newBaseFSM(int numState, int defaultState){
.initData = NULL, .initData = NULL,
.initDataLoader = NULL, .initDataLoader = NULL,
.initSignals = NULL, .initSignals = NULL,
.resetSignals = NULL,
.setIdleSignal = NULL,
}; };
pFSM->pureVtbl = pureVtbl; pFSM->pureVtbl = pureVtbl;

View File

@ -39,7 +39,8 @@ 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 int (*Avoid_WARNING_SelectNextState)(void *data, void *signals); typedef void (*Avoid_WARNING_ResetSignals_Fcns)(void *);
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signal, unsigned int *);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
@ -48,7 +49,7 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
typedef struct _FSMHandler{ typedef struct _FSMHandler{
int (**selectNextState)(void *data, void *signals); int (**selectNextState)(void *data, void *signal);
void (**transitionTable)(void *data); void (**transitionTable)(void *data);
void (*transitionGeneralAction)(void *data); void (*transitionGeneralAction)(void *data);
@ -97,6 +98,8 @@ 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 (*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;
@ -115,8 +118,7 @@ typedef struct _FSM
FSMPureVtbl pureVtbl; FSMPureVtbl pureVtbl;
void *data; void *data;
void *signals; void *signalRegs;
int signalSize;
// private // private
FMSPrivateVars privateVars; FMSPrivateVars privateVars;
} FSM; } FSM;

View File

@ -30,7 +30,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index);
/* ------------------------------ Data和Signals ------------------------------ */ /* ------------------------------ Data和Signals ------------------------------ */
const void *_getData(FSM* pFSM); const void *_getData(FSM* pFSM);
void *_getSignals(FSM* pFSM); void *_getSignalRegs(FSM* pFSM);
/* ---------------------------------- 预装载器 ---------------------------------- */ /* ---------------------------------- 预装载器 ---------------------------------- */
void *_preloadIn(FSM *pFSM); void *_preloadIn(FSM *pFSM);

View File

@ -26,7 +26,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
pFSM->base.data = data; pFSM->base.data = data;
pFSM->base.signals = &data->out; pFSM->base.signalRegs = &data->out;
} }
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 static void initDataLoader(KeyFSM *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-20 20:26:40 * @LastEditTime: 2024-04-23 21:13:16
* @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
*/ */
@ -23,15 +23,14 @@ int main(){
TemplateFSM_Input(pFSM)->arrindex = i; TemplateFSM_Input(pFSM)->arrindex = i;
PreloaderGetReady(pFSM); PreloaderGetReady(pFSM);
const TemplateFSMData* data = GetData(pFSM);
int ovflag = GetPreloaderOverFlag(pFSM); int ovflag = GetPreloaderOverFlag(pFSM);
if(i == 3){ if(i == 3){
TemplateFSM_Signals(pFSM)->signalA = 1; setTemplateFSMSignals(pFSM, Signal_A);
} }
if(i == 4){ if(i == 4){
TemplateFSM_Signals(pFSM)->signalA = 1; setTemplateFSMSignals(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 19:30:13 * @LastEditTime: 2024-04-23 21:16:03
* @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
*/ */
@ -40,13 +40,33 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData); pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData);
} }
static void initSignals(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals));
pFSM->base.signals = signals;
pFSM->base.signalSize = sizeof(TemplateFSMSignals);
static void initSignals(TemplateFSM *pFSM){ // 必须重新实现
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:
signalRegs->signals.bits.signalA = 0;
break;
default:
break;
}
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(D); addSelectNextStateFcn(D);
@ -96,10 +116,20 @@ TemplateFSM *createTemplateFSM(){
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.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_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

@ -9,11 +9,33 @@
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 自定义数据和信号 */ /* 自定义数据和信号 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
typedef struct _templateFSMSignals enum TemplateFSMSignals{
Signal_A = 0,
Signal_B,
Idle_Signal = 127,
};
struct _templateFSMSignalsBits
{ {
int signalA; unsigned char signalA : 1;
int signalB; unsigned char signalB : 1;
}TemplateFSMSignals;
};
union _templateFSMSignals {
unsigned int all;
struct _templateFSMSignalsBits bits;
};
typedef struct _templateFSMSignalsRegs
{
union _templateFSMSignals signals;
unsigned int lastTriggeredSignal;
}TemplateFSMSignalRegs;
typedef struct _templateFSMExternalData typedef struct _templateFSMExternalData
{ {
@ -31,7 +53,6 @@ typedef struct _templateFSMInnerData
/* 下面的改个名字就行了 */ /* 下面的改个名字就行了 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) #define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM))
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
typedef struct _templateFSMData typedef struct _templateFSMData
{ {
@ -42,6 +63,7 @@ typedef struct _templateFSMData
typedef struct _TemplateFSM TemplateFSM; typedef struct _TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM(); TemplateFSM *createTemplateFSM();
void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal);
#endif #endif

View File

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