按键状态机在vscode可以跑了
This commit is contained in:
parent
2667b895df
commit
010e6a907f
|
@ -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"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 /**< 清空上次触发信号,占用第一个信号位 */
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -51,5 +51,7 @@ typedef struct _KeyFSM KeyFSM;
|
||||||
KeyFSM *createKeyFSM();
|
KeyFSM *createKeyFSM();
|
||||||
|
|
||||||
|
|
||||||
|
KeyOut readKeyFSMOut(KeyFSM *FSM);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue