按键状态机准备在板子上测试
This commit is contained in:
parent
60bdcfe50b
commit
b3c9b79aea
|
@ -115,6 +115,9 @@ FSM* newBaseFSM(int numState, int defaultState){
|
||||||
|
|
||||||
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FSMVtbl vtbl = {
|
FSMVtbl vtbl = {
|
||||||
.reset = resetBaseFSM,
|
.reset = resetBaseFSM,
|
||||||
.step = stepBaseFSM,
|
.step = stepBaseFSM,
|
||||||
|
@ -139,6 +142,16 @@ void constructFSM(FSM* pFSM){
|
||||||
pFSM->vtbl.initData(pFSM);
|
pFSM->vtbl.initData(pFSM);
|
||||||
pFSM->vtbl.initDataLoader(pFSM);
|
pFSM->vtbl.initDataLoader(pFSM);
|
||||||
pFSM->vtbl.initSignals(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); // 强制退出
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,8 @@
|
||||||
|
|
||||||
typedef struct _FSMHandler FSMHandler;
|
typedef struct _FSMHandler FSMHandler;
|
||||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
||||||
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
|
typedef void (*Avoid_WARNING_Delay_General_Handlers)(void *data);
|
||||||
typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
|
typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int *);
|
||||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
|
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
|
||||||
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
|
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
|
||||||
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
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 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 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 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;
|
typedef struct _FSM FSM;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: godcreator02 qq974980621@gmail.com
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
* @Date: 2024-04-20 19:02:11
|
* @Date: 2024-04-20 19:02:11
|
||||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
* @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
|
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
|
||||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
* @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){ // 必须重新实现
|
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(enter, Waiting);
|
||||||
addStateActionFcn(during, DownDebouncing);
|
addStateActionFcn(during, DownDebouncing);
|
||||||
addStateActionFcn(during, Downing);
|
addStateActionFcn(during, Downing);
|
||||||
|
@ -61,7 +74,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addStateActionFcn(during, MultiDownDebouncing);
|
addStateActionFcn(during, MultiDownDebouncing);
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
|
||||||
addTransitionHandler(DownDebouncing, Downing);
|
addTransitionHandler(DownDebouncing, Downing);
|
||||||
addDelayHandler(DownDebouncing, Downing);
|
addDelayHandler(DownDebouncing, Downing);
|
||||||
|
|
||||||
|
@ -70,7 +83,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addTransitionHandler(Downing, Holding);
|
addTransitionHandler(Downing, Holding);
|
||||||
|
|
||||||
|
|
||||||
fcns->transitionGeneralAction = &transitionGeneralAction;
|
fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue