按键状态机准备在板子上测试

This commit is contained in:
godcreator02 2024-04-23 14:03:00 +08:00
parent 60bdcfe50b
commit b3c9b79aea
3 changed files with 34 additions and 6 deletions

View File

@ -115,6 +115,9 @@ FSM* newBaseFSM(int numState, int defaultState){
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
FSMVtbl vtbl = {
.reset = resetBaseFSM,
.step = stepBaseFSM,
@ -139,6 +142,16 @@ void constructFSM(FSM* pFSM){
pFSM->vtbl.initData(pFSM);
pFSM->vtbl.initDataLoader(pFSM);
pFSM->vtbl.initSignals(pFSM);
/* ---------------------------------- 检查状态表 --------------------------------- */
for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态Idle状态只能跳转到默认状态
{
if(!pFSM->privateVars.fcns.selectNextState[i]){
FSM_LOG("每个状态都要有一个状态选择函数!\n");
assert(0); // 强制退出
}
}
}

View File

@ -32,8 +32,8 @@
typedef struct _FSMHandler FSMHandler;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
typedef void (*Avoid_WARNING_Delay_General_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int *);
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);
@ -42,7 +42,9 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate)
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate)
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate)
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_General_Handlers)delayHanlder(curstate, nextstate)
typedef struct _FSM FSM;

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 21:15:18
* @LastEditTime: 2024-04-23 13:45:50
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@ -50,6 +50,19 @@ 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);
@ -61,7 +74,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, MultiDownDebouncing);
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(DownDebouncing, Downing);
addDelayHandler(DownDebouncing, Downing);
@ -70,7 +83,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addTransitionHandler(Downing, Holding);
fcns->transitionGeneralAction = &transitionGeneralAction;
fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction;
}
/*