Merge branch 'release/2.1'

This commit is contained in:
godcreator02 2024-04-24 14:38:02 +08:00
commit 0fec2f7f70
14 changed files with 222 additions and 139 deletions

View File

@ -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--;

View File

@ -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"
}, },

View File

@ -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)

View File

@ -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状态只能跳转到默认状态

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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)]);
} }

View File

@ -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");
} }

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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");
} }