From b3c9b79aea95184d2c6f48848e09ee1fdd2cd2af Mon Sep 17 00:00:00 2001 From: godcreator02 Date: Tue, 23 Apr 2024 14:03:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E9=94=AE=E7=8A=B6=E6=80=81=E6=9C=BA?= =?UTF-8?q?=E5=87=86=E5=A4=87=E5=9C=A8=E6=9D=BF=E5=AD=90=E4=B8=8A=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/FSM_OOP/baseFSM/FSM.c | 13 +++++++++++++ vscode/FSM_OOP/baseFSM/FSM_protected.h | 8 +++++--- vscode/FSM_OOP/keytest/keyFSM.c | 19 ++++++++++++++++--- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 06457b4..4c4d4a7 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -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); // 强制退出 + } + } } diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index aae3886..9c4fdfa 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -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; diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 6a349a9..9c0f7d5 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -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; } /*