From 2bbe89d54b8a35721306609b4369af969425db9c Mon Sep 17 00:00:00 2001 From: godcreator <974980621@qq.com> Date: Tue, 23 Jan 2024 20:05:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .vscode/c_cpp_properties.json | 21 +++++ .vscode/launch.json | 34 +++++++ .vscode/settings.json | 10 ++ .vscode/tasks.json | 34 +++++++ CMakeLists.txt | 15 +++ FSM_OOP/baseFSM/FSM.c | 126 +++++++++++++++++++++++++ FSM_OOP/baseFSM/FSM_private.h | 7 ++ FSM_OOP/baseFSM/FSM_protected.h | 70 ++++++++++++++ FSM_OOP/baseFSM/FSM_public.h | 32 +++++++ FSM_OOP/template/templateFSM.c | 75 +++++++++++++++ FSM_OOP/template/templateFSM.h | 15 +++ FSM_OOP/template/templateFSM_private.h | 121 ++++++++++++++++++++++++ FSM_OOP/usr/keyFSM.c | 75 +++++++++++++++ FSM_OOP/usr/keyFSM.h | 15 +++ FSM_OOP/usr/keyFSM_private.h | 121 ++++++++++++++++++++++++ main.c | 10 ++ 17 files changed, 782 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 CMakeLists.txt create mode 100644 FSM_OOP/baseFSM/FSM.c create mode 100644 FSM_OOP/baseFSM/FSM_private.h create mode 100644 FSM_OOP/baseFSM/FSM_protected.h create mode 100644 FSM_OOP/baseFSM/FSM_public.h create mode 100644 FSM_OOP/template/templateFSM.c create mode 100644 FSM_OOP/template/templateFSM.h create mode 100644 FSM_OOP/template/templateFSM_private.h create mode 100644 FSM_OOP/usr/keyFSM.c create mode 100644 FSM_OOP/usr/keyFSM.h create mode 100644 FSM_OOP/usr/keyFSM_private.h create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3d6549 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build/ \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..19a3924 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -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 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c3c0910 --- /dev/null +++ b/.vscode/launch.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..47a014f --- /dev/null +++ b/.vscode/settings.json @@ -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" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..43f4ac4 --- /dev/null +++ b/.vscode/tasks.json @@ -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" + ] + } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bf72732 --- /dev/null +++ b/CMakeLists.txt @@ -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) \ No newline at end of file diff --git a/FSM_OOP/baseFSM/FSM.c b/FSM_OOP/baseFSM/FSM.c new file mode 100644 index 0000000..1438273 --- /dev/null +++ b/FSM_OOP/baseFSM/FSM.c @@ -0,0 +1,126 @@ +#include +#include +#include + +#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; +} diff --git a/FSM_OOP/baseFSM/FSM_private.h b/FSM_OOP/baseFSM/FSM_private.h new file mode 100644 index 0000000..9c3ccf4 --- /dev/null +++ b/FSM_OOP/baseFSM/FSM_private.h @@ -0,0 +1,7 @@ +#ifndef __FSM_PRIVATE_H_ +#define __FSM_PRIVATE_H_ + +// 这个文件里函数定义和声明写一块 + + +#endif \ No newline at end of file diff --git a/FSM_OOP/baseFSM/FSM_protected.h b/FSM_OOP/baseFSM/FSM_protected.h new file mode 100644 index 0000000..6bc72f8 --- /dev/null +++ b/FSM_OOP/baseFSM/FSM_protected.h @@ -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 diff --git a/FSM_OOP/baseFSM/FSM_public.h b/FSM_OOP/baseFSM/FSM_public.h new file mode 100644 index 0000000..362ede5 --- /dev/null +++ b/FSM_OOP/baseFSM/FSM_public.h @@ -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 \ No newline at end of file diff --git a/FSM_OOP/template/templateFSM.c b/FSM_OOP/template/templateFSM.c new file mode 100644 index 0000000..404537f --- /dev/null +++ b/FSM_OOP/template/templateFSM.c @@ -0,0 +1,75 @@ +#include +#include + +#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; +} diff --git a/FSM_OOP/template/templateFSM.h b/FSM_OOP/template/templateFSM.h new file mode 100644 index 0000000..10eef6a --- /dev/null +++ b/FSM_OOP/template/templateFSM.h @@ -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 diff --git a/FSM_OOP/template/templateFSM_private.h b/FSM_OOP/template/templateFSM_private.h new file mode 100644 index 0000000..7605ffe --- /dev/null +++ b/FSM_OOP/template/templateFSM_private.h @@ -0,0 +1,121 @@ +#ifndef __TEMPLATE_PRIVATE_FSM_H_ +#define __TEMPLATE_PRIVATE_FSM_H_ + +#include "FSM_protected.h" +#include "templateFSM.h" +#include + + +/* + 继承基类 + */ +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 diff --git a/FSM_OOP/usr/keyFSM.c b/FSM_OOP/usr/keyFSM.c new file mode 100644 index 0000000..9f4875c --- /dev/null +++ b/FSM_OOP/usr/keyFSM.c @@ -0,0 +1,75 @@ +#include +#include + +#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; +} diff --git a/FSM_OOP/usr/keyFSM.h b/FSM_OOP/usr/keyFSM.h new file mode 100644 index 0000000..d7d500d --- /dev/null +++ b/FSM_OOP/usr/keyFSM.h @@ -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 diff --git a/FSM_OOP/usr/keyFSM_private.h b/FSM_OOP/usr/keyFSM_private.h new file mode 100644 index 0000000..73fb50a --- /dev/null +++ b/FSM_OOP/usr/keyFSM_private.h @@ -0,0 +1,121 @@ +#ifndef __KEY_PRIVATE_FSM_H_ +#define __KEY_PRIVATE_FSM_H_ + +#include "FSM_protected.h" +#include "keyFSM.h" +#include + + +/* + 继承基类 + */ +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 diff --git a/main.c b/main.c new file mode 100644 index 0000000..e2ec8d2 --- /dev/null +++ b/main.c @@ -0,0 +1,10 @@ +#include + + + + +int main(){ + printf("hello world, 你好世界"); + + return 0; +} \ No newline at end of file