Merge branch 'release/2.1'
This commit is contained in:
commit
0fec2f7f70
|
@ -64,6 +64,7 @@ int isDown = 0;
|
||||||
|
|
||||||
KeyFSM* keyFSM;
|
KeyFSM* keyFSM;
|
||||||
KeyFSMData* data;
|
KeyFSMData* data;
|
||||||
|
KeyIn keystat;
|
||||||
|
|
||||||
void keyFSMTest(){
|
void keyFSMTest(){
|
||||||
keyFSM = createKeyFSM();
|
keyFSM = createKeyFSM();
|
||||||
|
@ -73,16 +74,14 @@ void keyFSMTest(){
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
|
|
||||||
*KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO);
|
keystat = !GPIO_ReadPin(INPUT_GPIO);
|
||||||
PreloaderGetReady(keyFSM);
|
|
||||||
|
|
||||||
|
|
||||||
tic();
|
tic();
|
||||||
Step(keyFSM);
|
Step(keyFSM);
|
||||||
toc(index++);
|
toc(index++);
|
||||||
|
|
||||||
if(data->out != Idle){
|
if(data->internal.out != Idle){
|
||||||
printf("%s\n", keyStr[data->out]);
|
printf("%s\n", keyStr[data->internal.out]);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
index--;
|
index--;
|
||||||
|
|
|
@ -35,7 +35,8 @@
|
||||||
"limits": "c",
|
"limits": "c",
|
||||||
"*.tcc": "c",
|
"*.tcc": "c",
|
||||||
"typeinfo": "c",
|
"typeinfo": "c",
|
||||||
"templatefsm.h": "c"
|
"templatefsm.h": "c",
|
||||||
|
"templatefsm_private.h": "c"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
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->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;
|
pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,18 +36,19 @@ static inline void preload(FSM* pFSM){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void resetSignals(FSM *pFSM){
|
|
||||||
memset(pFSM->signals, 0, pFSM->signalSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* protected */
|
/* protected */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
void stepBaseFSM(FSM *pFSM)
|
void stepBaseFSM(FSM *pFSM)
|
||||||
{
|
{
|
||||||
preload(pFSM);
|
pFSM->pureVtbl.loadExternalData(pFSM->data);
|
||||||
|
// preload(pFSM);
|
||||||
setNextState(pFSM);
|
setNextState(pFSM);
|
||||||
resetSignals(pFSM);
|
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
|
||||||
|
|
||||||
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
||||||
int curState = pFSM->privateVars.curState;
|
int curState = pFSM->privateVars.curState;
|
||||||
|
@ -122,11 +124,10 @@ const void *_getData(FSM* pFSM){
|
||||||
return (const void *)pFSM->data;
|
return (const void *)pFSM->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *_getSignals(FSM* pFSM){
|
void _setSignal(FSM *pFSM, Uint16 signalFlag){
|
||||||
return pFSM->signals;
|
pFSM->signals.external |= (1 << signalFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *_preloadIn(FSM *pFSM){
|
void *_preloadIn(FSM *pFSM){
|
||||||
return pFSM->privateVars.preloader.shadowData;
|
return pFSM->privateVars.preloader.shadowData;
|
||||||
}
|
}
|
||||||
|
@ -156,7 +157,7 @@ FSM* newBaseFSM(int numState, int defaultState){
|
||||||
typedef void (*StateFuncPtr)(void *);
|
typedef void (*StateFuncPtr)(void *);
|
||||||
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
||||||
typedef int (*TransitionFuncPtr)(void *, int *);
|
typedef int (*TransitionFuncPtr)(void *, int *);
|
||||||
typedef int (*SelectNextStateFcnPtr)(void *, void *);
|
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
|
||||||
|
|
||||||
FSM *pFSM = calloc(1, sizeof(FSM));
|
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||||
pFSM->privateVars.numState = numState;
|
pFSM->privateVars.numState = numState;
|
||||||
|
@ -180,8 +181,10 @@ FSM* newBaseFSM(int numState, int defaultState){
|
||||||
FSMPureVtbl pureVtbl = {
|
FSMPureVtbl pureVtbl = {
|
||||||
.setupHandler = NULL,
|
.setupHandler = NULL,
|
||||||
.initData = NULL,
|
.initData = NULL,
|
||||||
|
.loadExternalData = NULL,
|
||||||
.initDataLoader = NULL,
|
.initDataLoader = NULL,
|
||||||
.initSignals = NULL,
|
.initSignals = NULL,
|
||||||
|
.resetSignals = NULL,
|
||||||
};
|
};
|
||||||
pFSM->pureVtbl = pureVtbl;
|
pFSM->pureVtbl = pureVtbl;
|
||||||
|
|
||||||
|
@ -196,13 +199,10 @@ void constructFSM(FSM* pFSM){
|
||||||
assert(pFSM->pureVtbl.setupHandler);
|
assert(pFSM->pureVtbl.setupHandler);
|
||||||
assert(pFSM->pureVtbl.initData);
|
assert(pFSM->pureVtbl.initData);
|
||||||
assert(pFSM->pureVtbl.initDataLoader);
|
assert(pFSM->pureVtbl.initDataLoader);
|
||||||
assert(pFSM->pureVtbl.initSignals);
|
|
||||||
|
|
||||||
pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns);
|
pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns);
|
||||||
pFSM->pureVtbl.initData(pFSM);
|
pFSM->pureVtbl.initData(pFSM);
|
||||||
pFSM->pureVtbl.initDataLoader(pFSM);
|
pFSM->pureVtbl.initDataLoader(pFSM);
|
||||||
pFSM->pureVtbl.initSignals(pFSM);
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------------- 检查状态表 --------------------------------- */
|
/* ---------------------------------- 检查状态表 --------------------------------- */
|
||||||
for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态,Idle状态只能跳转到默认状态
|
for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态,Idle状态只能跳转到默认状态
|
||||||
|
|
|
@ -34,12 +34,15 @@
|
||||||
|
|
||||||
typedef struct _FSMHandler FSMHandler;
|
typedef struct _FSMHandler FSMHandler;
|
||||||
typedef struct _FSM FSM;
|
typedef struct _FSM FSM;
|
||||||
|
typedef struct _FSMSignals FSMSignals;
|
||||||
|
|
||||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
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)(FSMSignals* signals, void *);
|
||||||
|
typedef void (*Avoid_WARNING_loadData_Fcns)(void*);
|
||||||
|
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
|
||||||
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,7 +51,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, FSMSignals* signals);
|
||||||
|
|
||||||
void (**transitionTable)(void *data);
|
void (**transitionTable)(void *data);
|
||||||
void (*transitionGeneralAction)(void *data);
|
void (*transitionGeneralAction)(void *data);
|
||||||
|
@ -88,20 +91,31 @@ typedef struct _FSMPrivateVars
|
||||||
}FMSPrivateVars;
|
}FMSPrivateVars;
|
||||||
|
|
||||||
|
|
||||||
|
#define Idle_Signal 16
|
||||||
|
typedef struct _FSMSignals
|
||||||
|
{
|
||||||
|
Uint16 external;
|
||||||
|
Uint16 lastTriggeredSignal;
|
||||||
|
}FSMSignals;
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
typedef struct _FSMPureVtbl {
|
typedef struct _FSMPureVtbl {
|
||||||
// 状态机控制
|
// 状态机控制
|
||||||
void (*initData)(FSM *pFSM); // =0子类必须重新实现
|
|
||||||
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
|
|
||||||
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
|
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
|
||||||
|
|
||||||
|
void (*initData)(FSM *pFSM); // =0子类必须重新实现
|
||||||
|
void (*loadExternalData)(void *extData); // =0子类必须重新实现
|
||||||
|
|
||||||
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
|
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
|
||||||
|
|
||||||
|
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
|
||||||
|
void (*resetSignals)(FSMSignals *signalRegs, void *data); // =0子类必须重新实现
|
||||||
}FSMPureVtbl;
|
}FSMPureVtbl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 基类定义,纯虚类 */
|
/* 基类定义,纯虚类 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -115,8 +129,7 @@ typedef struct _FSM
|
||||||
FSMPureVtbl pureVtbl;
|
FSMPureVtbl pureVtbl;
|
||||||
|
|
||||||
void *data;
|
void *data;
|
||||||
void *signals;
|
FSMSignals signals;
|
||||||
int signalSize;
|
|
||||||
// private
|
// private
|
||||||
FMSPrivateVars privateVars;
|
FMSPrivateVars privateVars;
|
||||||
} FSM;
|
} FSM;
|
||||||
|
@ -132,4 +145,18 @@ FSM* newBaseFSM(int numState, int defaultState);
|
||||||
void resetBaseFSM(FSM *pFSM);
|
void resetBaseFSM(FSM *pFSM);
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 内联函数 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){
|
||||||
|
signals->external &= ~(1 << signalFlag);
|
||||||
|
}
|
||||||
|
static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){
|
||||||
|
return (signals->external >> signalFlag) & 1;
|
||||||
|
}
|
||||||
|
static inline void clearAllSignals(FSMSignals *signals){
|
||||||
|
signals->external = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,23 +2,29 @@
|
||||||
* @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-23 19:34:34
|
* @LastEditTime: 2024-04-23 21:51:55
|
||||||
* @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h
|
* @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h
|
||||||
* @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
|
||||||
*/
|
*/
|
||||||
#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 *)
|
||||||
|
|
||||||
typedef struct _FSM FSM;
|
typedef struct _FSM FSM;
|
||||||
|
|
||||||
|
/* -------------------------------- 避免警告的函数定义 ------------------------------- */
|
||||||
#define Step(pFSM) _stepFSM((FSM *)pFSM)
|
#define Step(pFSM) _stepFSM((FSM *)pFSM)
|
||||||
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
|
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
|
||||||
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
|
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
|
||||||
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
|
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
|
||||||
#define GetData(pFSM) _getData((FSM*)pFSM)
|
#define GetData(pFSM) _getData((FSM*)pFSM)
|
||||||
|
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _stepFSM(FSM *pFSM);
|
void _stepFSM(FSM *pFSM);
|
||||||
|
@ -30,7 +36,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 _setSignal(FSM *pFSM, Uint16 signalFlag);
|
||||||
|
|
||||||
/* ---------------------------------- 预装载器 ---------------------------------- */
|
/* ---------------------------------- 预装载器 ---------------------------------- */
|
||||||
void *_preloadIn(FSM *pFSM);
|
void *_preloadIn(FSM *pFSM);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: godcreator02 qq974980621@gmail.com
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
* @Date: 2024-04-20 19:02:11
|
* @Date: 2024-04-20 19:02:11
|
||||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||||
* @LastEditTime: 2024-04-23 19:37:03
|
* @LastEditTime: 2024-04-24 14:10:19
|
||||||
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
|
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.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
|
||||||
*/
|
*/
|
||||||
|
@ -17,26 +17,26 @@
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,允许调用privateVars */
|
/* 纯虚函数,允许调用privateVars */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
static void loadExternalData(KeyFSMData *data){ // 必须重新实现
|
||||||
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
|
data->external.in = keystat;
|
||||||
data->countDelay = 0;
|
|
||||||
data->countMultiDown = 0;
|
|
||||||
data->in = Up;
|
|
||||||
data->out = Idle;
|
|
||||||
|
|
||||||
pFSM->base.data = data;
|
|
||||||
|
|
||||||
pFSM->base.signals = &data->out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现
|
||||||
|
data->internal.out = Idle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
||||||
|
KeyFSMData *data = (KeyFSMData *)calloc(1, sizeof(KeyFSMData));
|
||||||
|
pFSM->base.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
||||||
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn));
|
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn));
|
||||||
pFSM->base.privateVars.preloader.size = sizeof(KeyIn);
|
pFSM->base.privateVars.preloader.size = sizeof(KeyIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initSignals(KeyFSM *pFSM){ // 必须重新实现
|
|
||||||
pFSM->base.signalSize = sizeof(KeyOutSignal);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
|
@ -85,7 +85,7 @@ static void step(KeyFSM* pFSM){
|
||||||
|
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
|
|
||||||
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
|
FSM_LOG("\t信号:%d, 计数%d ",data->internal.out, data->internal.countDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +104,8 @@ KeyFSM *createKeyFSM(){
|
||||||
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
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.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
|
||||||
|
pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData;
|
||||||
|
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
||||||
|
|
|
@ -5,18 +5,18 @@
|
||||||
#define KeyFSM_Input(pFSM) (KeyIn *)_preloadIn((FSM *)pFSM)
|
#define KeyFSM_Input(pFSM) (KeyIn *)_preloadIn((FSM *)pFSM)
|
||||||
|
|
||||||
typedef enum _keyIn{
|
typedef enum _keyIn{
|
||||||
Up,
|
pUp,
|
||||||
pDown,
|
pDown,
|
||||||
}KeyIn;
|
}KeyIn;
|
||||||
|
|
||||||
|
|
||||||
typedef enum _keyOutSignals{
|
typedef enum _keyOut{
|
||||||
Idle,
|
Idle,
|
||||||
Down,
|
Down,
|
||||||
Hold,
|
Hold,
|
||||||
Down_2times,
|
Down_2times,
|
||||||
Down_3times,
|
Down_3times,
|
||||||
}KeyOutSignal;
|
}KeyOut;
|
||||||
|
|
||||||
const static char *keyStr[] =
|
const static char *keyStr[] =
|
||||||
{
|
{
|
||||||
|
@ -27,17 +27,23 @@ const static char *keyStr[] =
|
||||||
"Down_3times",
|
"Down_3times",
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _keyFSMData
|
typedef struct _keyFSMExternalData
|
||||||
{
|
{
|
||||||
/* ----------------------------------- 输入 ----------------------------------- */
|
|
||||||
KeyIn in;
|
KeyIn in;
|
||||||
|
}KeyFSMExternalData;
|
||||||
|
|
||||||
/* ----------------------------------- 输出 ----------------------------------- */
|
typedef struct _keyFSMInternalData
|
||||||
KeyOutSignal out;
|
{
|
||||||
|
|
||||||
/* ---------------------------------- 内部变量 ---------------------------------- */
|
|
||||||
int countDelay;
|
int countDelay;
|
||||||
int countMultiDown;
|
int countMultiDown;
|
||||||
|
KeyOut out;
|
||||||
|
|
||||||
|
}KeyFSMInternalData;
|
||||||
|
|
||||||
|
typedef struct _keyFSMData
|
||||||
|
{
|
||||||
|
KeyFSMExternalData external;
|
||||||
|
KeyFSMInternalData internal;
|
||||||
}KeyFSMData;
|
}KeyFSMData;
|
||||||
|
|
||||||
typedef struct _KeyFSM KeyFSM;
|
typedef struct _KeyFSM KeyFSM;
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
extern KeyIn keystat;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
继承基类
|
继承基类
|
||||||
*/
|
*/
|
||||||
|
@ -40,7 +43,8 @@ typedef enum _State
|
||||||
/* 下一个状态选择函数 */
|
/* 下一个状态选择函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
||||||
if(data->in == Down){
|
|
||||||
|
if(data->external.in == Down){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
return DownDebouncing;
|
return DownDebouncing;
|
||||||
}
|
}
|
||||||
|
@ -48,29 +52,30 @@ static State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
|
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
|
||||||
if(data->in == Up){
|
if(data->external.in == pUp){
|
||||||
FSM_LOG(" 物理按键松开 ");
|
FSM_LOG(" 物理按键松开 ");
|
||||||
return Waiting;
|
return Waiting;
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 5){
|
|
||||||
|
else if(data->internal.countDelay == 5){
|
||||||
return Downing;
|
return Downing;
|
||||||
}
|
}
|
||||||
return Idle_State;
|
return Idle_State;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(Downing)(KeyFSMData *data){
|
static State selectNextStateFcn(Downing)(KeyFSMData *data){
|
||||||
if(data->in == Up){
|
if(data->external.in == pUp){
|
||||||
FSM_LOG(" 物理按键松开 ");
|
FSM_LOG(" 物理按键松开 ");
|
||||||
return UpDebouncing;
|
return UpDebouncing;
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 10){
|
else if(data->internal.countDelay == 10){
|
||||||
return Holding;
|
return Holding;
|
||||||
}
|
}
|
||||||
return Idle_State;
|
return Idle_State;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(Holding)(KeyFSMData *data){
|
static State selectNextStateFcn(Holding)(KeyFSMData *data){
|
||||||
if(data->in == Up){
|
if(data->external.in == pUp){
|
||||||
FSM_LOG(" 物理按键松开 ");
|
FSM_LOG(" 物理按键松开 ");
|
||||||
return HoldUpDebouncing;
|
return HoldUpDebouncing;
|
||||||
}
|
}
|
||||||
|
@ -78,27 +83,27 @@ static State selectNextStateFcn(Holding)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
|
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
|
||||||
if(data->in == Down){
|
if(data->external.in == Down){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
return Holding;
|
return Holding;
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 5){
|
else if(data->internal.countDelay == 5){
|
||||||
return Waiting;
|
return Waiting;
|
||||||
}
|
}
|
||||||
return Idle_State;
|
return Idle_State;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
||||||
if(data->in == Down){
|
if(data->external.in == Down){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
if(data->countMultiDown){
|
if(data->internal.countMultiDown){
|
||||||
return MultiDowning;
|
return MultiDowning;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return Downing;
|
return Downing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 5){
|
else if(data->internal.countDelay == 5){
|
||||||
return MultiDownWaiting;
|
return MultiDownWaiting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,18 +111,18 @@ static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
|
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
|
||||||
if(data->in == Down){
|
if(data->external.in == Down){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
return MultiDownDebouncing;
|
return MultiDownDebouncing;
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 5){
|
else if(data->internal.countDelay == 5){
|
||||||
return Waiting;
|
return Waiting;
|
||||||
}
|
}
|
||||||
return Idle_State;
|
return Idle_State;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
|
static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
|
||||||
if(data->in == Up){
|
if(data->external.in == pUp){
|
||||||
FSM_LOG(" 物理按键松开 ");
|
FSM_LOG(" 物理按键松开 ");
|
||||||
return UpDebouncing;
|
return UpDebouncing;
|
||||||
}
|
}
|
||||||
|
@ -125,11 +130,11 @@ static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
|
static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
|
||||||
if(data->in == Up){
|
if(data->external.in == pUp){
|
||||||
FSM_LOG(" 物理按键松开 ");
|
FSM_LOG(" 物理按键松开 ");
|
||||||
return MultiDownWaiting;
|
return MultiDownWaiting;
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 5){
|
else if(data->internal.countDelay == 5){
|
||||||
return MultiDowning;
|
return MultiDowning;
|
||||||
}
|
}
|
||||||
return Idle_State;
|
return Idle_State;
|
||||||
|
@ -139,51 +144,51 @@ static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
|
||||||
/* 对应的 action, exit, during 函数 */
|
/* 对应的 action, exit, during 函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
static void actionFcn(enter, Waiting)(KeyFSMData* data){
|
static void actionFcn(enter, Waiting)(KeyFSMData* data){
|
||||||
data->out = Idle;
|
data->internal.out = Idle;
|
||||||
data->countDelay = 0;
|
data->internal.countDelay = 0;
|
||||||
data->countMultiDown = 0;
|
data->internal.countMultiDown = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void actionFcn(during, DownDebouncing)(KeyFSMData* data)
|
static void actionFcn(during, DownDebouncing)(KeyFSMData* data)
|
||||||
{
|
{
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
FSM_LOG(" during开启消抖 ");
|
FSM_LOG(" during开启消抖 ");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void actionFcn(during, Downing)(KeyFSMData* data)
|
static void actionFcn(during, Downing)(KeyFSMData* data)
|
||||||
{
|
{
|
||||||
|
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
data->out = Idle;
|
data->internal.out = Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void actionFcn(during, UpDebouncing)(KeyFSMData* data){
|
static void actionFcn(during, UpDebouncing)(KeyFSMData* data){
|
||||||
|
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
FSM_LOG(" during松开消抖 ");
|
FSM_LOG(" during松开消抖 ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void actionFcn(during, Holding)(KeyFSMData* data){
|
static void actionFcn(during, Holding)(KeyFSMData* data){
|
||||||
data->out = Idle;
|
data->internal.out = Idle;
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
if(data->countDelay == 2){
|
if(data->internal.countDelay == 2){
|
||||||
data->out = Hold;
|
data->internal.out = Hold;
|
||||||
data->countDelay = 0;
|
data->internal.countDelay = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void actionFcn(exit, Holding)(KeyFSMData* data){
|
static void actionFcn(exit, Holding)(KeyFSMData* data){
|
||||||
data->out = Idle;
|
data->internal.out = Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){
|
static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
FSM_LOG(" during多击等待 ");
|
FSM_LOG(" during多击等待 ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,13 +196,13 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){
|
||||||
|
|
||||||
static void actionFcn(during, HoldUpDebouncing)(KeyFSMData* data)
|
static void actionFcn(during, HoldUpDebouncing)(KeyFSMData* data)
|
||||||
{
|
{
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
|
static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
|
||||||
{
|
{
|
||||||
data->countDelay++;
|
data->internal.countDelay++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -205,43 +210,43 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
|
||||||
/* 转移函数 */
|
/* 转移函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
void transitionGeneralAction(KeyFSMData *data){
|
void transitionGeneralAction(KeyFSMData *data){
|
||||||
data->countDelay = 0;
|
data->internal.countDelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
|
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
|
||||||
data->out = Down;
|
data->internal.out = Down;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
|
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
|
||||||
data->out = Idle;
|
data->internal.out = Idle;
|
||||||
data->countMultiDown++;
|
data->internal.countMultiDown++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
|
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
|
||||||
switch (data->countMultiDown + 1)
|
switch (data->internal.countMultiDown + 1)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
data->out = Down_2times;
|
data->internal.out = Down_2times;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
data->out = Down_3times;
|
data->internal.out = Down_3times;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("reach MultiDown Limit!\n");
|
printf("reach MultiDown Limit!\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
FSM_LOG(" 多击%d ", data->countMultiDown+1);
|
FSM_LOG(" 多击%d ", data->internal.countMultiDown+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static State transitionHandler(Downing, Holding)(KeyFSMData* data){
|
static State transitionHandler(Downing, Holding)(KeyFSMData* data){
|
||||||
data->out = Hold;
|
data->internal.out = Hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
|
static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
|
||||||
data->countMultiDown = 0;
|
data->internal.countMultiDown = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -265,7 +270,7 @@ const static char *stateStr[] = {
|
||||||
static void printFSM(KeyFSM* pFSM){
|
static void printFSM(KeyFSM* pFSM){
|
||||||
KeyFSMData* data = pFSM->base.data;
|
KeyFSMData* data = pFSM->base.data;
|
||||||
FSM_LOG("KeyFSM: ");
|
FSM_LOG("KeyFSM: ");
|
||||||
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
|
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->internal.countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,18 +7,20 @@
|
||||||
|
|
||||||
|
|
||||||
KeyIn testin[NUM] = {
|
KeyIn testin[NUM] = {
|
||||||
Up,Up,pDown,pDown,Up,
|
pUp,pUp,pDown,pDown,pUp,
|
||||||
pDown,pDown,pDown,pDown,pDown,
|
pDown,pDown,pDown,pDown,pDown,
|
||||||
pDown,pDown,pDown,pDown,pDown,
|
pDown,pDown,pDown,pDown,pDown,
|
||||||
Up,Up,Up,Up,Up,
|
pUp,pUp,pUp,pUp,pUp,
|
||||||
Up,Up,pDown,pDown,pDown,
|
pUp,pUp,pDown,pDown,pDown,
|
||||||
pDown,pDown,pDown,pDown,pDown,
|
pDown,pDown,pDown,pDown,pDown,
|
||||||
pDown,pDown,pDown,pDown,pDown,
|
pDown,pDown,pDown,pDown,pDown,
|
||||||
pDown,pDown,pDown,pDown,pDown,
|
pDown,pDown,pDown,pDown,pDown,
|
||||||
pDown,pDown,pDown,Up,Up,
|
pDown,pDown,pDown,pUp,pUp,
|
||||||
pDown,pDown,pDown,pDown
|
pDown,pDown,pDown,pDown
|
||||||
};
|
};
|
||||||
|
|
||||||
|
KeyIn keystat;
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
|
|
||||||
KeyFSM* keyFSM = createKeyFSM();
|
KeyFSM* keyFSM = createKeyFSM();
|
||||||
|
@ -28,13 +30,12 @@ int main(){
|
||||||
printf("第%d次: ",i+1);
|
printf("第%d次: ",i+1);
|
||||||
const KeyFSMData* data = _getData((FSM *)keyFSM);
|
const KeyFSMData* data = _getData((FSM *)keyFSM);
|
||||||
|
|
||||||
*KeyFSM_Input(keyFSM) = testin[i];
|
keystat = testin[i];
|
||||||
PreloaderGetReady(keyFSM);
|
|
||||||
ClearPreloaderOverFlag(keyFSM);
|
|
||||||
Step(keyFSM);
|
Step(keyFSM);
|
||||||
|
|
||||||
if(data->out){
|
if(data->internal.out){
|
||||||
printf("\t\t\t\t%d", data->out);
|
printf("\t\t\t\t%d", data->internal.out);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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-24 13:17:49
|
||||||
* @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
|
||||||
*/
|
*/
|
||||||
|
@ -13,6 +13,9 @@
|
||||||
|
|
||||||
TemplateFSM *pFSM;
|
TemplateFSM *pFSM;
|
||||||
|
|
||||||
|
int arrindex = 10;
|
||||||
|
int x = 5;
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
|
|
||||||
pFSM = createTemplateFSM();
|
pFSM = createTemplateFSM();
|
||||||
|
@ -23,15 +26,20 @@ 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;
|
SetSignal(pFSM, Signal_A);
|
||||||
}
|
}
|
||||||
if(i == 4){
|
if(i == 4){
|
||||||
TemplateFSM_Signals(pFSM)->signalA = 1;
|
SetSignal(pFSM, Signal_A);
|
||||||
|
}
|
||||||
|
if(i == 8){
|
||||||
|
arrindex = 0;
|
||||||
|
}
|
||||||
|
if(i == 7){
|
||||||
|
x = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%d, " ,i);
|
printf("%d, " ,i);
|
||||||
|
|
|
@ -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-24 14:23:07
|
||||||
* @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
|
||||||
*/
|
*/
|
||||||
|
@ -17,6 +17,27 @@
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,允许调用privateVars */
|
/* 纯虚函数,允许调用privateVars */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static void loadExternalData(TemplateFSMData *data){ // 必须重新实现
|
||||||
|
data->external.arrindex = arrindex;
|
||||||
|
data->external.x = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void resetSignals(FSMSignals *signals, TemplateFSMData *data){ // 必须重新实现
|
||||||
|
|
||||||
|
switch (signals->lastTriggeredSignal)
|
||||||
|
{
|
||||||
|
case Signal_A:
|
||||||
|
clearSignal(signals, Signal_A);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
||||||
|
|
||||||
|
@ -25,7 +46,7 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
.arrindex = 0,
|
.arrindex = 0,
|
||||||
.x = 0,
|
.x = 0,
|
||||||
},
|
},
|
||||||
.inner = {
|
.internal = {
|
||||||
.inner1 = 0,
|
.inner1 = 0,
|
||||||
.y1 = 0,
|
.y1 = 0,
|
||||||
},
|
},
|
||||||
|
@ -40,13 +61,6 @@ 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 setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
addSelectNextStateFcn(D);
|
addSelectNextStateFcn(D);
|
||||||
|
@ -70,7 +84,6 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 其他重新实现的函数,父类已有实现,实现多态 */
|
/* 其他重新实现的函数,父类已有实现,实现多态 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -95,8 +108,9 @@ TemplateFSM *createTemplateFSM(){
|
||||||
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
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.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
|
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
|
||||||
|
pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData;
|
||||||
|
|
||||||
// 调用父类构造函数
|
// 调用父类构造函数
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
|
@ -9,11 +9,12 @@
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 自定义数据和信号 */
|
/* 自定义数据和信号 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
typedef struct _templateFSMSignals
|
enum TemplateFSMSignals{
|
||||||
{
|
Signal_A = 0,
|
||||||
int signalA;
|
Signal_B,
|
||||||
int signalB;
|
|
||||||
}TemplateFSMSignals;
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct _templateFSMExternalData
|
typedef struct _templateFSMExternalData
|
||||||
{
|
{
|
||||||
|
@ -31,17 +32,15 @@ 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
|
||||||
{
|
{
|
||||||
TemplateFSMExternalData external;
|
TemplateFSMExternalData external;
|
||||||
TemplateFSMInnerData inner;
|
TemplateFSMInnerData internal;
|
||||||
}TemplateFSMData;
|
}TemplateFSMData;
|
||||||
|
|
||||||
typedef struct _TemplateFSM TemplateFSM;
|
typedef struct _TemplateFSM TemplateFSM;
|
||||||
TemplateFSM *createTemplateFSM();
|
TemplateFSM *createTemplateFSM();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
#ifndef __TEMPLATE_PRIVATE_FSM_H_
|
#ifdef __TEMPLATE_PRIVATE_FSM_H_
|
||||||
|
#error only include once
|
||||||
|
|
||||||
|
#else
|
||||||
#define __TEMPLATE_PRIVATE_FSM_H_
|
#define __TEMPLATE_PRIVATE_FSM_H_
|
||||||
|
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 用到的外部变量 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern int arrindex;
|
||||||
|
extern int x;
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -31,15 +39,23 @@ typedef enum _State
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下一个状态选择函数 */
|
/* 下一个状态选择函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
|
||||||
if(signals->signalA){
|
if(getSignal(signals, Signal_A)){
|
||||||
|
signals->lastTriggeredSignal = Signal_A;
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
else if(arrindex == 0){
|
||||||
return E;
|
return E;
|
||||||
}
|
}
|
||||||
return Idle;
|
return Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){
|
||||||
if(signals->signalA){
|
if(getSignal(signals, Signal_A)){
|
||||||
|
signals->lastTriggeredSignal = Signal_A;
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
else if(x == 0){
|
||||||
return D;
|
return D;
|
||||||
}
|
}
|
||||||
return Idle;
|
return Idle;
|
||||||
|
@ -81,7 +97,7 @@ static void actionFcn(exit, E)()
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 转移函数 */
|
/* 转移函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
void transitionGeneralAction(TemplateFSMData *data){
|
static void transitionGeneralAction(TemplateFSMData *data){
|
||||||
FSM_LOG("general");
|
FSM_LOG("general");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue