Merge branch 'release/1.3a'

This commit is contained in:
godcreator 2024-04-19 23:37:34 +08:00
commit 89400b8802
12 changed files with 106 additions and 20 deletions

View File

@ -6,7 +6,7 @@ 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)

View File

@ -22,7 +22,7 @@ void resetBaseFSM(FSM *pFSM)
static inline void setEvent(FSM* pFSM){ static inline void setEvent(FSM* pFSM){
assert(pFSM->vtbl.selectEvent); assert(pFSM->vtbl.selectEvent);
pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data); pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data, pFSM->signals);
if(0 == pFSM->privateVars.numChild){ if(0 == pFSM->privateVars.numChild){
return; return;
@ -47,6 +47,7 @@ void stepBaseFSM(FSM *pFSM)
{ {
preload(pFSM); preload(pFSM);
setEvent(pFSM); setEvent(pFSM);
pFSM->vtbl.resetSignals(pFSM);
FSMHandler *fcns = &pFSM->privateVars.fcns; FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState; int curState = pFSM->privateVars.curState;
@ -114,6 +115,7 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
.setupHandler = NULL, .setupHandler = NULL,
.initData = NULL, .initData = NULL,
.initDataLoader = NULL, .initDataLoader = NULL,
.initSignals = NULL,
}; };
pFSM->vtbl = vtbl; pFSM->vtbl = vtbl;
@ -125,18 +127,18 @@ void constructFSM(FSM* pFSM){
assert(pFSM->vtbl.setupHandler); assert(pFSM->vtbl.setupHandler);
assert(pFSM->vtbl.initData); assert(pFSM->vtbl.initData);
assert(pFSM->vtbl.initDataLoader); assert(pFSM->vtbl.initDataLoader);
assert(pFSM->vtbl.initSignals);
pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns); pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns);
pFSM->vtbl.initData(pFSM); pFSM->vtbl.initData(pFSM);
pFSM->vtbl.initDataLoader(pFSM); pFSM->vtbl.initDataLoader(pFSM);
pFSM->vtbl.initSignals(pFSM);
} }
/* /*
public public
*/ */
int getFSMCurState(FSM *pFSM){ int getFSMCurState(FSM *pFSM){
return pFSM->privateVars.curState; return pFSM->privateVars.curState;
} }
@ -156,18 +158,34 @@ void registerChildFSM(FSM *parent, FSM *child, int index){
parent->privateVars.childFSM[index] = child; parent->privateVars.childFSM[index] = child;
} }
const void *getData(FSM* pFSM){ const void *_getData(FSM* pFSM){
return (const void *)pFSM->data; return (const void *)pFSM->data;
} }
void *_getSignals(FSM* pFSM){
return pFSM->signals;
}
void *_preloadIn(FSM *pFSM){ void *_preloadIn(FSM *pFSM){
return pFSM->privateVars.preloader.in; return pFSM->privateVars.preloader.in;
} }
void _preloaderGetReady(FSM *pFSM){ void _preloaderGetReady(FSM *pFSM){
if(pFSM->privateVars.preloader.isReady){
pFSM->privateVars.preloader.isOverflow = 1;
}
pFSM->privateVars.preloader.isReady = 1; pFSM->privateVars.preloader.isReady = 1;
} }
int _getPreloaderOverFlag(FSM *pFSM){
return pFSM->privateVars.preloader.isOverflow;
}
void _clearPreloaderOverFlag(FSM *pFSM){
pFSM->privateVars.preloader.isOverflow = 0;
}
FSMVtbl *_vptrFSM(FSM* pFSM){ FSMVtbl *_vptrFSM(FSM* pFSM){
return &pFSM->vtbl; return &pFSM->vtbl;

View File

@ -32,7 +32,7 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data); typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *); typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
typedef int (*Avoid_WARNING_SelectEvent)(void *data); typedef int (*Avoid_WARNING_SelectEvent)(void *data, void *signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
@ -60,6 +60,7 @@ typedef struct _FSMDataLoader
{ {
void *in; void *in;
int isReady; int isReady;
int isOverflow;
size_t preloadSize; size_t preloadSize;
}FSMDataLoader; }FSMDataLoader;
@ -93,6 +94,7 @@ typedef struct _FSM
// protected // protected
void *data; void *data;
void *signals;
} FSM; } FSM;

View File

@ -8,29 +8,40 @@ typedef struct _FSM FSM;
#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) #define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM)
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); #define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
#define GetData(pFSM) _getData((FSM*)pFSM)
typedef struct _FSMHandler FSMHandler; typedef struct _FSMHandler FSMHandler;
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现 // 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
typedef struct _FSMVtbl { typedef struct _FSMVtbl {
// 状态机控制 // 状态机控制
int (*selectEvent)(void *data); // 可以认为是纯虚函数, 子类必须重新实现 int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*initData)(FSM *pFSM); // 子类必须重新实现 void (*initData)(FSM *pFSM); // 子类必须重新实现
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
}FSMVtbl; }FSMVtbl;
/* --------------------------------- 状态机信息获取 -------------------------------- */
int getFSMCurState(FSM *pFSM); int getFSMCurState(FSM *pFSM);
int getFSMCurEvent(FSM *pFSM); int getFSMCurEvent(FSM *pFSM);
void setChildNum(FSM *pFSM, int num); void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index); void registerChildFSM(FSM *parent, FSM *child, int index);
const void *getData(FSM* pFSM); /* ------------------------------ Data和Signals ------------------------------ */
const void *_getData(FSM* pFSM);
void *_getSignals(FSM* pFSM);
/* ---------------------------------- 预装载器 ---------------------------------- */
void *_preloadIn(FSM *pFSM); void *_preloadIn(FSM *pFSM);
void _preloaderGetReady(FSM *pFSM); void _preloaderGetReady(FSM *pFSM);
int _getPreloaderOverFlag(FSM *pFSM);
void _clearPreloaderOverFlag(FSM *pFSM);
FSMVtbl *_vptrFSM(FSM* pFSM); FSMVtbl *_vptrFSM(FSM* pFSM);

View File

@ -23,7 +23,7 @@ int main(){
ChildFSM_Input(cFSM)->arrindex = i; ChildFSM_Input(cFSM)->arrindex = i;
PreloaderGetReady(cFSM); PreloaderGetReady(cFSM);
ChildFSMData* data = getData((FSM *)(cFSM)); ChildFSMData* data = _getData((FSM *)(cFSM));
printf(" %d ", data->arrindex); printf(" %d ", data->arrindex);

View File

@ -29,8 +29,13 @@ const static char *keyStr[] =
typedef struct _keyFSMData typedef struct _keyFSMData
{ {
/* ----------------------------------- 输入 ----------------------------------- */
KeyIn in; KeyIn in;
/* ----------------------------------- 输出 ----------------------------------- */
KeyOutSignal out; KeyOutSignal out;
/* ---------------------------------- 内部变量 ---------------------------------- */
int countDelay; int countDelay;
int countMultiDown; int countMultiDown;
}KeyFSMData; }KeyFSMData;

View File

@ -26,10 +26,11 @@ int main(){
for (int i = 0; i < NUM; i++) for (int i = 0; i < NUM; i++)
{ {
printf("第%d次: ",i+1); printf("第%d次: ",i+1);
const KeyFSMData* data = getData((FSM *)keyFSM); const KeyFSMData* data = _getData((FSM *)keyFSM);
*KeyFSM_Input(keyFSM) = testin[i]; *KeyFSM_Input(keyFSM) = testin[i];
PreloaderGetReady(keyFSM); PreloaderGetReady(keyFSM);
ClearPreloaderOverFlag(keyFSM);
Step(keyFSM); Step(keyFSM);
if(data->out){ if(data->out){

View File

@ -15,7 +15,18 @@ int main(){
TemplateFSM_Input(pFSM)->arrindex = i; TemplateFSM_Input(pFSM)->arrindex = i;
PreloaderGetReady(pFSM); PreloaderGetReady(pFSM);
printf("%d," ,i); const TemplateFSMData* data = GetData(pFSM);
int ovflag = GetPreloaderOverFlag(pFSM);
if(i == 10){
TemplateFSM_Signals(pFSM)->signalA = 1;
}
if(i == 11){
TemplateFSM_Signals(pFSM)->signalB = 1;
}
printf("%d, " ,i);
Step(pFSM); Step(pFSM);
printf("\n"); printf("\n");

View File

@ -1,5 +1,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "FSM_protected.h" #include "FSM_protected.h"
#include "templateFSM.h" #include "templateFSM.h"
@ -21,9 +22,19 @@ static Event ceventArr[20] = {
Idle_Event, Idle_Event,
Idle_Event, Idle_Event,
Idle_Event, Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
}; };
static Event selectEvent(TemplateFSMData *data){ // 必须重新实现 static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现
if(signals->signalA){
return E2D;
}
if(signals->signalB){
return D2E;
}
return ceventArr[data->in.arrindex]; return ceventArr[data->in.arrindex];
} }
@ -47,6 +58,23 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.data = data; pFSM->base.data = data;
} }
static void initSignals(TemplateFSM *pFSM){
TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals));
TemplateFSMSignals tempSignals = {
.signalA = 0,
.signalB = 0,
};
*signals = tempSignals;
pFSM->base.signals = signals;
}
static void resetSignals(TemplateFSM *pFSM){
memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals));
}
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn)); pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn));
pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn); pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn);
@ -82,6 +110,8 @@ TemplateFSM *createTemplateFSM(){
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent; pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;

View File

@ -3,7 +3,7 @@
#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM)) #define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM))
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
typedef struct _templateFSMIn typedef struct _templateFSMIn
{ {
@ -11,6 +11,12 @@ typedef struct _templateFSMIn
int x; int x;
}TemplateFSMIn; }TemplateFSMIn;
typedef struct _templateFSMSignals
{
int signalA;
int signalB;
}TemplateFSMSignals;
typedef struct _templateFSMData typedef struct _templateFSMData
{ {
TemplateFSMIn in; TemplateFSMIn in;
@ -18,6 +24,8 @@ typedef struct _templateFSMData
int inner1; int inner1;
}TemplateFSMData; }TemplateFSMData;
typedef struct _TemplateFSM TemplateFSM; typedef struct _TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM(); TemplateFSM *createTemplateFSM();

View File

@ -117,8 +117,8 @@ const static char *eventStr[] = {
"E2D", "E2D",
}; };
static void printFSM(TemplateFSM* pFSM){ static void printFSM(TemplateFSM* pFSM){
FSM_LOG(" \t\tTemplateFSM: "); FSM_LOG(" \tTemplateFSM: ");
FSM_LOG("上次事件:%s, 当前状态:%s, 动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)]); FSM_LOG("上次事件:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM));
} }

BIN
按键状态图2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB