diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json index 60ede05..6c47611 100644 --- a/vscode/.vscode/settings.json +++ b/vscode/.vscode/settings.json @@ -37,7 +37,8 @@ "typeinfo": "c", "templatefsm.h": "c", "templatefsm_private.h": "c", - "keyfsm_private.h": "c" + "keyfsm_private.h": "c", + "childfsm_state.h": "c" }, diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index ef1c80d..198660d 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -7,7 +7,7 @@ aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) # set(keytest 789) -#set(child_parent 789) +set(child_parent 789) if(DEFINED keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 394720f..b0422d3 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -152,7 +152,7 @@ const void *_getData(FSM* pFSM){ return (const void *)pFSM->data; } -void _setSignal(FSM *pFSM, Uint16 signalFlag){ +void _setSignal(FSM *pFSM, unsigned int signalFlag){ pFSM->signals.all |= (1 << signalFlag); } diff --git a/vscode/FSM_OOP/baseFSM/FSM_private.h b/vscode/FSM_OOP/baseFSM/FSM_private.h index 78bc4ba..659c560 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_private.h +++ b/vscode/FSM_OOP/baseFSM/FSM_private.h @@ -16,49 +16,12 @@ #include #include "FSM_protected.h" +#include "FSM_private_vars.h" typedef struct FSMHandler FSMHandler; typedef struct FSM FSM; typedef struct FSMSignals FSMSignals; -/* -------------------------------------------------------------------------- */ -/* private数据类型 */ -/* -------------------------------------------------------------------------- */ -/** - * @brief - * @deprecated 预装载器弃用 - * - */ -typedef struct FSMDataLoader -{ - void *shadowData; - int isReady; - int isOverflow; - size_t size; -}FSMDataLoader; - - -/** - * @brief 基类状态机的私有变量和函数,子类不可直接访问 - * - */ -typedef struct FSMPrivateVars -{ - int numState; /**< 状态数量 */ - int defaultState; /**< Idle状态不能停留,必须指定一个初始状态 */ - - int curState; /**< 当前状态 */ - int nextState; /**< nextState为Idle代表状态机不发生变化 */ - int index; /**< 状态转移函数表对应的标号 */ - - FSMHandler fcns; /**< 状态函数表 */ - - // FSM *childFSM; /**< 限定只能有一个子状态机 */ - FSM **childFSMTable; /**< 每个状态都可配置一个子状态机 */ - - FSMDataLoader preloader; /**< @deprecated 弃用 */ - -}FSMPrivateVars; /** * @brief 纯纯空函数 diff --git a/vscode/FSM_OOP/baseFSM/FSM_private_vars.h b/vscode/FSM_OOP/baseFSM/FSM_private_vars.h new file mode 100644 index 0000000..471370d --- /dev/null +++ b/vscode/FSM_OOP/baseFSM/FSM_private_vars.h @@ -0,0 +1,63 @@ +/** + * @file FSM_private.h + * @author 天神 (dalaoshi@stu.xjtu.edu.cn) + * @brief 状态机框架的私有变量,只能在状态机框架内使用。 + * @details 基类私有变量对子类和外界隐藏实现,通过指针进行访问。 + * @version 2.1 + * @date 2024-05-07 + * + * @copyright 天神创意无限公司 2024 + * + */ + + +#ifndef __FSM_PRIVATE_VARS_H_ +#define __FSM_PRIVATE_VARS_H_ + +#include "FSM_protected.h" + +typedef struct FSMHandler FSMHandler; +typedef struct FSM FSM; +typedef struct FSMSignals FSMSignals; + +/* -------------------------------------------------------------------------- */ +/* private数据类型 */ +/* -------------------------------------------------------------------------- */ +/** + * @brief + * @deprecated 预装载器弃用 + * + */ +typedef struct FSMDataLoader +{ + void *shadowData; + int isReady; + int isOverflow; + unsigned long long size; +}FSMDataLoader; + + +/** + * @brief 基类状态机的私有变量和函数,子类不可直接访问 + * + */ +typedef struct FSMPrivateVars +{ + int numState; /**< 状态数量 */ + int defaultState; /**< Idle状态不能停留,必须指定一个初始状态 */ + + int curState; /**< 当前状态 */ + int nextState; /**< nextState为Idle代表状态机不发生变化 */ + int index; /**< 状态转移函数表对应的标号 */ + + FSMHandler fcns; /**< 状态函数表 */ + + // FSM *childFSM; /**< 限定只能有一个子状态机 */ + FSM **childFSMTable; /**< 每个状态都可配置一个子状态机 */ + + FSMDataLoader preloader; /**< @deprecated 弃用 */ + +}FSMPrivateVars; + + +#endif diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index 2b764f1..cc23630 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -84,8 +84,8 @@ typedef struct FSMHandler{ */ typedef struct FSMSignals { - Uint16 all; /**< 外部信号 */ - Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */ + unsigned int all; /**< 外部信号 */ + unsigned int lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */ }FSMSignals; @@ -141,10 +141,10 @@ void registerChildFSM(FSM *parent, FSM *child, int state); /* -------------------------------------------------------------------------- */ /* 内联函数 */ /* -------------------------------------------------------------------------- */ -static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){ +static inline void clearSignal(FSMSignals *signals, unsigned int signalFlag){ signals->all &= ~(1 << signalFlag); } -static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){ +static inline unsigned int getSignal(FSMSignals *signals, unsigned int signalFlag){ return (signals->all >> signalFlag) & 1; } static inline void clearAllSignals(FSMSignals *signals){ diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h index ad9bfa3..1f84df7 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_public.h +++ b/vscode/FSM_OOP/baseFSM/FSM_public.h @@ -11,8 +11,6 @@ #ifndef __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_ -typedef unsigned int Uint16; -typedef unsigned long Uint32; #define BASE_FSM(ptr) ((FSM *)(ptr)) #define BASE_PTR (FSM *) @@ -45,7 +43,7 @@ int getFSMNextState(FSM *pFSM); /* ------------------------------ Data和Signals ------------------------------ */ const void *_getData(FSM* pFSM); -void _setSignal(FSM *pFSM, Uint16 signalFlag); +void _setSignal(FSM *pFSM, unsigned int signalFlag); /* ---------------------------------- 预装载器 ---------------------------------- */ void *_preloadIn(FSM *pFSM); diff --git a/vscode/FSM_OOP/childtest/ParentFSM_private.h b/vscode/FSM_OOP/childtest/ParentFSM_private.h index 6deaf75..a1b82ba 100644 --- a/vscode/FSM_OOP/childtest/ParentFSM_private.h +++ b/vscode/FSM_OOP/childtest/ParentFSM_private.h @@ -7,6 +7,7 @@ #include "FSM_protected.h" #include "parentFSM.h" +#include "parentFSM_state.h" #include @@ -18,23 +19,6 @@ typedef struct ParentFSM FSM base; }ParentFSM; -/* -------------------------------------------------------------------------- */ -/* 状态定义 */ -/* -------------------------------------------------------------------------- */ - -/** - * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 - * - */ -typedef enum _State -{ - Idle, /**< 必须在开头,并且枚举值=0,表示空状态 */ - A, - B, - C, - - Count_State, /**< 必须在结尾,用来统计状态数量 */ -} State; /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ diff --git a/vscode/FSM_OOP/childtest/childFSM_private.h b/vscode/FSM_OOP/childtest/childFSM_private.h index 4d43a79..2428b92 100644 --- a/vscode/FSM_OOP/childtest/childFSM_private.h +++ b/vscode/FSM_OOP/childtest/childFSM_private.h @@ -7,6 +7,7 @@ #include "FSM_protected.h" #include "childFSM.h" +#include "childFSM_state.h" #include @@ -18,22 +19,7 @@ typedef struct ChildFSM FSM base; }ChildFSM; -/* -------------------------------------------------------------------------- */ -/* 状态定义 */ -/* -------------------------------------------------------------------------- */ -/** - * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 - * - */ -typedef enum _State -{ - Idle, /**< 必须在开头,并且枚举值=0 */ - D, - E, - - Count_State, /**< 必须在结尾,用来统计状态数量 */ -} State; /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ diff --git a/vscode/FSM_OOP/childtest/childFSM_state.h b/vscode/FSM_OOP/childtest/childFSM_state.h new file mode 100644 index 0000000..6ffed70 --- /dev/null +++ b/vscode/FSM_OOP/childtest/childFSM_state.h @@ -0,0 +1,22 @@ +#ifndef __CHILD_FSM_STATE_H_ +#define __CHILD_FSM_STATE_H_ + + +/* -------------------------------------------------------------------------- */ +/* 状态定义 */ +/* -------------------------------------------------------------------------- */ + +/** + * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 + * + */ +typedef enum _State +{ + Idle, /**< 必须在开头,并且枚举值=0 */ + D, + E, + + Count_State, /**< 必须在结尾,用来统计状态数量 */ +} State; + +#endif diff --git a/vscode/FSM_OOP/childtest/parentFSM_state.h b/vscode/FSM_OOP/childtest/parentFSM_state.h new file mode 100644 index 0000000..b25ea12 --- /dev/null +++ b/vscode/FSM_OOP/childtest/parentFSM_state.h @@ -0,0 +1,24 @@ +#ifndef __PARENT_FSM_STATE_H_ +#define __PARENT_FSM_STATE_H_ + + +/* -------------------------------------------------------------------------- */ +/* 状态定义 */ +/* -------------------------------------------------------------------------- */ + +/** + * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 + * + */ +typedef enum _State +{ + Idle, /**< 必须在开头,并且枚举值=0,表示空状态 */ + A, + B, + C, + + Count_State, /**< 必须在结尾,用来统计状态数量 */ +} State; + + +#endif diff --git a/vscode/FSM_OOP/template/templateFSM_private.h b/vscode/FSM_OOP/template/templateFSM_private.h index c2b0444..8738e43 100644 --- a/vscode/FSM_OOP/template/templateFSM_private.h +++ b/vscode/FSM_OOP/template/templateFSM_private.h @@ -17,6 +17,7 @@ #include "FSM_protected.h" #include "templateFSM.h" +#include "templateFSM_state.h" #include /* -------------------------------------------------------------------------- */ @@ -34,22 +35,7 @@ typedef struct TemplateFSM FSM base; }TemplateFSM; -/* -------------------------------------------------------------------------- */ -/* 状态定义 */ -/* -------------------------------------------------------------------------- */ -/** - * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 - * - */ -typedef enum _State -{ - Idle, /**< 必须在开头,并且枚举值=0 */ - D, - E, - - Count_State, /**< 必须在结尾,用来统计状态数量 */ -} State; /* -------------------------------------------------------------------------- */ @@ -119,7 +105,7 @@ static void actionFcn(exit, E)() /* -------------------------------------------------------------------------- */ /* 转移函数 */ /* -------------------------------------------------------------------------- */ -static void transitionGeneralAction(FSM pFSM){ +static void transitionGeneralAction(FSM *pFSM){ FSM_LOG("general"); } diff --git a/vscode/FSM_OOP/template/templateFSM_state.h b/vscode/FSM_OOP/template/templateFSM_state.h new file mode 100644 index 0000000..e3804ba --- /dev/null +++ b/vscode/FSM_OOP/template/templateFSM_state.h @@ -0,0 +1,22 @@ +#ifndef __TEMPLATE_FSM_STATE_H_ +#define __TEMPLATE_FSM_STATE_H_ + + +/* -------------------------------------------------------------------------- */ +/* 状态定义 */ +/* -------------------------------------------------------------------------- */ + +/** + * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 + * + */ +typedef enum _State +{ + Idle, /**< 必须在开头,并且枚举值=0 */ + D, + E, + + Count_State, /**< 必须在结尾,用来统计状态数量 */ +} State; + +#endif