FSM/vscode/FSM_OOP/keytest/keyFSM.c

115 lines
3.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 19:02:11
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 14:30:18
* @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 "FSM_protected.h"
#include "keyFSM.h"
#include "keyFSM_private.h"
/*
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
*/
static void step(KeyFSM* pFSM){
printFSM(pFSM);
stepBaseFSM((FSM *)pFSM);
KeyFSMData * data = pFSM->base.data;
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
}
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;
}
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn));
pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
}
static void initSignals(KeyFSM *pFSM){
}
static void resetSignals(KeyFSM *pFSM){
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Waiting);
addSelectNextStateFcn(DownDebouncing);
addSelectNextStateFcn(Downing);
addSelectNextStateFcn(Holding);
addSelectNextStateFcn(HoldUpDebouncing);
addSelectNextStateFcn(UpDebouncing);
addSelectNextStateFcn(MultiDownWaiting);
addSelectNextStateFcn(MultiDowning);
addSelectNextStateFcn(MultiDownDebouncing);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(enter, Waiting);
addStateActionFcn(during, DownDebouncing);
addStateActionFcn(during, Downing);
addStateActionFcn(during, UpDebouncing);
addStateActionFcn(during, Holding);
addStateActionFcn(exit, Holding);
addStateActionFcn(during, MultiDownWaiting);
addStateActionFcn(during, HoldUpDebouncing);
addStateActionFcn(during, MultiDownDebouncing);
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(DownDebouncing, Downing);
addDelayHandler(DownDebouncing, Downing);
addTransitionHandler(UpDebouncing, MultiDownWaiting);
addTransitionHandler(MultiDownDebouncing, MultiDowning);
addDelayHandler(MultiDownDebouncing, MultiDowning);
addTransitionHandler(Downing, Holding);
addTransitionHandler(MultiDownWaiting, Waiting);
fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction;
}
/*
唯一外界调用的函数
*/
KeyFSM *createKeyFSM(){
KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
#ifndef DSP28377
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
#endif
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);
return pFSM;
}