diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..3389bf2
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "cmake.sourceDirectory": "D:/godsays/indexfiles/AZ8OJKZLGK/FSM/vscode"
+}
\ No newline at end of file
diff --git a/test_on_28377/.ccsproject b/test_on_28377/.ccsproject
index e499556..16fe6ab 100644
--- a/test_on_28377/.ccsproject
+++ b/test_on_28377/.ccsproject
@@ -2,4 +2,6 @@
+
+
diff --git a/test_on_28377/.cproject b/test_on_28377/.cproject
index 91cf160..8ac92ce 100644
--- a/test_on_28377/.cproject
+++ b/test_on_28377/.cproject
@@ -15,8 +15,8 @@
-
-
diff --git a/test_on_28377/.launches/FSM_test.launch b/test_on_28377/.launches/FSM_test.launch
new file mode 100644
index 0000000..44c9b58
--- /dev/null
+++ b/test_on_28377/.launches/FSM_test.launch
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_on_28377/targetConfigs/TMS320F28377D.ccxml b/test_on_28377/targetConfigs/TMS320F28377D.ccxml
index 242481c..99f29d0 100644
--- a/test_on_28377/targetConfigs/TMS320F28377D.ccxml
+++ b/test_on_28377/targetConfigs/TMS320F28377D.ccxml
@@ -1,342 +1,42 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/vscode/CMakeLists.txt b/vscode/CMakeLists.txt
index 72e13d1..e2e892e 100644
--- a/vscode/CMakeLists.txt
+++ b/vscode/CMakeLists.txt
@@ -5,7 +5,7 @@ project(controller)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
-# set(keytest 123)
+set(keytest 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 b4e8c2e..ea8cb8c 100644
--- a/vscode/FSM_OOP/baseFSM/FSM.c
+++ b/vscode/FSM_OOP/baseFSM/FSM.c
@@ -41,6 +41,18 @@ static inline void preload(FSM* pFSM){
pFSM->privateVars.preloader.isReady = 0;
}
}
+
+
+static inline void excuteDelay(FSM* pFSM){
+ FSMHandler *fcns = &pFSM->privateVars.fcns;
+ for (int event = 0; event < pFSM->privateVars.numEvent; event++)
+ {
+ if(!fcns->isDelayExcuted[event] && fcns->transitionDelayTable[event] != NULL ){
+ fcns->transitionDelayTable[event](pFSM->data);
+ fcns->isDelayExcuted[event] = 1;
+ }
+ }
+}
void stepBaseFSM(FSM *pFSM)
{
@@ -51,11 +63,7 @@ void stepBaseFSM(FSM *pFSM)
int curState = pFSM->privateVars.curState;
void *data = pFSM->data;
- if(!fcns->isDelayActionExcuted[curState] && fcns->delayActionTable[curState] != NULL ){
- fcns->delayActionTable[curState](data, NULL);
- fcns->isDelayActionExcuted[curState] = 1;
- }
-
+ excuteDelay(pFSM);
FSM **childFSM = pFSM->privateVars.childFSM;
int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent;
@@ -63,11 +71,11 @@ void stepBaseFSM(FSM *pFSM)
if (fcns->transitionTable[index] != NULL)
{
- fcns->isDelayActionExcuted[curState] = 0;
+ fcns->isDelayExcuted[curState] = 0;
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM);
- nextState = (*fcns->transitionTable[index])(data, curState);
+ nextState = (*fcns->transitionTable[index])(data, curState, fcns->isDelayExcuted);
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
@@ -102,9 +110,10 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
pFSM->privateVars.preloader.isReady = 0;
pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
- pFSM->privateVars.fcns.isDelayActionExcuted = calloc(numState, sizeof(int));
+ pFSM->privateVars.fcns.isDelayExcuted = calloc(numEvent, sizeof(int));
+ memset(pFSM->privateVars.fcns.isDelayExcuted, 1, sizeof(int));
- pFSM->privateVars.fcns.delayActionTable = calloc(numState, sizeof(StateFuncPtr));
+ pFSM->privateVars.fcns.transitionDelayTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h
index eb760ec..8b67be8 100644
--- a/vscode/FSM_OOP/baseFSM/FSM_protected.h
+++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h
@@ -23,12 +23,14 @@
#define exit exit
#define transitionHandler(event) event##Handler
+#define delayHanlder(event) event##DelayHandler
#define actionFcn(action, state) state##_##action##Action
#define index(state, event) (state*Count_Event + event)
typedef struct _FSMHandler FSMHandler;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
-typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState);
+typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
+typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
typedef int (*Avoid_WARNING_SelectEvent)(void *data);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
@@ -36,19 +38,20 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event)
+#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
- int (**transitionTable)(void *data, int currentState);
+ int (**transitionTable)(void *data, int currentState, int *);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
- int *isDelayActionExcuted;
- void (**delayActionTable)(void *data, FSM **childFSM);
+ int *isDelayExcuted;
+ void (**transitionDelayTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler;
diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c
index d04f724..3192211 100644
--- a/vscode/FSM_OOP/keytest/keyFSM.c
+++ b/vscode/FSM_OOP/keytest/keyFSM.c
@@ -51,12 +51,10 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(enter, Waiting);
addStateActionFcn(during, DownDebouncing);
addStateActionFcn(during, Downing);
- addStateActionFcn(delay, Downing);
addStateActionFcn(during, UpDebouncing);
addStateActionFcn(during, Holding);
addStateActionFcn(exit, Holding);
addStateActionFcn(during, MultiDownWaiting);
- addStateActionFcn(delay, MultiDowning);
addStateActionFcn(during, HoldUpDebouncing);
addStateActionFcn(during, MultiDownDebouncing);
@@ -76,6 +74,8 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addTransitionHandler(HoldUpDebouncing, DelayCount3);
addTransitionHandler(MultiDownDebouncing, DelayCount3);
addTransitionHandler(MultiDownDebouncing, PhsicalUp);
+
+ addDelayHandler(DelayCount3);
}
/*
diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h
index 3deb8ff..3c31ec0 100644
--- a/vscode/FSM_OOP/keytest/keyFSM_private.h
+++ b/vscode/FSM_OOP/keytest/keyFSM_private.h
@@ -52,10 +52,6 @@ static void actionFcn(during, DownDebouncing)(KeyFSMData* data)
FSM_LOG(" during开启消抖 ");
}
-static void actionFcn(delay, Downing)(KeyFSMData* data)
-{
- data->out = Idle;
-}
static void actionFcn(during, Downing)(KeyFSMData* data)
{
@@ -93,11 +89,6 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSMData* data){
}
-static void actionFcn(delay, MultiDowning)(KeyFSMData* data)
-{
- data->out = Idle;
-}
-
static void actionFcn(during, HoldUpDebouncing)(KeyFSMData* data)
{
@@ -127,7 +118,7 @@ typedef enum _Event{
Count_Event,
}Event;
-static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState)
+static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted)
{
FSM_LOG(" 物理按键按下 ");
data->countDelay = 0;
@@ -157,7 +148,7 @@ static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState)
}
}
-static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState)
+static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, int *isDelayExecuted)
{
FSM_LOG(" 物理按键松开 ");
data->countDelay = 0;
@@ -185,7 +176,11 @@ static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState)
}
}
-static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){
+static void delayHanlder(DelayCount3)(KeyFSMData* data){
+ data->out = Idle;
+}
+
+static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, int *isDelayExecuted){
FSM_LOG(" 延迟计数到3 ");
data->countDelay = 0;
@@ -193,6 +188,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){
{
case DownDebouncing:
data->out = Down;
+ isDelayExecuted[DelayCount3] = 0;
FSM_LOG("按键按下");
return Downing;
@@ -225,6 +221,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){
break;
}
FSM_LOG(" 多击%d ", data->countMultiDown+1);
+ isDelayExecuted[DelayCount3] = 0;
return MultiDowning;
default:
@@ -234,7 +231,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState){
}
-static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState){
+static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){
FSM_LOG(" 计数到2进入长按模式 ");
data->countDelay = 0;
diff --git a/vscode/FSM_OOP/keytest/main.c b/vscode/FSM_OOP/keytest/main.c
index dd3c598..ffe2413 100644
--- a/vscode/FSM_OOP/keytest/main.c
+++ b/vscode/FSM_OOP/keytest/main.c
@@ -35,8 +35,7 @@ int main(){
printf("第%d次: ",i+1);
const KeyFSMData* data = getData((FSM_Ptr)keyFSM);
- KeyIn *in = preloadIn((FSM_Ptr)keyFSM);
- *in = testin[i];
+ *(KeyIn *)preloadIn((FSM_Ptr)keyFSM) = testin[i];
preloaderReady((FSM_Ptr)keyFSM);
Step(keyFSM);