Merge branch 'feature/修改状态机结构,去掉事件' into develop

This commit is contained in:
godcreator02 2024-04-23 14:57:05 +08:00
commit fb6fcc65dd
5 changed files with 12 additions and 27 deletions

View File

@ -57,10 +57,6 @@ void stepBaseFSM(FSM *pFSM)
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
int nextState = pFSM->privateVars.nextState;
if(fcns->delayedIndex){
fcns->transitionDelayTable[fcns->delayedIndex](data);
fcns->delayedIndex = 0;
}
if(nextState && curState != nextState){ // 状态切换
if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数
@ -68,7 +64,7 @@ void stepBaseFSM(FSM *pFSM)
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM);
(*fcns->transitionTable[index])(data, &fcns->delayedIndex);
(*fcns->transitionTable[index])(data);
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
@ -111,7 +107,6 @@ 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

@ -33,7 +33,7 @@
typedef struct _FSMHandler FSMHandler;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_Delay_General_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int *);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
@ -51,16 +51,13 @@ typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**selectNextState)(void *data, void *signals);
void (**transitionTable)(void *data, int *delayedIndex);
void (**transitionTable)(void *data);
void (*transitionGeneralAction)(void *data);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
int delayedIndex;
void (**transitionDelayTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler;

View File

@ -2,12 +2,13 @@
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 19:02:11
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 14:30:18
* @LastEditTime: 2024-04-23 14:47:23
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.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>
#include "FSM_protected.h"
#include "keyFSM.h"
@ -34,6 +35,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
data->out = Idle;
pFSM->base.data = data;
pFSM->base.signals = &data->out;
}
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
@ -46,7 +48,7 @@ static void initSignals(KeyFSM *pFSM){
}
static void resetSignals(KeyFSM *pFSM){
memset(pFSM->base.signals, 0, sizeof(KeyOutSignal));
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
@ -76,12 +78,8 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(DownDebouncing, Downing);
addDelayHandler(DownDebouncing, Downing);
addTransitionHandler(UpDebouncing, MultiDownWaiting);
addTransitionHandler(MultiDownDebouncing, MultiDowning);
addDelayHandler(MultiDownDebouncing, MultiDowning);
addTransitionHandler(Downing, Holding);
addTransitionHandler(MultiDownWaiting, Waiting);

View File

@ -10,7 +10,7 @@ typedef enum _keyIn{
}KeyIn;
typedef enum _keyOutSignal{
typedef enum _keyOutSignals{
Idle,
Down,
Hold,

View File

@ -208,21 +208,20 @@ void transitionGeneralAction(KeyFSMData *data){
data->countDelay = 0;
}
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data, int *delayedIndex){
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
data->out = Down;
*delayedIndex = index(DownDebouncing, Downing);
}
static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){
data->out = Idle;
}
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data, int *delayedIndex){
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
data->out = Idle;
data->countMultiDown++;
}
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data, int *delayedIndex){
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
switch (data->countMultiDown + 1)
{
case 2:
@ -237,14 +236,10 @@ static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* da
break;
}
FSM_LOG(" 多击%d ", data->countMultiDown+1);
*delayedIndex = index(MultiDownDebouncing, MultiDowning);
}
static void delayHanlder(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
data->out = Idle;
}
static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){
static State transitionHandler(Downing, Holding)(KeyFSMData* data){
data->out = Hold;
}