FSM/vscode/FSM_OOP/keytest/keyFSM.c

113 lines
3.9 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 19:37:03
* @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"
#include "keyFSM_private.h"
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用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.signals = &data->out;
}
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){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
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);
addTransitionHandler(UpDebouncing, MultiDownWaiting);
addTransitionHandler(MultiDownDebouncing, MultiDowning);
addTransitionHandler(Downing, Holding);
addTransitionHandler(MultiDownWaiting, Waiting);
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
}
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
static void step(KeyFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
KeyFSMData * data = pFSM->base.data;
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
}
/*
唯一外界调用的函数
*/
KeyFSM *createKeyFSM(){
KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
#ifndef DSP28377
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
#endif
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;
constructFSM((FSM *)pFSM);
return pFSM;
}