第一次提交
This commit is contained in:
commit
2bbe89d54b
|
@ -0,0 +1 @@
|
||||||
|
/build/
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Win32",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}\\FSM_OOP\\**"
|
||||||
|
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"_DEBUG",
|
||||||
|
"UNICODE",
|
||||||
|
"_UNICODE"
|
||||||
|
],
|
||||||
|
"compilerPath": "C:\\mingw64\\bin\\gcc.exe",
|
||||||
|
"cStandard": "c99",
|
||||||
|
"cppStandard": "gnu++14",
|
||||||
|
"intelliSenseMode": "windows-gcc-x64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
// 使用 IntelliSense 了解相关属性。
|
||||||
|
// 悬停以查看现有属性的描述。
|
||||||
|
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "gcc.exe - 生成和调试活动文件",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}\\build\\test.exe",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${fileDirname}",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "C:\\mingw64\\bin\\gdb.exe",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "为 gdb 启用整齐打印",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "将反汇编风格设置为 Intel",
|
||||||
|
"text": "-gdb-set disassembly-flavor intel",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"preLaunchTask": "Build my project"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"filter.h": "c",
|
||||||
|
"fsm_protected.h": "c",
|
||||||
|
"keyfsm.h": "c",
|
||||||
|
"fsm_public.h": "c",
|
||||||
|
"stdio.h": "c"
|
||||||
|
},
|
||||||
|
"files.encoding": "utf8"
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}/build/"
|
||||||
|
},
|
||||||
|
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "cmake",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cmake",
|
||||||
|
"args": [
|
||||||
|
".."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "make",
|
||||||
|
"group":{
|
||||||
|
"kind":"build",
|
||||||
|
"isDefault":true
|
||||||
|
},
|
||||||
|
"command": "mingw32-make.exe",
|
||||||
|
"args":[
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label":"Build my project",
|
||||||
|
"dependsOn":[
|
||||||
|
"cmake",
|
||||||
|
"make"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
cmake_minimum_required(VERSION 3.28)
|
||||||
|
|
||||||
|
project(controller)
|
||||||
|
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/usr)
|
||||||
|
|
||||||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
||||||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/usr SRC_FSM_USR)
|
||||||
|
|
||||||
|
aux_source_directory(src SRC_SUB)
|
||||||
|
aux_source_directory(. SRC_CUR)
|
||||||
|
|
||||||
|
add_executable(test ${SRC_SUB} ${SRC_CUR} ${SRC_FSM_OOP} ${SRC_FSM_USR})
|
||||||
|
include_directories(include)
|
|
@ -0,0 +1,126 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "FSM_private.h"
|
||||||
|
#include "FSM_protected.h"
|
||||||
|
#include "FSM_public.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
protected 函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
void resetBaseFSM(FSM *pFSM)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL)
|
||||||
|
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM);
|
||||||
|
|
||||||
|
pFSM->privateVars.curState = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stepBaseFSM(FSM *pFSM)
|
||||||
|
{
|
||||||
|
int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent;
|
||||||
|
if (pFSM->privateVars.fcns.transitionTable[index] != NULL)
|
||||||
|
{
|
||||||
|
if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL)
|
||||||
|
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM);
|
||||||
|
|
||||||
|
pFSM->privateVars.curState = (*pFSM->privateVars.fcns.transitionTable[index])(pFSM);
|
||||||
|
|
||||||
|
if (pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState] != NULL)
|
||||||
|
pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState](pFSM);
|
||||||
|
}
|
||||||
|
else if(pFSM->privateVars.curState == 0){
|
||||||
|
pFSM->privateVars.curState = pFSM->privateVars.defaultState;
|
||||||
|
if (pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState] != NULL)
|
||||||
|
pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState](pFSM);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pFSM->privateVars.fcns.duringActionTable[pFSM->privateVars.curState] != NULL)
|
||||||
|
pFSM->privateVars.fcns.duringActionTable[pFSM->privateVars.curState](pFSM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FSM* newBaseFSM(int numState, int numEvent, int defaultState){
|
||||||
|
typedef void (*StateFuncPtr)(FSM* pFSM);
|
||||||
|
typedef int (*TransitionFuncPtr)(FSM* pFSM);
|
||||||
|
|
||||||
|
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||||
|
pFSM->privateVars.curEvent = 0;
|
||||||
|
pFSM->privateVars.curState = 0;
|
||||||
|
pFSM->privateVars.numEvent = numEvent;
|
||||||
|
pFSM->privateVars.defaultState = defaultState;
|
||||||
|
pFSM->privateVars.numChild = 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));
|
||||||
|
pFSM->privateVars.fcns.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr));
|
||||||
|
|
||||||
|
FSMVtbl vtbl = {
|
||||||
|
.reset = resetBaseFSM,
|
||||||
|
.step = stepBaseFSM,
|
||||||
|
.selectEvent = NULL,
|
||||||
|
.setupHandler = NULL,
|
||||||
|
.initData = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
pFSM->vtbl = vtbl;
|
||||||
|
return pFSM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void constructFSM(FSM* pFSM){
|
||||||
|
assert(pFSM->vtbl.setupHandler);
|
||||||
|
assert(pFSM->vtbl.initData);
|
||||||
|
|
||||||
|
pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns);
|
||||||
|
pFSM->vtbl.initData(pFSM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
public 函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int getFSMCurState(FSM *pFSM){
|
||||||
|
return pFSM->privateVars.curState;
|
||||||
|
}
|
||||||
|
int getFSMCurEvent(FSM *pFSM){
|
||||||
|
return pFSM->privateVars.curEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setEvent(FSM* pFSM){
|
||||||
|
assert(pFSM->vtbl.selectEvent);
|
||||||
|
|
||||||
|
int e = pFSM->vtbl.selectEvent(pFSM->data);
|
||||||
|
pFSM->privateVars.curEvent = e;
|
||||||
|
|
||||||
|
for (int i = 0; i < pFSM->privateVars.numChild; i++)
|
||||||
|
{
|
||||||
|
FSM *cFSM = pFSM->privateVars.childFSM[i];
|
||||||
|
setEvent(cFSM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setChildNum(FSM *pFSM, int num){
|
||||||
|
pFSM->privateVars.numChild = num;
|
||||||
|
pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *));
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerChildFSM(FSM *parent, FSM *child, int index){
|
||||||
|
parent->privateVars.childFSM[index] = child;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *getData(FSM* pFSM){
|
||||||
|
return pFSM->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSMVtbl *vptrFSM(FSM* pFSM){
|
||||||
|
return &pFSM->vtbl;
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef __FSM_PRIVATE_H_
|
||||||
|
#define __FSM_PRIVATE_H_
|
||||||
|
|
||||||
|
// 这个文件里函数定义和声明写一块
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,70 @@
|
||||||
|
#ifndef __FSM_PROTECTED_H_
|
||||||
|
#define __FSM_PROTECTED_H_
|
||||||
|
|
||||||
|
#include "FSM_public.h"
|
||||||
|
|
||||||
|
#define during
|
||||||
|
#define enter
|
||||||
|
#define exit
|
||||||
|
|
||||||
|
#define transitionHandler(event) event##Handler
|
||||||
|
#define actionFcn(action, state) state##_##action##Action
|
||||||
|
#define index(state, event) (state*Count_Event + event)
|
||||||
|
|
||||||
|
typedef struct _FSMHandler FSMHandler;
|
||||||
|
typedef void (*Avoid_WARNING_void_FSM)(FSM *pFSM);
|
||||||
|
typedef int (*Avoid_WARNING_int_FSM)(FSM *pFSM);
|
||||||
|
typedef int (*Avoid_WARNING_int_data)(void *data);
|
||||||
|
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _FSM FSM;
|
||||||
|
typedef struct _FSMHandler{
|
||||||
|
int (**transitionTable)(FSM *pFSM);
|
||||||
|
void (**enterActionTable)(FSM *pFSM);
|
||||||
|
void (**duringActionTable)(FSM *pFSM);
|
||||||
|
void (**exitActionTable)(FSM *pFSM);
|
||||||
|
}FSMHandler;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _FSMPrivateVars
|
||||||
|
{
|
||||||
|
int curState;
|
||||||
|
int defaultState; // Idle状态不能停留,必须指定一个初始状态
|
||||||
|
int curEvent;
|
||||||
|
int numEvent;
|
||||||
|
|
||||||
|
int numChild;
|
||||||
|
FSM **childFSM;
|
||||||
|
|
||||||
|
FSMHandler fcns;
|
||||||
|
}FMSPrivateVars;
|
||||||
|
|
||||||
|
|
||||||
|
// 类似于纯虚类, vptr中的函数必须继承后重新实现
|
||||||
|
typedef struct _FSM
|
||||||
|
{
|
||||||
|
// public functions
|
||||||
|
FSMVtbl vtbl;
|
||||||
|
|
||||||
|
// private
|
||||||
|
FMSPrivateVars privateVars;
|
||||||
|
|
||||||
|
// protected
|
||||||
|
void *data;
|
||||||
|
|
||||||
|
} FSM;
|
||||||
|
|
||||||
|
|
||||||
|
// protected, 子类能用, 外界用不了
|
||||||
|
int getFSMCurState(FSM *pFSM);
|
||||||
|
int getFSMCurEvent(FSM *pFSM);
|
||||||
|
void constructFSM(FSM* pFSM);
|
||||||
|
|
||||||
|
// 继承的函数
|
||||||
|
FSM *newBaseFSM(int numState, int numEvent, int defaultState);
|
||||||
|
void stepBaseFSM(FSM *pFSM);
|
||||||
|
void resetBaseFSM(FSM *pFSM);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef __FSM_PUBLIC_H_
|
||||||
|
#define __FSM_PUBLIC_H_
|
||||||
|
|
||||||
|
|
||||||
|
#define BASE_FSM(ptr) ((FSM *)(ptr))
|
||||||
|
#define BASE_PTR (FSM *)
|
||||||
|
|
||||||
|
typedef struct _FSM FSM;
|
||||||
|
typedef FSM * FSM_Ptr;
|
||||||
|
|
||||||
|
typedef struct _FSMHandler FSMHandler;
|
||||||
|
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
|
||||||
|
typedef struct _FSMVtbl {
|
||||||
|
// 状态机控制
|
||||||
|
int (*selectEvent)(void *data); // 可以认为是纯虚函数, 子类必须重新实现
|
||||||
|
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
|
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
|
void (*initData)(FSM *pFSM); // 子类必须重新实现
|
||||||
|
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
|
||||||
|
}FSMVtbl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void setEvent(FSM* pFSM);
|
||||||
|
void setChildNum(FSM *pFSM, int num);
|
||||||
|
void registerChildFSM(FSM *parent, FSM *child, int index);
|
||||||
|
|
||||||
|
void *getData(FSM* pFSM);
|
||||||
|
FSMVtbl *vptrFSM(FSM* pFSM);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,75 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "FSM_protected.h"
|
||||||
|
#include "templateFSM.h"
|
||||||
|
#include "templateFSM_private.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
||||||
|
*/
|
||||||
|
static Event ceventArr[20] = {
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
Idle2D,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
D2E,
|
||||||
|
E2D,
|
||||||
|
D2E,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
};
|
||||||
|
|
||||||
|
static Event selectEvent(TemplateFSMData *data){ // 必须重新实现
|
||||||
|
return ceventArr[data->arrindex];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void step(TemplateFSM* pFSM){
|
||||||
|
printFSM(pFSM);
|
||||||
|
stepBaseFSM(BASE_FSM(pFSM));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
|
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
||||||
|
data->arrindex = 0;
|
||||||
|
|
||||||
|
pFSM->base.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
|
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E);
|
||||||
|
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D);
|
||||||
|
|
||||||
|
fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D);
|
||||||
|
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
|
||||||
|
|
||||||
|
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction;
|
||||||
|
fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction;
|
||||||
|
|
||||||
|
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D);
|
||||||
|
fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E);
|
||||||
|
fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E);
|
||||||
|
fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
唯一外界调用的函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
TemplateFSM *createTemplateFSM(){
|
||||||
|
|
||||||
|
TemplateFSM *pFSM;
|
||||||
|
pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
|
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
|
||||||
|
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
|
||||||
|
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
|
||||||
|
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
|
|
||||||
|
constructFSM((FSM_Ptr)pFSM);
|
||||||
|
|
||||||
|
return pFSM;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef __TEMPLATE_FSM_H_
|
||||||
|
#define __TEMPLATE_FSM_H_
|
||||||
|
|
||||||
|
typedef struct _templateFSMData
|
||||||
|
{
|
||||||
|
int arrindex;
|
||||||
|
}TemplateFSMData;
|
||||||
|
|
||||||
|
typedef struct _TemplateFSM TemplateFSM;
|
||||||
|
|
||||||
|
TemplateFSM *createTemplateFSM();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,121 @@
|
||||||
|
#ifndef __TEMPLATE_PRIVATE_FSM_H_
|
||||||
|
#define __TEMPLATE_PRIVATE_FSM_H_
|
||||||
|
|
||||||
|
#include "FSM_protected.h"
|
||||||
|
#include "templateFSM.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
继承基类
|
||||||
|
*/
|
||||||
|
typedef struct _TemplateFSM
|
||||||
|
{
|
||||||
|
// 继承父类
|
||||||
|
FSM base;
|
||||||
|
}TemplateFSM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
状态和对应的 action, exit, during 函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum _State
|
||||||
|
{
|
||||||
|
Idle,
|
||||||
|
D,
|
||||||
|
E,
|
||||||
|
|
||||||
|
Count_State,
|
||||||
|
} State;
|
||||||
|
#define DEFAULT_STATE E
|
||||||
|
|
||||||
|
static void actionFcn(enter, D)()
|
||||||
|
{
|
||||||
|
printf(" enterD ");
|
||||||
|
}
|
||||||
|
static void actionFcn(during, D)()
|
||||||
|
{
|
||||||
|
printf(" duringD ");
|
||||||
|
}
|
||||||
|
static void actionFcn(exit, D)()
|
||||||
|
{
|
||||||
|
printf(" exitD ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void actionFcn(enter, E)()
|
||||||
|
{
|
||||||
|
printf(" enterE ");
|
||||||
|
}
|
||||||
|
static void actionFcn(during, E)()
|
||||||
|
{
|
||||||
|
printf(" duringE ");
|
||||||
|
}
|
||||||
|
static void actionFcn(exit, E)()
|
||||||
|
{
|
||||||
|
printf(" exitE ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
事件和对应的转移函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum _Event{
|
||||||
|
Idle_Event,
|
||||||
|
Idle2D,
|
||||||
|
Idle2E,
|
||||||
|
D2E,
|
||||||
|
E2D,
|
||||||
|
|
||||||
|
Count_Event,
|
||||||
|
}Event;
|
||||||
|
|
||||||
|
|
||||||
|
static State transitionHandler(Idle2D)()
|
||||||
|
{
|
||||||
|
printf(" Idle2D ");
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(Idle2E)()
|
||||||
|
{
|
||||||
|
printf(" Idle2E ");
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(D2E)()
|
||||||
|
{
|
||||||
|
printf(" D2E ");
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(E2D)()
|
||||||
|
{
|
||||||
|
printf(" E2D ");
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
用户自定义事件选择逻辑—————————————————begin
|
||||||
|
*/
|
||||||
|
const static char *stateStr[] = {
|
||||||
|
"Idle",
|
||||||
|
"D",
|
||||||
|
"E",
|
||||||
|
};
|
||||||
|
const static char *eventStr[] = {
|
||||||
|
"Idle",
|
||||||
|
"Idle2D",
|
||||||
|
"Idle2E",
|
||||||
|
"D2E",
|
||||||
|
"E2D",
|
||||||
|
};
|
||||||
|
static void printFSM(TemplateFSM* pFSM){
|
||||||
|
printf(" \t\tTemplateFSM: ");
|
||||||
|
printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,75 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "FSM_protected.h"
|
||||||
|
#include "keyFSM.h"
|
||||||
|
#include "keyFSM_private.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
||||||
|
*/
|
||||||
|
static Event ceventArr[20] = {
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
Idle2D,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
D2E,
|
||||||
|
E2D,
|
||||||
|
D2E,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
Idle_Event,
|
||||||
|
};
|
||||||
|
|
||||||
|
static Event selectEvent(KeyFSMData *data){ // 必须重新实现
|
||||||
|
return ceventArr[data->arrindex];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void step(KeyFSM* pFSM){
|
||||||
|
printFSM(pFSM);
|
||||||
|
stepBaseFSM(BASE_FSM(pFSM));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
||||||
|
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
|
||||||
|
data->arrindex = 0;
|
||||||
|
|
||||||
|
pFSM->base.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
|
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E);
|
||||||
|
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D);
|
||||||
|
|
||||||
|
fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D);
|
||||||
|
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
|
||||||
|
|
||||||
|
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction;
|
||||||
|
fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction;
|
||||||
|
|
||||||
|
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D);
|
||||||
|
fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E);
|
||||||
|
fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E);
|
||||||
|
fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
唯一外界调用的函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
KeyFSM *createKeyFSM(){
|
||||||
|
|
||||||
|
KeyFSM *pFSM;
|
||||||
|
pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
|
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
|
||||||
|
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
|
||||||
|
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
|
||||||
|
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
|
|
||||||
|
constructFSM((FSM_Ptr)pFSM);
|
||||||
|
|
||||||
|
return pFSM;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef __KEY_FSM_H_
|
||||||
|
#define __KEY_FSM_H_
|
||||||
|
|
||||||
|
typedef struct _keyFSMData
|
||||||
|
{
|
||||||
|
int arrindex;
|
||||||
|
}KeyFSMData;
|
||||||
|
|
||||||
|
typedef struct _KeyFSM KeyFSM;
|
||||||
|
|
||||||
|
KeyFSM *createKeyFSM();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,121 @@
|
||||||
|
#ifndef __KEY_PRIVATE_FSM_H_
|
||||||
|
#define __KEY_PRIVATE_FSM_H_
|
||||||
|
|
||||||
|
#include "FSM_protected.h"
|
||||||
|
#include "keyFSM.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
继承基类
|
||||||
|
*/
|
||||||
|
typedef struct _KeyFSM
|
||||||
|
{
|
||||||
|
// 继承父类
|
||||||
|
FSM base;
|
||||||
|
}KeyFSM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
状态和对应的 action, exit, during 函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum _State
|
||||||
|
{
|
||||||
|
Idle,
|
||||||
|
D,
|
||||||
|
E,
|
||||||
|
|
||||||
|
Count_State,
|
||||||
|
} State;
|
||||||
|
#define DEFAULT_STATE E
|
||||||
|
|
||||||
|
static void actionFcn(enter, D)()
|
||||||
|
{
|
||||||
|
printf(" enterD ");
|
||||||
|
}
|
||||||
|
static void actionFcn(during, D)()
|
||||||
|
{
|
||||||
|
printf(" duringD ");
|
||||||
|
}
|
||||||
|
static void actionFcn(exit, D)()
|
||||||
|
{
|
||||||
|
printf(" exitD ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void actionFcn(enter, E)()
|
||||||
|
{
|
||||||
|
printf(" enterE ");
|
||||||
|
}
|
||||||
|
static void actionFcn(during, E)()
|
||||||
|
{
|
||||||
|
printf(" duringE ");
|
||||||
|
}
|
||||||
|
static void actionFcn(exit, E)()
|
||||||
|
{
|
||||||
|
printf(" exitE ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
事件和对应的转移函数
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum _Event{
|
||||||
|
Idle_Event,
|
||||||
|
Idle2D,
|
||||||
|
Idle2E,
|
||||||
|
D2E,
|
||||||
|
E2D,
|
||||||
|
|
||||||
|
Count_Event,
|
||||||
|
}Event;
|
||||||
|
|
||||||
|
|
||||||
|
static State transitionHandler(Idle2D)()
|
||||||
|
{
|
||||||
|
printf(" Idle2D ");
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(Idle2E)()
|
||||||
|
{
|
||||||
|
printf(" Idle2E ");
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(D2E)()
|
||||||
|
{
|
||||||
|
printf(" D2E ");
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(E2D)()
|
||||||
|
{
|
||||||
|
printf(" E2D ");
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
用户自定义事件选择逻辑—————————————————begin
|
||||||
|
*/
|
||||||
|
const static char *stateStr[] = {
|
||||||
|
"Idle",
|
||||||
|
"D",
|
||||||
|
"E",
|
||||||
|
};
|
||||||
|
const static char *eventStr[] = {
|
||||||
|
"Idle",
|
||||||
|
"Idle2D",
|
||||||
|
"Idle2E",
|
||||||
|
"D2E",
|
||||||
|
"E2D",
|
||||||
|
};
|
||||||
|
static void printFSM(KeyFSM* pFSM){
|
||||||
|
printf(" \t\tKeyFSM: ");
|
||||||
|
printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue