按键状态机在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",
"typeinfo": "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)
# 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)

View File

@ -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);

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));
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;
}

View File

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

View File

@ -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;

View File

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

View File

@ -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)]);
}

View File

@ -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");
}