去掉预装载器,keyFSM的输出信号还是放在data里,但是可以在resetSignals里清除。keyFSM和templateFSM均无问题,去掉预装载器后整体运行速度[180,280],比之前快30

This commit is contained in:
godcreator02 2024-04-24 14:25:31 +08:00
parent c9cb5b2cb4
commit 91900ca6d2
11 changed files with 114 additions and 101 deletions

View File

@ -64,6 +64,7 @@ int isDown = 0;
KeyFSM* keyFSM;
KeyFSMData* data;
KeyIn keystat;
void keyFSMTest(){
keyFSM = createKeyFSM();
@ -73,16 +74,14 @@ void keyFSMTest(){
while(1){
*KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO);
PreloaderGetReady(keyFSM);
keystat = !GPIO_ReadPin(INPUT_GPIO);
tic();
Step(keyFSM);
toc(index++);
if(data->out != Idle){
printf("%s\n", keyStr[data->out]);
if(data->internal.out != Idle){
printf("%s\n", keyStr[data->internal.out]);
}
else{
index--;

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)
#set(keytest 789)
# set(keytest 789)
# set(child_parent 789)
if(DEFINED keytest)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)

View File

@ -48,7 +48,7 @@ void stepBaseFSM(FSM *pFSM)
pFSM->pureVtbl.loadExternalData(pFSM->data);
// preload(pFSM);
setNextState(pFSM);
pFSM->pureVtbl.resetSignals(&pFSM->signals);
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState;
@ -125,7 +125,7 @@ const void *_getData(FSM* pFSM){
}
void _setSignal(FSM *pFSM, Uint16 signalFlag){
pFSM->signals.all |= (1 << signalFlag);
pFSM->signals.external |= (1 << signalFlag);
}
void *_preloadIn(FSM *pFSM){
@ -204,7 +204,6 @@ void constructFSM(FSM* pFSM){
pFSM->pureVtbl.initData(pFSM);
pFSM->pureVtbl.initDataLoader(pFSM);
/* ---------------------------------- 检查状态表 --------------------------------- */
for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态Idle状态只能跳转到默认状态
{

View File

@ -40,7 +40,8 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* 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);
@ -93,7 +94,7 @@ typedef struct _FSMPrivateVars
#define Idle_Signal 16
typedef struct _FSMSignals
{
Uint16 all;
Uint16 external;
Uint16 lastTriggeredSignal;
}FSMSignals;
@ -110,7 +111,7 @@ typedef struct _FSMPureVtbl {
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现
void (*resetSignals)(FSMSignals *signalRegs, void *data); // =0子类必须重新实现
}FSMPureVtbl;
@ -148,10 +149,13 @@ void resetBaseFSM(FSM *pFSM);
/* 内联函数 */
/* -------------------------------------------------------------------------- */
static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){
signals->all &= ~(1 << signalFlag);
signals->external &= ~(1 << signalFlag);
}
static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){
return (signals->all >> signalFlag) & 1;
return (signals->external >> signalFlag) & 1;
}
static inline void clearAllSignals(FSMSignals *signals){
signals->external = 0;
}

View File

@ -9,7 +9,7 @@
#ifndef __FSM_PUBLIC_H_
#define __FSM_PUBLIC_H_
typedef unsigned short Uint16;
typedef unsigned int Uint16;
typedef unsigned long Uint32;
#define BASE_FSM(ptr) ((FSM *)(ptr))
@ -46,4 +46,4 @@ void _clearPreloaderOverFlag(FSM *pFSM);
#endif
#endif

View File

@ -2,7 +2,7 @@
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 19:02:11
* @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
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -17,26 +17,26 @@
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
static void initData(KeyFSM *pFSM){ // 必须重新实现
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
data->countDelay = 0;
data->countMultiDown = 0;
data->in = Up;
data->out = Idle;
pFSM->base.data = data;
pFSM->base.signalRegs = &data->out;
static void loadExternalData(KeyFSMData *data){ // 必须重新实现
data->external.in = keystat;
}
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){ // 必须重新实现
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn));
pFSM->base.privateVars.preloader.size = sizeof(KeyIn);
}
static void initSignals(KeyFSM *pFSM){ // 必须重新实现
pFSM->base.signalSize = sizeof(KeyOutSignal);
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
@ -85,7 +85,7 @@ static void step(KeyFSM* pFSM){
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.initData = (Avoid_WARNING_Overrider_Fcns)initData;
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);

View File

@ -5,18 +5,18 @@
#define KeyFSM_Input(pFSM) (KeyIn *)_preloadIn((FSM *)pFSM)
typedef enum _keyIn{
Up,
pUp,
pDown,
}KeyIn;
typedef enum _keyOutSignals{
typedef enum _keyOut{
Idle,
Down,
Hold,
Down_2times,
Down_3times,
}KeyOutSignal;
}KeyOut;
const static char *keyStr[] =
{
@ -27,17 +27,23 @@ const static char *keyStr[] =
"Down_3times",
};
typedef struct _keyFSMData
typedef struct _keyFSMExternalData
{
/* ----------------------------------- 输入 ----------------------------------- */
KeyIn in;
}KeyFSMExternalData;
/* ----------------------------------- 输出 ----------------------------------- */
KeyOutSignal out;
/* ---------------------------------- 内部变量 ---------------------------------- */
typedef struct _keyFSMInternalData
{
int countDelay;
int countMultiDown;
KeyOut out;
}KeyFSMInternalData;
typedef struct _keyFSMData
{
KeyFSMExternalData external;
KeyFSMInternalData internal;
}KeyFSMData;
typedef struct _KeyFSM KeyFSM;

View File

@ -6,6 +6,9 @@
#include <stdio.h>
#include <assert.h>
extern KeyIn keystat;
/*
*/
@ -40,7 +43,8 @@ typedef enum _State
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
if(data->in == Down){
if(data->external.in == Down){
FSM_LOG(" 物理按键按下 ");
return DownDebouncing;
}
@ -48,29 +52,30 @@ static State selectNextStateFcn(Waiting)(KeyFSMData *data){
}
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
if(data->in == Up){
if(data->external.in == pUp){
FSM_LOG(" 物理按键松开 ");
return Waiting;
}
else if(data->countDelay == 5){
else if(data->internal.countDelay == 5){
return Downing;
}
return Idle_State;
}
static State selectNextStateFcn(Downing)(KeyFSMData *data){
if(data->in == Up){
if(data->external.in == pUp){
FSM_LOG(" 物理按键松开 ");
return UpDebouncing;
}
else if(data->countDelay == 10){
else if(data->internal.countDelay == 10){
return Holding;
}
return Idle_State;
}
static State selectNextStateFcn(Holding)(KeyFSMData *data){
if(data->in == Up){
if(data->external.in == pUp){
FSM_LOG(" 物理按键松开 ");
return HoldUpDebouncing;
}
@ -78,27 +83,27 @@ static State selectNextStateFcn(Holding)(KeyFSMData *data){
}
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
if(data->in == Down){
if(data->external.in == Down){
FSM_LOG(" 物理按键按下 ");
return Holding;
}
else if(data->countDelay == 5){
else if(data->internal.countDelay == 5){
return Waiting;
}
return Idle_State;
}
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
if(data->in == Down){
if(data->external.in == Down){
FSM_LOG(" 物理按键按下 ");
if(data->countMultiDown){
if(data->internal.countMultiDown){
return MultiDowning;
}
else{
return Downing;
}
}
else if(data->countDelay == 5){
else if(data->internal.countDelay == 5){
return MultiDownWaiting;
}
@ -106,18 +111,18 @@ static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
}
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
if(data->in == Down){
if(data->external.in == Down){
FSM_LOG(" 物理按键按下 ");
return MultiDownDebouncing;
}
else if(data->countDelay == 5){
else if(data->internal.countDelay == 5){
return Waiting;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
if(data->in == Up){
if(data->external.in == pUp){
FSM_LOG(" 物理按键松开 ");
return UpDebouncing;
}
@ -125,11 +130,11 @@ static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
}
static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
if(data->in == Up){
if(data->external.in == pUp){
FSM_LOG(" 物理按键松开 ");
return MultiDownWaiting;
}
else if(data->countDelay == 5){
else if(data->internal.countDelay == 5){
return MultiDowning;
}
return Idle_State;
@ -139,51 +144,51 @@ static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, Waiting)(KeyFSMData* data){
data->out = Idle;
data->countDelay = 0;
data->countMultiDown = 0;
data->internal.out = Idle;
data->internal.countDelay = 0;
data->internal.countMultiDown = 0;
}
static void actionFcn(during, DownDebouncing)(KeyFSMData* data)
{
data->countDelay++;
data->internal.countDelay++;
FSM_LOG(" during开启消抖 ");
}
static void actionFcn(during, Downing)(KeyFSMData* data)
{
data->countDelay++;
data->out = Idle;
data->internal.countDelay++;
data->internal.out = Idle;
}
static void actionFcn(during, UpDebouncing)(KeyFSMData* data){
data->countDelay++;
data->internal.countDelay++;
FSM_LOG(" during松开消抖 ");
}
static void actionFcn(during, Holding)(KeyFSMData* data){
data->out = Idle;
data->countDelay++;
if(data->countDelay == 2){
data->out = Hold;
data->countDelay = 0;
data->internal.out = Idle;
data->internal.countDelay++;
if(data->internal.countDelay == 2){
data->internal.out = Hold;
data->internal.countDelay = 0;
}
}
static void actionFcn(exit, Holding)(KeyFSMData* data){
data->out = Idle;
data->internal.out = Idle;
}
static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){
data->countDelay++;
data->internal.countDelay++;
FSM_LOG(" during多击等待 ");
}
@ -191,13 +196,13 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){
static void actionFcn(during, HoldUpDebouncing)(KeyFSMData* data)
{
data->countDelay++;
data->internal.countDelay++;
}
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){
data->countDelay = 0;
data->internal.countDelay = 0;
}
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
data->out = Down;
data->internal.out = Down;
}
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
data->out = Idle;
data->countMultiDown++;
data->internal.out = Idle;
data->internal.countMultiDown++;
}
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
switch (data->countMultiDown + 1)
switch (data->internal.countMultiDown + 1)
{
case 2:
data->out = Down_2times;
data->internal.out = Down_2times;
break;
case 3:
data->out = Down_3times;
data->internal.out = Down_3times;
break;
default:
printf("reach MultiDown Limit!\n");
break;
}
FSM_LOG(" 多击%d ", data->countMultiDown+1);
FSM_LOG(" 多击%d ", data->internal.countMultiDown+1);
}
static State transitionHandler(Downing, Holding)(KeyFSMData* data){
data->out = Hold;
data->internal.out = Hold;
}
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){
KeyFSMData* data = pFSM->base.data;
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] = {
Up,Up,pDown,pDown,Up,
pUp,pUp,pDown,pDown,pUp,
pDown,pDown,pDown,pDown,pDown,
pDown,pDown,pDown,pDown,pDown,
Up,Up,Up,Up,Up,
Up,Up,pDown,pDown,pDown,
pUp,pUp,pUp,pUp,pUp,
pUp,pUp,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
};
KeyIn keystat;
int main(){
KeyFSM* keyFSM = createKeyFSM();
@ -28,13 +30,12 @@ int main(){
printf("第%d次: ",i+1);
const KeyFSMData* data = _getData((FSM *)keyFSM);
*KeyFSM_Input(keyFSM) = testin[i];
PreloaderGetReady(keyFSM);
ClearPreloaderOverFlag(keyFSM);
keystat = testin[i];
Step(keyFSM);
if(data->out){
printf("\t\t\t\t%d", data->out);
if(data->internal.out){
printf("\t\t\t\t%d", data->internal.out);
}
printf("\n");
}

View File

@ -2,7 +2,7 @@
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 20:08:03
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-24 13:15:26
* @LastEditTime: 2024-04-24 14:23:07
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -17,14 +17,14 @@
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
static void loadExternalData(TemplateFSMExternalData *extData){ // 必须重新实现
extData->arrindex = arrindex;
extData->x = x;
static void loadExternalData(TemplateFSMData *data){ // 必须重新实现
data->external.arrindex = arrindex;
data->external.x = x;
}
static void resetSignals(FSMSignals *signals){ // 必须重新实现
static void resetSignals(FSMSignals *signals, TemplateFSMData *data){ // 必须重新实现
switch (signals->lastTriggeredSignal)
{
@ -110,7 +110,7 @@ TemplateFSM *createTemplateFSM(){
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
pFSM->base.pureVtbl.loadExternalData = loadExternalData;
pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData;
// 调用父类构造函数
constructFSM((FSM *)pFSM);

View File

@ -42,7 +42,5 @@ typedef struct _templateFSMData
typedef struct _TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM();
void setTemplateFSMSignals(TemplateFSM *pFSM, enum TemplateFSMSignals Signal);
#endif