去掉所有事件,仅用状态表示。目前template测试么问题,按键测试还有段错误,马拉松回来再搞

This commit is contained in:
godcreator02 2024-04-20 21:16:26 +08:00
parent 75ce4d1a9a
commit 60bdcfe50b
8 changed files with 219 additions and 220 deletions

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

@ -21,7 +21,9 @@ void resetBaseFSM(FSM *pFSM)
static inline void setNextState(FSM* pFSM){
int curState = pFSM->privateVars.curState;
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
if(curState != 0){
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
}
if(0 == pFSM->privateVars.numChild){
return;
@ -52,12 +54,12 @@ void stepBaseFSM(FSM *pFSM)
int curState = pFSM->privateVars.curState;
void *data = pFSM->data;
FSM **childFSM = pFSM->privateVars.childFSM;
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.numState;
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
int nextState = pFSM->privateVars.nextState;
if(fcns->delayedEvent){
fcns->transitionDelayTable[fcns->delayedEvent](data);
fcns->delayedEvent = 0;
if(fcns->delayedIndex){
fcns->transitionDelayTable[fcns->delayedIndex](data);
fcns->delayedIndex = 0;
}
if (fcns->transitionTable[index] != NULL)
@ -65,7 +67,9 @@ void stepBaseFSM(FSM *pFSM)
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM);
(*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
(*fcns->transitionTable[index])(data, &fcns->delayedIndex);
fcns->transitionGeneralAction(data);
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
@ -86,10 +90,10 @@ void stepBaseFSM(FSM *pFSM)
}
FSM* newBaseFSM(int numState, int defaultState){
typedef void (*StateFuncPtr)(void *data);
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
typedef int (*TransitionFuncPtr)(void *data, int currentState);
typedef int (*SelectNextStateFcnPtr)(void *data, void *signals);
typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *);
typedef int (*SelectNextStateFcnPtr)(void *, void *);
FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars.numState = numState;
@ -106,6 +110,7 @@ FSM* newBaseFSM(int numState, int defaultState){
pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));

View File

@ -45,18 +45,18 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**selectNextState)(void *data, void *signals);
void (**transitionTable)(void *data, int currentState, int *);
void (**transitionTable)(void *data, int *delayedIndex);
void (*transitionGeneralAction)(void *data);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
int delayedEvent;
int delayedIndex;
void (**transitionDelayTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM);

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-20 19:44:58
* @LastEditTime: 2024-04-20 21:15:18
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -41,6 +41,14 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
}
static void initSignals(KeyFSM *pFSM){
}
static void resetSignals(KeyFSM *pFSM){
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(enter, Waiting);
addStateActionFcn(during, DownDebouncing);
@ -53,23 +61,16 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, MultiDownDebouncing);
addTransitionHandler(Waiting, PhsicalDown);
addTransitionHandler(DownDebouncing, PhsicalUp);
addTransitionHandler(DownDebouncing, DelayCount3);
addTransitionHandler(Downing, PhsicalUp);
addTransitionHandler(Downing, HoldCount4);
addTransitionHandler(UpDebouncing, PhsicalDown);
addTransitionHandler(UpDebouncing, DelayCount3);
addTransitionHandler(Holding, PhsicalUp);
addTransitionHandler(MultiDownWaiting, PhsicalDown);
addTransitionHandler(MultiDownWaiting, DelayCount3);
addTransitionHandler(MultiDowning, PhsicalUp);
addTransitionHandler(HoldUpDebouncing, PhsicalDown);
addTransitionHandler(HoldUpDebouncing, DelayCount3);
addTransitionHandler(MultiDownDebouncing, DelayCount3);
addTransitionHandler(MultiDownDebouncing, PhsicalUp);
addDelayHandler(DelayCount3);
addTransitionHandler(DownDebouncing, Downing);
addDelayHandler(DownDebouncing, Downing);
addTransitionHandler(UpDebouncing, MultiDownWaiting);
addTransitionHandler(MultiDownDebouncing, MultiDowning);
addTransitionHandler(Downing, Holding);
fcns->transitionGeneralAction = &transitionGeneralAction;
}
/*
@ -79,16 +80,17 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
KeyFSM *createKeyFSM(){
KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
#ifndef DSP28377
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
#endif
pFSM->base.vtbl.selectNextState = (Avoid_WARNING_SelectNextState)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
constructFSM((FSM *)pFSM);

View File

@ -26,35 +26,119 @@ typedef enum _State
DownDebouncing,
Downing,
Holding,
HoldUpDebouncing,
UpDebouncing,
MultiDownWaiting,
MultiDowning,
HoldUpDebouncing,
MultiDownDebouncing,
Count_State,
} State;
#define DEFAULT_STATE Waiting
static Event selectNextStateFcn(Waiting)(KeyFSMData *data){
if(data->countDelay == 10){
return HoldCount4;
}
else if(data->countDelay == 5){
return DelayCount3;
}
else if(data->in == Up){
return PhsicalUp;
}
else{
return PhsicalDown;
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
return DownDebouncing;
}
return Idle_State;
}
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return Waiting;
}
else if(data->countDelay == 5){
return Downing;
}
return Idle_State;
}
static State selectNextStateFcn(Downing)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return UpDebouncing;
}
else if(data->countDelay == 10){
return Holding;
}
return Idle_State;
}
static State selectNextStateFcn(Holding)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return HoldUpDebouncing;
}
return Idle_State;
}
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
return Holding;
}
else if(data->countDelay == 5){
return Waiting;
}
return Idle_State;
}
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
if(data->countMultiDown){
return MultiDowning;
}
else{
return Downing;
}
}
else if(data->countDelay == 5){
return MultiDownWaiting;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
return MultiDownDebouncing;
}
else if(data->countDelay == 5){
return Waiting;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return UpDebouncing;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return MultiDownWaiting;
}
else if(data->countDelay == 5){
return MultiDowning;
}
return Idle_State;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, Waiting)(KeyFSMData* data){
data->out = Idle;
data->countDelay = 0;
data->countMultiDown = 0;
@ -117,141 +201,47 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
}
/*
*/
typedef enum _Event{
Idle_Event,
PhsicalDown,
PhsicalUp,
DelayCount3,
HoldCount4,
Count_Event,
}Event;
static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted)
{
FSM_LOG(" 物理按键按下 ");
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
void transitionGeneralAction(KeyFSMData *data){
data->countDelay = 0;
switch (curState)
{
case Waiting:
return DownDebouncing;
case UpDebouncing:
if(data->countMultiDown)
return MultiDowning;
else
return Downing;
case HoldUpDebouncing:
return Holding;
case MultiDownWaiting:
return MultiDownDebouncing;
default:
FSM_LOG("检查状态转移表设计,不应该到这里");
assert(0);
}
}
static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, Event *delayedEvent)
{
FSM_LOG(" 物理按键松开 ");
data->countDelay = 0;
switch (curState)
{
case DownDebouncing:
if(data->countMultiDown){
return MultiDownWaiting;
}
return Waiting;
case Downing:
return UpDebouncing;
case Holding:
return HoldUpDebouncing;
case MultiDowning:
return UpDebouncing;
default:
FSM_LOG("检查状态转移表设计,不应该到这里");
assert(0);
}
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data, int *delayedIndex){
data->out = Down;
*delayedIndex = index(DownDebouncing, Downing);
}
static void delayHanlder(DelayCount3)(KeyFSMData* data){
static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){
data->out = Idle;
}
static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){
FSM_LOG(" 延迟计数到3 ");
data->countDelay = 0;
switch (curState)
{
case DownDebouncing:
data->out = Down;
*delayedEvent = DelayCount3;
FSM_LOG("按键按下");
return Downing;
case UpDebouncing:
data->out = Idle;
data->countMultiDown++;
FSM_LOG("按键松开");
return MultiDownWaiting;
case MultiDownWaiting:
return Waiting;
case HoldUpDebouncing:
return Waiting;
case MultiDownDebouncing:
switch (data->countMultiDown + 1)
{
case 2:
data->out = Down_2times;
break;
case 3:
data->out = Down_3times;
break;
default:
printf("reach MultiDown Limit!\n");
break;
}
FSM_LOG(" 多击%d ", data->countMultiDown+1);
*delayedEvent = DelayCount3;
return MultiDowning;
default:
FSM_LOG("检查状态转移表设计,不应该到这里");
assert(0);
}
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data, int *delayedIndex){
data->out = Idle;
data->countMultiDown++;
}
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data, int *delayedIndex){
switch (data->countMultiDown + 1)
{
case 2:
data->out = Down_2times;
break;
case 3:
data->out = Down_3times;
break;
default:
printf("reach MultiDown Limit!\n");
break;
}
FSM_LOG(" 多击%d ", data->countMultiDown+1);
*delayedIndex = index(MultiDownDebouncing, MultiDowning);
}
static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){
FSM_LOG(" 计数到2进入长按模式 ");
data->countDelay = 0;
static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){
data->out = Hold;
return Holding;
}
@ -272,17 +262,11 @@ const static char *stateStr[] = {
"HoldUpDebouncing",
"MultiDownDebouncing",
};
const static char *eventStr[] = {
"Idle",
"PhsicalDown",
"PhsicalUp",
"DelayCount3",
"HoldCount4",
};
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)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
}

View File

@ -1,3 +1,11 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 18:52:14
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-20 20:26:40
* @FilePath: \vscode\FSM_OOP\template\main.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h>
#include "templateFSM.h"
@ -19,11 +27,11 @@ int main(){
int ovflag = GetPreloaderOverFlag(pFSM);
if(i == 10){
if(i == 3){
TemplateFSM_Signals(pFSM)->signalA = 1;
}
if(i == 11){
TemplateFSM_Signals(pFSM)->signalB = 1;
if(i == 4){
TemplateFSM_Signals(pFSM)->signalA = 1;
}
printf("%d, " ,i);

View File

@ -1,3 +1,11 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 20:08:03
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-20 21:05:34
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -9,38 +17,11 @@
/*
*/
static Event ceventArr[20] = {
Idle_Event,
Idle_Event,
Idle2D,
Idle_Event,
Idle_Event,
D2E,
E2D,
D2E,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
};
static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现
if(signals->signalA){
return E2D;
}
if(signals->signalB){
return D2E;
}
return ceventArr[data->in.arrindex];
}
static void step(TemplateFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
}
static void initData(TemplateFSM *pFSM){ // 必须重新实现
@ -84,7 +65,8 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(D);
addSelectNextStateFcn(E);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
@ -101,7 +83,9 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addTransitionHandler(D, E);
addTransitionHandler(E, D);
addDelayHandler(Idle, D);
addDelayHandler(D, E);
fcns->transitionGeneralAction = &transitionGeneralAction;
}
/*

View File

@ -34,10 +34,21 @@ typedef enum _State
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static void selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
if(signals->signalA){
return E;
}
return Idle;
}
static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){
if(signals->signalA){
return D;
}
return Idle;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
@ -73,13 +84,17 @@ static void actionFcn(exit, E)()
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
void transitionGeneralAction(TemplateFSMData *data){
FSM_LOG("general");
}
static void transitionHandler(Idle, D)()
{
FSM_LOG(" Idle2D ");
}
static void delayHanlder(Idle, D)(TemplateFSMData *data){
FSM_LOG(" DelayIdle2D");
static void delayHanlder(D, E)(TemplateFSMData *data){
FSM_LOG(" DelayD2E");
}
static State transitionHandler(Idle, E)()
@ -87,8 +102,9 @@ static State transitionHandler(Idle, E)()
FSM_LOG(" Idle2E ");
}
static State transitionHandler(D, E)()
static State transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex)
{
*delayedIndex = index(D, E);
FSM_LOG(" D2E ");
}
@ -111,7 +127,7 @@ const static char *stateStr[] = {
static void printFSM(TemplateFSM* pFSM){
FSM_LOG(" \tTemplateFSM: ");
FSM_LOG("下次状态:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", stateStr[getFSMNextState((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM));
FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]);
}