按键状态机在vscode可以跑了

This commit is contained in:
TrashGod 2024-06-28 22:13:30 +08:00
parent 2667b895df
commit 010e6a907f
9 changed files with 42 additions and 15 deletions

View File

@ -36,7 +36,8 @@
"*.tcc": "c", "*.tcc": "c",
"typeinfo": "c", "typeinfo": "c",
"templatefsm.h": "c", "templatefsm.h": "c",
"templatefsm_private.h": "c" "templatefsm_private.h": "c",
"keyfsm_private.h": "c"
}, },

View File

@ -6,8 +6,8 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
# set(keytest 789) set(keytest 789)
set(child_parent 789) #set(child_parent 789)
if(DEFINED keytest) if(DEFINED keytest)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)

View File

@ -48,7 +48,7 @@ static void exitFSM(FSM *pFSM)
exitFSM(getChildFSM(pFSM, curState)); exitFSM(getChildFSM(pFSM, curState));
} }
doExit(pFSM); doExit(pFSM);
setCurState(pFSM, Idle_State); setCurState(pFSM, FSM_Idle);
} }
@ -76,7 +76,7 @@ static inline void preload(FSM* pFSM){
*/ */
void stepBaseFSM(FSM *pFSM) void stepBaseFSM(FSM *pFSM)
{ {
// pFSM->pureVtbl.loadExternalData(pFSM->data); pFSM->pureVtbl.loadExternalData(pFSM->data);
// preload(pFSM); // preload(pFSM);
updateNextState(pFSM); updateNextState(pFSM);
doResetSignals(pFSM); doResetSignals(pFSM);

View File

@ -100,7 +100,7 @@ FSMPrivateVars* newFMSPrivateVars(int numState){
privateVars->fcns.selectNextState = calloc(numState+1, sizeof(SelectNextStateFcnPtr)); // 包括默认状态,所以要+1 privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); // 包括默认状态,所以要+1
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr)); privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
for (int i = 0; i < numState * numState; i++) for (int i = 0; i < numState * numState; i++)
{ {
@ -181,7 +181,7 @@ static inline void doResetSignals(FSM *pFSM){
} }
static inline void clearLastTriggeredSignal(FSM *pFSM){ static inline void clearLastTriggeredSignal(FSM *pFSM){
pFSM->signals.lastTriggeredSignal = Idle_State; pFSM->signals.lastTriggeredSignal = FSM_Idle;
} }

View File

@ -86,8 +86,10 @@ typedef struct FSMSignals
Uint16 all; /**< 外部信号 */ Uint16 all; /**< 外部信号 */
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */ Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
}FSMSignals; }FSMSignals;
#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */
#define Idle_State 0
#define FSM_Idle 0 /**< 清空上次触发信号,占用第一个信号位 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */ /* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */

View File

@ -14,6 +14,23 @@
#include "keyFSM.h" #include "keyFSM.h"
#include "keyFSM_private.h" #include "keyFSM_private.h"
/* -------------------------------------------------------------------------- */
/* 用户定义逻辑 */
/* -------------------------------------------------------------------------- */
KeyOut readKeyFSMOut(KeyFSM *FSM){
KeyFSMData *data= FSM->base.data;
KeyOut out = data->internal.out;
data->internal.out = Idle;
return out;
}
void setKeyFSMOut(KeyFSMData *data, KeyOut keyout){
data->internal.out = keyout;
}
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */ /* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -22,7 +39,7 @@ static void loadExternalData(KeyFSMData *data){ // 必须重新实现
} }
static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现 static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现
data->internal.out = Idle; // data->internal.out = Idle;
} }
static void initData(KeyFSM *pFSM){ // 必须重新实现 static void initData(KeyFSM *pFSM){ // 必须重新实现
@ -41,6 +58,7 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
static void setupHandler(FSMHandler* fcns){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle_State);
addSelectNextStateFcn(Waiting); addSelectNextStateFcn(Waiting);
addSelectNextStateFcn(DownDebouncing); addSelectNextStateFcn(DownDebouncing);
addSelectNextStateFcn(Downing); addSelectNextStateFcn(Downing);
@ -96,7 +114,7 @@ static void step(KeyFSM* pFSM){
KeyFSM *createKeyFSM(){ KeyFSM *createKeyFSM(){
KeyFSM *pFSM; KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE); pFSM = (KeyFSM *)newBaseFSM(Count_State);
#ifndef DSP28377 #ifndef DSP28377
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;

View File

@ -51,5 +51,7 @@ typedef struct _KeyFSM KeyFSM;
KeyFSM *createKeyFSM(); KeyFSM *createKeyFSM();
KeyOut readKeyFSMOut(KeyFSM *FSM);
#endif #endif

View File

@ -37,11 +37,14 @@ typedef enum _State
Count_State, Count_State,
} State; } State;
#define DEFAULT_STATE Waiting
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */ /* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle_State)(KeyFSMData *data){
return Waiting;
}
static State selectNextStateFcn(Waiting)(KeyFSMData *data){ static State selectNextStateFcn(Waiting)(KeyFSMData *data){
if(data->external.in == Down){ if(data->external.in == Down){
@ -270,7 +273,7 @@ const static char *stateStr[] = {
static void printFSM(KeyFSM* pFSM){ static void printFSM(KeyFSM* pFSM){
KeyFSMData* data = pFSM->base.data; KeyFSMData* data = pFSM->base.data;
FSM_LOG("KeyFSM: "); FSM_LOG("KeyFSM: ");
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->internal.countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]); FSM_LOG("%d, 当前状态:%s, \t上一个下次状态:%s \t转移:", data->internal.countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
} }

View File

@ -36,8 +36,9 @@ int main(){
Step(keyFSM); Step(keyFSM);
if(data->internal.out){ KeyOut out = readKeyFSMOut(keyFSM);
printf("\t\t\t\t%d", data->internal.out); if(out != Idle){
printf("\t\t\t\t%d", out);
} }
printf("\n"); printf("\n");
} }