Merge branch 'feature/改信号的实现逻辑' into develop
This commit is contained in:
commit
1bb48779ae
|
@ -6,7 +6,7 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
|
|||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
||||
|
||||
|
||||
set(keytest 789)
|
||||
#set(keytest 789)
|
||||
# set(child_parent 789)
|
||||
if(DEFINED keytest)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
||||
|
|
|
@ -13,7 +13,8 @@
|
|||
static inline void setNextState(FSM* pFSM){
|
||||
int curState = pFSM->privateVars.curState;
|
||||
if(curState != 0){
|
||||
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -35,9 +36,9 @@ static inline void preload(FSM* pFSM){
|
|||
}
|
||||
}
|
||||
|
||||
static inline void resetSignals(FSM *pFSM){
|
||||
memset(pFSM->signals, 0, pFSM->signalSize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* protected */
|
||||
|
@ -46,7 +47,7 @@ void stepBaseFSM(FSM *pFSM)
|
|||
{
|
||||
preload(pFSM);
|
||||
setNextState(pFSM);
|
||||
resetSignals(pFSM);
|
||||
pFSM->pureVtbl.resetSignals(&pFSM->signals);
|
||||
|
||||
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
||||
int curState = pFSM->privateVars.curState;
|
||||
|
@ -122,11 +123,10 @@ const void *_getData(FSM* pFSM){
|
|||
return (const void *)pFSM->data;
|
||||
}
|
||||
|
||||
void *_getSignals(FSM* pFSM){
|
||||
return pFSM->signals;
|
||||
void _setSignal(FSM *pFSM, Uint16 signalFlag){
|
||||
pFSM->signals.all |= (1 << signalFlag);
|
||||
}
|
||||
|
||||
|
||||
void *_preloadIn(FSM *pFSM){
|
||||
return pFSM->privateVars.preloader.shadowData;
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ FSM* newBaseFSM(int numState, int defaultState){
|
|||
typedef void (*StateFuncPtr)(void *);
|
||||
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
||||
typedef int (*TransitionFuncPtr)(void *, int *);
|
||||
typedef int (*SelectNextStateFcnPtr)(void *, void *);
|
||||
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
|
||||
|
||||
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||
pFSM->privateVars.numState = numState;
|
||||
|
@ -182,6 +182,7 @@ FSM* newBaseFSM(int numState, int defaultState){
|
|||
.initData = NULL,
|
||||
.initDataLoader = NULL,
|
||||
.initSignals = NULL,
|
||||
.resetSignals = NULL,
|
||||
};
|
||||
pFSM->pureVtbl = pureVtbl;
|
||||
|
||||
|
@ -196,12 +197,10 @@ void constructFSM(FSM* pFSM){
|
|||
assert(pFSM->pureVtbl.setupHandler);
|
||||
assert(pFSM->pureVtbl.initData);
|
||||
assert(pFSM->pureVtbl.initDataLoader);
|
||||
assert(pFSM->pureVtbl.initSignals);
|
||||
|
||||
pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns);
|
||||
pFSM->pureVtbl.initData(pFSM);
|
||||
pFSM->pureVtbl.initDataLoader(pFSM);
|
||||
pFSM->pureVtbl.initSignals(pFSM);
|
||||
|
||||
|
||||
/* ---------------------------------- 检查状态表 --------------------------------- */
|
||||
|
|
|
@ -34,12 +34,14 @@
|
|||
|
||||
typedef struct _FSMHandler FSMHandler;
|
||||
typedef struct _FSM FSM;
|
||||
typedef struct _FSMSignals FSMSignals;
|
||||
|
||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
||||
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
|
||||
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
|
||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
|
||||
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
|
||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
|
||||
typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals);
|
||||
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
|
||||
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
||||
|
||||
|
||||
|
@ -48,7 +50,7 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
|||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
typedef struct _FSMHandler{
|
||||
int (**selectNextState)(void *data, void *signals);
|
||||
int (**selectNextState)(void *data, FSMSignals* signals);
|
||||
|
||||
void (**transitionTable)(void *data);
|
||||
void (*transitionGeneralAction)(void *data);
|
||||
|
@ -88,7 +90,12 @@ typedef struct _FSMPrivateVars
|
|||
}FMSPrivateVars;
|
||||
|
||||
|
||||
|
||||
#define Idle_Signal 16
|
||||
typedef struct _FSMSignals
|
||||
{
|
||||
Uint16 all;
|
||||
Uint16 lastTriggeredSignal;
|
||||
}FSMSignals;
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
||||
|
@ -97,11 +104,16 @@ typedef struct _FSMPureVtbl {
|
|||
// 状态机控制
|
||||
void (*initData)(FSM *pFSM); // =0子类必须重新实现
|
||||
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
|
||||
void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现
|
||||
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
|
||||
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
|
||||
}FSMPureVtbl;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 基类定义,纯虚类 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
@ -115,8 +127,7 @@ typedef struct _FSM
|
|||
FSMPureVtbl pureVtbl;
|
||||
|
||||
void *data;
|
||||
void *signals;
|
||||
int signalSize;
|
||||
FSMSignals signals;
|
||||
// private
|
||||
FMSPrivateVars privateVars;
|
||||
} FSM;
|
||||
|
@ -132,4 +143,15 @@ FSM* newBaseFSM(int numState, int defaultState);
|
|||
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
|
||||
|
|
|
@ -2,23 +2,29 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 18:52:14
|
||||
* @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
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
#ifndef __FSM_PUBLIC_H_
|
||||
#define __FSM_PUBLIC_H_
|
||||
|
||||
typedef unsigned short Uint16;
|
||||
typedef unsigned long Uint32;
|
||||
|
||||
#define BASE_FSM(ptr) ((FSM *)(ptr))
|
||||
#define BASE_PTR (FSM *)
|
||||
|
||||
typedef struct _FSM FSM;
|
||||
|
||||
/* -------------------------------- 避免警告的函数定义 ------------------------------- */
|
||||
#define Step(pFSM) _stepFSM((FSM *)pFSM)
|
||||
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
|
||||
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
|
||||
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
|
||||
#define GetData(pFSM) _getData((FSM*)pFSM)
|
||||
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal)
|
||||
|
||||
|
||||
|
||||
void _stepFSM(FSM *pFSM);
|
||||
|
@ -30,7 +36,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index);
|
|||
|
||||
/* ------------------------------ Data和Signals ------------------------------ */
|
||||
const void *_getData(FSM* pFSM);
|
||||
void *_getSignals(FSM* pFSM);
|
||||
void _setSignal(FSM *pFSM, Uint16 signalFlag);
|
||||
|
||||
/* ---------------------------------- 预装载器 ---------------------------------- */
|
||||
void *_preloadIn(FSM *pFSM);
|
||||
|
|
|
@ -26,7 +26,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
|
|||
|
||||
pFSM->base.data = data;
|
||||
|
||||
pFSM->base.signals = &data->out;
|
||||
pFSM->base.signalRegs = &data->out;
|
||||
}
|
||||
|
||||
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 18:52:14
|
||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||
* @LastEditTime: 2024-04-20 20:26:40
|
||||
* @LastEditTime: 2024-04-23 21:50:59
|
||||
* @FilePath: \vscode\FSM_OOP\template\main.c
|
||||
* @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;
|
||||
PreloaderGetReady(pFSM);
|
||||
|
||||
const TemplateFSMData* data = GetData(pFSM);
|
||||
|
||||
int ovflag = GetPreloaderOverFlag(pFSM);
|
||||
|
||||
if(i == 3){
|
||||
TemplateFSM_Signals(pFSM)->signalA = 1;
|
||||
SetSignal(pFSM, Signal_A);
|
||||
}
|
||||
if(i == 4){
|
||||
TemplateFSM_Signals(pFSM)->signalA = 1;
|
||||
SetSignal(pFSM, Signal_A);
|
||||
}
|
||||
|
||||
printf("%d, " ,i);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 20:08:03
|
||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||
* @LastEditTime: 2024-04-23 19:30:13
|
||||
* @LastEditTime: 2024-04-23 22:08:11
|
||||
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
|
@ -40,12 +40,20 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
|||
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 resetSignals(FSMSignals *signals){ // 必须重新实现
|
||||
|
||||
switch (signals->lastTriggeredSignal)
|
||||
{
|
||||
case Signal_A:
|
||||
clearSignal(signals, Signal_A);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||
|
@ -95,8 +103,8 @@ TemplateFSM *createTemplateFSM(){
|
|||
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||
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.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
|
||||
|
||||
// 调用父类构造函数
|
||||
constructFSM((FSM *)pFSM);
|
||||
|
|
|
@ -9,11 +9,12 @@
|
|||
/* -------------------------------------------------------------------------- */
|
||||
/* 自定义数据和信号 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
typedef struct _templateFSMSignals
|
||||
{
|
||||
int signalA;
|
||||
int signalB;
|
||||
}TemplateFSMSignals;
|
||||
enum TemplateFSMSignals{
|
||||
Signal_A = 0,
|
||||
Signal_B,
|
||||
|
||||
};
|
||||
|
||||
|
||||
typedef struct _templateFSMExternalData
|
||||
{
|
||||
|
@ -31,7 +32,6 @@ typedef struct _templateFSMInnerData
|
|||
/* 下面的改个名字就行了 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM))
|
||||
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
|
||||
|
||||
typedef struct _templateFSMData
|
||||
{
|
||||
|
@ -42,6 +42,7 @@ typedef struct _templateFSMData
|
|||
typedef struct _TemplateFSM TemplateFSM;
|
||||
TemplateFSM *createTemplateFSM();
|
||||
|
||||
void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -31,15 +31,17 @@ typedef enum _State
|
|||
/* -------------------------------------------------------------------------- */
|
||||
/* 下一个状态选择函数 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
||||
if(signals->signalA){
|
||||
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
|
||||
if(getSignal(signals, Signal_A)){
|
||||
signals->lastTriggeredSignal = Signal_A;
|
||||
return E;
|
||||
}
|
||||
return Idle;
|
||||
}
|
||||
|
||||
static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
||||
if(signals->signalA){
|
||||
static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){
|
||||
if(getSignal(signals, Signal_A)){
|
||||
signals->lastTriggeredSignal = Signal_A;
|
||||
return D;
|
||||
}
|
||||
return Idle;
|
||||
|
|
Loading…
Reference in New Issue