From 010e6a907f3cc25192bbed6690d43db9e5aab820 Mon Sep 17 00:00:00 2001 From: TrashGod <974980621@qq.com> Date: Fri, 28 Jun 2024 22:13:30 +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=9C=A8vscode=E5=8F=AF=E4=BB=A5=E8=B7=91=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/.vscode/settings.json | 3 ++- vscode/CMakeLists.txt | 4 ++-- vscode/FSM_OOP/baseFSM/FSM.c | 4 ++-- vscode/FSM_OOP/baseFSM/FSM_private.h | 4 ++-- vscode/FSM_OOP/baseFSM/FSM_protected.h | 6 ++++-- vscode/FSM_OOP/keytest/keyFSM.c | 22 ++++++++++++++++++++-- vscode/FSM_OOP/keytest/keyFSM.h | 2 ++ vscode/FSM_OOP/keytest/keyFSM_private.h | 7 +++++-- vscode/FSM_OOP/keytest/main.c | 5 +++-- 9 files changed, 42 insertions(+), 15 deletions(-) diff --git a/vscode/.vscode/settings.json b/vscode/.vscode/settings.json index 606e2c7..60ede05 100644 --- a/vscode/.vscode/settings.json +++ b/vscode/.vscode/settings.json @@ -36,7 +36,8 @@ "*.tcc": "c", "typeinfo": "c", "templatefsm.h": "c", - "templatefsm_private.h": "c" + "templatefsm_private.h": "c", + "keyfsm_private.h": "c" }, diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt index 198660d..7d8bb29 100644 --- a/vscode/CMakeLists.txt +++ b/vscode/CMakeLists.txt @@ -6,8 +6,8 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP) -# set(keytest 789) -set(child_parent 789) +set(keytest 789) +#set(child_parent 789) if(DEFINED keytest) include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest) aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR) diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c index 23b0096..3be674b 100644 --- a/vscode/FSM_OOP/baseFSM/FSM.c +++ b/vscode/FSM_OOP/baseFSM/FSM.c @@ -48,7 +48,7 @@ static void exitFSM(FSM *pFSM) exitFSM(getChildFSM(pFSM, curState)); } doExit(pFSM); - setCurState(pFSM, Idle_State); + setCurState(pFSM, FSM_Idle); } @@ -76,7 +76,7 @@ static inline void preload(FSM* pFSM){ */ void stepBaseFSM(FSM *pFSM) { - // pFSM->pureVtbl.loadExternalData(pFSM->data); + pFSM->pureVtbl.loadExternalData(pFSM->data); // preload(pFSM); updateNextState(pFSM); doResetSignals(pFSM); diff --git a/vscode/FSM_OOP/baseFSM/FSM_private.h b/vscode/FSM_OOP/baseFSM/FSM_private.h index b92d8d6..963c23e 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_private.h +++ b/vscode/FSM_OOP/baseFSM/FSM_private.h @@ -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)); for (int i = 0; i < numState * numState; i++) { @@ -181,7 +181,7 @@ static inline void doResetSignals(FSM *pFSM){ } static inline void clearLastTriggeredSignal(FSM *pFSM){ - pFSM->signals.lastTriggeredSignal = Idle_State; + pFSM->signals.lastTriggeredSignal = FSM_Idle; } diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h index a969cca..516d7f7 100644 --- a/vscode/FSM_OOP/baseFSM/FSM_protected.h +++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h @@ -86,8 +86,10 @@ typedef struct FSMSignals Uint16 all; /**< 外部信号 */ Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */ }FSMSignals; -#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */ -#define Idle_State 0 + + +#define FSM_Idle 0 /**< 清空上次触发信号,占用第一个信号位 */ + /* -------------------------------------------------------------------------- */ /* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */ /* -------------------------------------------------------------------------- */ diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c index 0dcda9d..a9f9b7c 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.c +++ b/vscode/FSM_OOP/keytest/keyFSM.c @@ -14,6 +14,23 @@ #include "keyFSM.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 */ /* -------------------------------------------------------------------------- */ @@ -22,7 +39,7 @@ static void loadExternalData(KeyFSMData *data){ // 必须重新实现 } static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现 - data->internal.out = Idle; + // data->internal.out = Idle; } static void initData(KeyFSM *pFSM){ // 必须重新实现 @@ -41,6 +58,7 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ + addSelectNextStateFcn(Idle_State); addSelectNextStateFcn(Waiting); addSelectNextStateFcn(DownDebouncing); addSelectNextStateFcn(Downing); @@ -96,7 +114,7 @@ static void step(KeyFSM* pFSM){ KeyFSM *createKeyFSM(){ KeyFSM *pFSM; - pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE); + pFSM = (KeyFSM *)newBaseFSM(Count_State); #ifndef DSP28377 pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; diff --git a/vscode/FSM_OOP/keytest/keyFSM.h b/vscode/FSM_OOP/keytest/keyFSM.h index 73bbe12..c5f0222 100644 --- a/vscode/FSM_OOP/keytest/keyFSM.h +++ b/vscode/FSM_OOP/keytest/keyFSM.h @@ -51,5 +51,7 @@ typedef struct _KeyFSM KeyFSM; KeyFSM *createKeyFSM(); +KeyOut readKeyFSMOut(KeyFSM *FSM); + #endif diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h index 0279f39..b4049f7 100644 --- a/vscode/FSM_OOP/keytest/keyFSM_private.h +++ b/vscode/FSM_OOP/keytest/keyFSM_private.h @@ -37,11 +37,14 @@ typedef enum _State Count_State, } State; -#define DEFAULT_STATE Waiting /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ +static State selectNextStateFcn(Idle_State)(KeyFSMData *data){ + return Waiting; +} + static State selectNextStateFcn(Waiting)(KeyFSMData *data){ if(data->external.in == Down){ @@ -270,7 +273,7 @@ const static char *stateStr[] = { static void printFSM(KeyFSM* pFSM){ KeyFSMData* data = pFSM->base.data; 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)]); } diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c index bccc799..bd4ee63 100644 --- a/vscode/FSM_OOP/keytest/main.c +++ b/vscode/FSM_OOP/keytest/main.c @@ -36,8 +36,9 @@ int main(){ Step(keyFSM); - if(data->internal.out){ - printf("\t\t\t\t%d", data->internal.out); + KeyOut out = readKeyFSMOut(keyFSM); + if(out != Idle){ + printf("\t\t\t\t%d", out); } printf("\n"); }