把状态的定义单独拉一个文件,把FSM的privatevars也单列一个文件,这样可以在cla里使用
This commit is contained in:
parent
27acc2bb1b
commit
50b9788e6a
|
@ -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"
|
||||
},
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -16,49 +16,12 @@
|
|||
|
||||
#include <string.h>
|
||||
#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 纯纯空函数
|
||||
|
|
|
@ -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
|
|
@ -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){
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "FSM_protected.h"
|
||||
#include "parentFSM.h"
|
||||
#include "parentFSM_state.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 下一个状态选择函数 */
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "FSM_protected.h"
|
||||
#include "childFSM.h"
|
||||
#include "childFSM_state.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
|
@ -18,22 +19,7 @@ typedef struct ChildFSM
|
|||
FSM base;
|
||||
}ChildFSM;
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 状态定义 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置
|
||||
*
|
||||
*/
|
||||
typedef enum _State
|
||||
{
|
||||
Idle, /**< 必须在开头,并且枚举值=0 */
|
||||
D,
|
||||
E,
|
||||
|
||||
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
||||
} State;
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 下一个状态选择函数 */
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "FSM_protected.h"
|
||||
#include "templateFSM.h"
|
||||
#include "templateFSM_state.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue