按键状态机在vscode可以跑了
This commit is contained in:
parent
2667b895df
commit
010e6a907f
|
@ -36,7 +36,8 @@
|
|||
"*.tcc": "c",
|
||||
"typeinfo": "c",
|
||||
"templatefsm.h": "c",
|
||||
"templatefsm_private.h": "c"
|
||||
"templatefsm_private.h": "c",
|
||||
"keyfsm_private.h": "c"
|
||||
},
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -86,8 +86,10 @@ typedef struct FSMSignals
|
|||
Uint16 all; /**< 外部信号 */
|
||||
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
||||
}FSMSignals;
|
||||
#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */
|
||||
#define Idle_State 0
|
||||
|
||||
|
||||
#define FSM_Idle 0 /**< 清空上次触发信号,占用第一个信号位 */
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -51,5 +51,7 @@ typedef struct _KeyFSM KeyFSM;
|
|||
KeyFSM *createKeyFSM();
|
||||
|
||||
|
||||
KeyOut readKeyFSMOut(KeyFSM *FSM);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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)]);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue