把状态的定义单独拉一个文件,把FSM的privatevars也单列一个文件,这样可以在cla里使用
This commit is contained in:
parent
27acc2bb1b
commit
50b9788e6a
|
@ -37,7 +37,8 @@
|
||||||
"typeinfo": "c",
|
"typeinfo": "c",
|
||||||
"templatefsm.h": "c",
|
"templatefsm.h": "c",
|
||||||
"templatefsm_private.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(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)
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)
|
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;
|
return (const void *)pFSM->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setSignal(FSM *pFSM, Uint16 signalFlag){
|
void _setSignal(FSM *pFSM, unsigned int signalFlag){
|
||||||
pFSM->signals.all |= (1 << signalFlag);
|
pFSM->signals.all |= (1 << signalFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,49 +16,12 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
|
#include "FSM_private_vars.h"
|
||||||
|
|
||||||
typedef struct FSMHandler FSMHandler;
|
typedef struct FSMHandler FSMHandler;
|
||||||
typedef struct FSM FSM;
|
typedef struct FSM FSM;
|
||||||
typedef struct FSMSignals FSMSignals;
|
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 纯纯空函数
|
* @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
|
typedef struct FSMSignals
|
||||||
{
|
{
|
||||||
Uint16 all; /**< 外部信号 */
|
unsigned int all; /**< 外部信号 */
|
||||||
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
unsigned int lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
||||||
}FSMSignals;
|
}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);
|
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;
|
return (signals->all >> signalFlag) & 1;
|
||||||
}
|
}
|
||||||
static inline void clearAllSignals(FSMSignals *signals){
|
static inline void clearAllSignals(FSMSignals *signals){
|
||||||
|
|
|
@ -11,8 +11,6 @@
|
||||||
#ifndef __FSM_PUBLIC_H_
|
#ifndef __FSM_PUBLIC_H_
|
||||||
#define __FSM_PUBLIC_H_
|
#define __FSM_PUBLIC_H_
|
||||||
|
|
||||||
typedef unsigned int 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 *)
|
||||||
|
@ -45,7 +43,7 @@ int getFSMNextState(FSM *pFSM);
|
||||||
|
|
||||||
/* ------------------------------ Data和Signals ------------------------------ */
|
/* ------------------------------ Data和Signals ------------------------------ */
|
||||||
const void *_getData(FSM* pFSM);
|
const void *_getData(FSM* pFSM);
|
||||||
void _setSignal(FSM *pFSM, Uint16 signalFlag);
|
void _setSignal(FSM *pFSM, unsigned int signalFlag);
|
||||||
|
|
||||||
/* ---------------------------------- 预装载器 ---------------------------------- */
|
/* ---------------------------------- 预装载器 ---------------------------------- */
|
||||||
void *_preloadIn(FSM *pFSM);
|
void *_preloadIn(FSM *pFSM);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
#include "parentFSM.h"
|
#include "parentFSM.h"
|
||||||
|
#include "parentFSM_state.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,23 +19,6 @@ typedef struct ParentFSM
|
||||||
FSM base;
|
FSM base;
|
||||||
}ParentFSM;
|
}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 "FSM_protected.h"
|
||||||
#include "childFSM.h"
|
#include "childFSM.h"
|
||||||
|
#include "childFSM_state.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,22 +19,7 @@ typedef struct ChildFSM
|
||||||
FSM base;
|
FSM base;
|
||||||
}ChildFSM;
|
}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 "FSM_protected.h"
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
|
#include "templateFSM_state.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -34,22 +35,7 @@ typedef struct TemplateFSM
|
||||||
FSM base;
|
FSM base;
|
||||||
}TemplateFSM;
|
}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");
|
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