小改结构,把template、按键和父子状态机的例子全写好

This commit is contained in:
godcreator 2024-01-30 23:00:38 +08:00
parent 710d823b99
commit cae4d5d6ce
18 changed files with 152 additions and 98 deletions

View File

@ -42,16 +42,18 @@ void childTest(){
for (int i = 0; i < 15; i++)
{
((ChildFSMData *)getData((FSM_Ptr)(cFSM)))->arrindex = i;
((ParentFSMData *)getData((FSM_Ptr)(pFSM)))->arrindex = i;
ParentFSM_Input(pFSM)->arrindex = i;
SetPreloaderReady(pFSM);
ChildFSMData* data = getData((FSM_Ptr)(cFSM));
ChildFSM_Input(cFSM)->arrindex = i;
SetPreloaderReady(cFSM);
ChildFSMData* data = getData((FSM *)(cFSM));
printf(" %d ", data->arrindex);
tic();
vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM);
_vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
toc(index++);
printf("\n");
}
}
@ -65,24 +67,14 @@ KeyFSMData* data;
void keyFSMTest(){
keyFSM = createKeyFSM();
data = getData((FSM_Ptr)keyFSM);
data = getData((FSM *)keyFSM);
printf("hello 28377\n");
while(1){
// SetEvent(keyFSM);
// Step(keyFSM);
// setEvent((FSM_Ptr)keyFSM);
// vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM);
KeyIn *in = preloadIn((FSM_Ptr)keyFSM);
*in = !GPIO_ReadPin(INPUT_GPIO);
preloaderReady((FSM_Ptr)keyFSM);
*KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO);
SetPreloaderReady(keyFSM);
tic();
Step(keyFSM);
@ -133,8 +125,8 @@ void main(void)
GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP);
// childTest();
keyFSMTest();
childTest();
// keyFSMTest();
// funptrTest();
}

View File

@ -5,13 +5,18 @@ project(controller)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
set(keytest 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)
else()
elseif(DEFINED child_parent)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest SRC_FSM_USR)
else()
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/template)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/template SRC_FSM_USR)
endif()
add_executable(test ${SRC_FSM_OOP} ${SRC_FSM_USR})

View File

@ -100,8 +100,6 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
pFSM->privateVars.preloader.isReady = 0;
pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
@ -162,15 +160,15 @@ const void *getData(FSM* pFSM){
return (const void *)pFSM->data;
}
void *preloadIn(FSM *pFSM){
void *_preloadIn(FSM *pFSM){
return pFSM->privateVars.preloader.in;
}
void preloaderReady(FSM *pFSM){
void _setPreloaderReady(FSM *pFSM){
pFSM->privateVars.preloader.isReady = 1;
}
FSMVtbl *vptrFSM(FSM* pFSM){
FSMVtbl *_vptrFSM(FSM* pFSM){
return &pFSM->vtbl;
}

View File

@ -5,10 +5,10 @@
#define BASE_PTR (FSM *)
typedef struct _FSM FSM;
typedef FSM * FSM_Ptr;
// #define SetEvent(FSM) setEvent((FSM_Ptr)FSM)
#define Step(FSM) vptrFSM((FSM_Ptr)FSM)->step((FSM_Ptr)FSM)
#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM)
#define SetPreloaderReady(pFSM) _setPreloaderReady((FSM *)pFSM);
typedef struct _FSMHandler FSMHandler;
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
@ -25,15 +25,14 @@ typedef struct _FSMVtbl {
int getFSMCurState(FSM *pFSM);
int getFSMCurEvent(FSM *pFSM);
// void setEvent(FSM* pFSM);
void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index);
const void *getData(FSM* pFSM);
void *preloadIn(FSM *pFSM);
void preloaderReady(FSM *pFSM);
void *_preloadIn(FSM *pFSM);
void _setPreloaderReady(FSM *pFSM);
FSMVtbl *vptrFSM(FSM* pFSM);
FSMVtbl *_vptrFSM(FSM* pFSM);
#endif

View File

@ -5,7 +5,6 @@
#include "FSM_protected.h"
#define DEFAULT_STATE Idle
#define NAME Parent
typedef struct _ParentFSM
{
@ -163,7 +162,7 @@ static Event selectEvent(ParentFSMData *data){
end
*/
static void FSM_LOGSM(ParentFSM* pFSM){
static void printFSM(ParentFSM* pFSM){
FSM_LOG("\tParentFSM: ");
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]);
@ -171,7 +170,7 @@ static void FSM_LOGSM(ParentFSM* pFSM){
static void step(ParentFSM* pFSM){
FSM_LOGSM(pFSM);
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
}
@ -187,6 +186,11 @@ static void initData(ParentFSM *pFSM){
pFSM->base.data = data;
}
static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(ParentFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ParentFSMData);
}
ParentFSM *createParentFSM(){
@ -197,8 +201,9 @@ ParentFSM *createParentFSM(){
pFSM->base.vtbl.selectEvent = selectEvent;
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader;
constructFSM((FSM_Ptr)pFSM);
constructFSM((FSM *)pFSM);
return pFSM;
}

View File

@ -42,6 +42,11 @@ static void initData(ChildFSM *pFSM){ // 必须重新实现
pFSM->base.data = data;
}
static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, E);
addStateActionFcn(during, D);
@ -69,8 +74,9 @@ ChildFSM *createChildFSM(){
pFSM->base.vtbl.selectEvent = selectEvent;
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader;
constructFSM((FSM_Ptr)pFSM);
constructFSM((FSM *)pFSM);
return pFSM;
}

View File

@ -1,6 +1,8 @@
#ifndef __CHILD_FSM_H_
#define __CHILD_FSM_H_
#define ChildFSM_Input(pFSM) ((ChildFSMData *)_preloadIn((FSM *)pFSM))
typedef struct _childFSMData
{
int arrindex;

View File

@ -114,7 +114,7 @@ const static char *eventStr[] = {
};
static void printFSM(ChildFSM* pFSM){
FSM_LOG(" \t\tChildFSM: ");
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
}

View File

@ -17,14 +17,17 @@ int main(){
for (int i = 0; i < 15; i++)
{
((ChildFSMData *)getData((FSM_Ptr)(cFSM)))->arrindex = i;
((ParentFSMData *)getData((FSM_Ptr)(pFSM)))->arrindex = i;
ParentFSM_Input(pFSM)->arrindex = i;
SetPreloaderReady(pFSM);
ChildFSMData* data = getData((FSM_Ptr)(cFSM));
ChildFSM_Input(cFSM)->arrindex = i;
SetPreloaderReady(cFSM);
ChildFSMData* data = getData((FSM *)(cFSM));
printf(" %d ", data->arrindex);
vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM);
_vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
printf("\n");
}

View File

@ -1,6 +1,8 @@
#ifndef __PARENT_FSM_H_
#define __PARENT_FSM_H_
#define ParentFSM_Input(pFSM) ((ParentFSMData *)_preloadIn((FSM *)pFSM))
typedef struct _parentFSMData
{
int arrindex;

View File

@ -27,7 +27,7 @@ static Event selectEvent(KeyFSMData *data){ // 必须重新实现
static void step(KeyFSM* pFSM){
printFSM(pFSM);
stepBaseFSM((FSM_Ptr)pFSM);
stepBaseFSM((FSM *)pFSM);
KeyFSMData * data = pFSM->base.data;
@ -98,7 +98,7 @@ KeyFSM *createKeyFSM(){
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
constructFSM((FSM_Ptr)pFSM);
constructFSM((FSM *)pFSM);
return pFSM;
}

View File

@ -2,7 +2,7 @@
#define __KEY_FSM_H_
#define KeyFSM_Input(pFSM) (KeyIn *)_preloadIn((FSM *)pFSM)
typedef enum _keyIn{
Up,

View File

@ -47,7 +47,6 @@ static void actionFcn(enter, Waiting)(KeyFSMData* data){
static void actionFcn(during, DownDebouncing)(KeyFSMData* data)
{
data->countDelay++;
FSM_LOG(" during开启消抖 ");
}
@ -267,7 +266,7 @@ const static char *eventStr[] = {
static void printFSM(KeyFSM* pFSM){
KeyFSMData* data = pFSM->base.data;
FSM_LOG("KeyFSM: ");
FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
}

View File

@ -1,6 +1,6 @@
#include <stdio.h>
#include "keyFSM.h"
#include "templateFSM.h"
#include "FSM_public.h"
#define NUM 60
@ -19,13 +19,6 @@ KeyIn testin[NUM] = {
pDown,pDown,pDown,pDown
};
typedef void (*fcn)();
void printtest(){
printf("fcn\n");
}
int main(){
KeyFSM* keyFSM = createKeyFSM();
@ -33,25 +26,18 @@ int main(){
for (int i = 0; i < NUM; i++)
{
printf("第%d次: ",i+1);
const KeyFSMData* data = getData((FSM_Ptr)keyFSM);
*(KeyIn *)preloadIn((FSM_Ptr)keyFSM) = testin[i];
preloaderReady((FSM_Ptr)keyFSM);
const KeyFSMData* data = getData((FSM *)keyFSM);
*KeyFSM_Input(keyFSM) = testin[i];
SetPreloaderReady(keyFSM);
Step(keyFSM);
if(data->out){
printf("\t\t\t\t%d", data->out);
}
printf("\n");
}
printf("hello world, 你好世界\n");
fcn fcnptr = printtest;
(fcnptr == NULL) ? : fcnptr();
return 0;
}

View File

@ -0,0 +1,25 @@
#include <stdio.h>
#include "templateFSM.h"
#include "FSM_public.h"
TemplateFSM *pFSM;
int main(){
pFSM = createTemplateFSM();
for (int i = 0; i < 15; i++)
{
TemplateFSM_Input(pFSM)->arrindex = i;
SetPreloaderReady(pFSM);
printf("%d," ,i);
Step(pFSM);
printf("\n");
}
return 0;
}

View File

@ -24,7 +24,7 @@ static Event ceventArr[20] = {
};
static Event selectEvent(TemplateFSMData *data){ // 必须重新实现
return ceventArr[data->arrindex];
return ceventArr[data->in.arrindex];
}
static void step(TemplateFSM* pFSM){
@ -34,25 +34,41 @@ static void step(TemplateFSM* pFSM){
static void initData(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
data->arrindex = 0;
TemplateFSMData tempData = {
.in = {
.arrindex = 0,
.x = 0,
},
.inner1 = 0,
.y1 = 0,
};
*data = tempData;
pFSM->base.data = data;
}
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn));
pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn);
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
fcns->duringActionTable[E] = (Avoid_WARNING_State_Fcns)actionFcn(during, E);
fcns->duringActionTable[D] = (Avoid_WARNING_State_Fcns)actionFcn(during, D);
fcns->enterActionTable[D] = (Avoid_WARNING_State_Fcns)actionFcn(enter, D);
fcns->enterActionTable[E] = (Avoid_WARNING_State_Fcns)actionFcn(enter, E);
addStateActionFcn(during, E);
addStateActionFcn(during, D);
addStateActionFcn(enter, E);
addStateActionFcn(enter, D);
addStateActionFcn(exit, E);
addStateActionFcn(exit, D);
fcns->exitActionTable[D] = (Avoid_WARNING_State_Fcns)D_exitAction;
fcns->exitActionTable[E] = (Avoid_WARNING_State_Fcns)E_exitAction;
addTransitionHandler(Idle, Idle2D);
addTransitionHandler(Idle, Idle2E);
addTransitionHandler(D, D2E);
addTransitionHandler(E, E2D);
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_Transition_Handler)transitionHandler(Idle2D);
fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_Transition_Handler)transitionHandler(Idle2E);
fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_Transition_Handler)transitionHandler(D2E);
fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_Transition_Handler)transitionHandler(E2D);
addDelayHandler(Idle2D);
}
/*
@ -60,16 +76,17 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
*/
TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = (Avoid_WARNING_State_Fcns)step;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
pFSM->base.vtbl.initData = (Avoid_WARNING_State_Fcns)initData;
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
constructFSM((FSM_Ptr)pFSM);
constructFSM((FSM *)pFSM);
return pFSM;
}

View File

@ -1,13 +1,24 @@
#ifndef __TEMPLATE_FSM_H_
#define __TEMPLATE_FSM_H_
typedef struct _templateFSMData
#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM))
typedef struct _templateFSMIn
{
int arrindex;
int x;
}TemplateFSMIn;
typedef struct _templateFSMData
{
TemplateFSMIn in;
int y1;
int inner1;
}TemplateFSMData;
typedef struct _TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM();

View File

@ -31,28 +31,28 @@ typedef enum _State
static void actionFcn(enter, D)()
{
printf(" enterD ");
FSM_LOG(" enterD ");
}
static void actionFcn(during, D)()
{
printf(" duringD ");
FSM_LOG(" duringD ");
}
static void actionFcn(exit, D)()
{
printf(" exitD ");
FSM_LOG(" exitD ");
}
static void actionFcn(enter, E)()
{
printf(" enterE ");
FSM_LOG(" enterE ");
}
static void actionFcn(during, E)()
{
printf(" duringE ");
FSM_LOG(" duringE ");
}
static void actionFcn(exit, E)()
{
printf(" exitE ");
FSM_LOG(" exitE ");
}
/*
@ -72,25 +72,29 @@ typedef enum _Event{
static State transitionHandler(Idle2D)()
{
printf(" Idle2D ");
FSM_LOG(" Idle2D ");
return D;
}
static void delayHanlder(Idle2D)(TemplateFSMData *data){
FSM_LOG(" DelayIdle2D");
}
static State transitionHandler(Idle2E)()
{
printf(" Idle2E ");
FSM_LOG(" Idle2E ");
return E;
}
static State transitionHandler(D2E)()
{
printf(" D2E ");
FSM_LOG(" D2E ");
return E;
}
static State transitionHandler(E2D)()
{
printf(" E2D ");
FSM_LOG(" E2D ");
return D;
}
@ -113,8 +117,8 @@ const static char *eventStr[] = {
"E2D",
};
static void printFSM(TemplateFSM* pFSM){
printf(" \t\tTemplateFSM: ");
printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
FSM_LOG(" \t\tTemplateFSM: ");
FSM_LOG("上次事件:%s, 当前状态:%s, 动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)]);
}