Merge branch 'release/1.3a'
This commit is contained in:
commit
89400b8802
|
@ -6,7 +6,7 @@ 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)
|
||||
|
|
|
@ -22,7 +22,7 @@ void resetBaseFSM(FSM *pFSM)
|
|||
|
||||
static inline void setEvent(FSM* pFSM){
|
||||
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){
|
||||
return;
|
||||
|
@ -47,6 +47,7 @@ void stepBaseFSM(FSM *pFSM)
|
|||
{
|
||||
preload(pFSM);
|
||||
setEvent(pFSM);
|
||||
pFSM->vtbl.resetSignals(pFSM);
|
||||
|
||||
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
||||
int curState = pFSM->privateVars.curState;
|
||||
|
@ -114,6 +115,7 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
|
|||
.setupHandler = NULL,
|
||||
.initData = NULL,
|
||||
.initDataLoader = NULL,
|
||||
.initSignals = NULL,
|
||||
};
|
||||
|
||||
pFSM->vtbl = vtbl;
|
||||
|
@ -125,18 +127,18 @@ void constructFSM(FSM* pFSM){
|
|||
assert(pFSM->vtbl.setupHandler);
|
||||
assert(pFSM->vtbl.initData);
|
||||
assert(pFSM->vtbl.initDataLoader);
|
||||
assert(pFSM->vtbl.initSignals);
|
||||
|
||||
pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns);
|
||||
pFSM->vtbl.initData(pFSM);
|
||||
pFSM->vtbl.initDataLoader(pFSM);
|
||||
pFSM->vtbl.initSignals(pFSM);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
public 函数
|
||||
*/
|
||||
|
||||
|
||||
int getFSMCurState(FSM *pFSM){
|
||||
return pFSM->privateVars.curState;
|
||||
}
|
||||
|
@ -156,18 +158,34 @@ void registerChildFSM(FSM *parent, FSM *child, int index){
|
|||
parent->privateVars.childFSM[index] = child;
|
||||
}
|
||||
|
||||
const void *getData(FSM* pFSM){
|
||||
const void *_getData(FSM* pFSM){
|
||||
return (const void *)pFSM->data;
|
||||
}
|
||||
|
||||
void *_getSignals(FSM* pFSM){
|
||||
return pFSM->signals;
|
||||
}
|
||||
|
||||
|
||||
void *_preloadIn(FSM *pFSM){
|
||||
return pFSM->privateVars.preloader.in;
|
||||
}
|
||||
|
||||
void _preloaderGetReady(FSM *pFSM){
|
||||
if(pFSM->privateVars.preloader.isReady){
|
||||
pFSM->privateVars.preloader.isOverflow = 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){
|
||||
return &pFSM->vtbl;
|
||||
|
|
|
@ -32,7 +32,7 @@ typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
|||
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 int (*Avoid_WARNING_SelectEvent)(void *data, void *signals);
|
||||
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
||||
|
||||
|
||||
|
@ -60,6 +60,7 @@ typedef struct _FSMDataLoader
|
|||
{
|
||||
void *in;
|
||||
int isReady;
|
||||
int isOverflow;
|
||||
size_t preloadSize;
|
||||
}FSMDataLoader;
|
||||
|
||||
|
@ -93,6 +94,7 @@ typedef struct _FSM
|
|||
|
||||
// protected
|
||||
void *data;
|
||||
void *signals;
|
||||
} FSM;
|
||||
|
||||
|
||||
|
|
|
@ -6,31 +6,42 @@
|
|||
|
||||
typedef struct _FSM FSM;
|
||||
|
||||
#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM)
|
||||
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
|
||||
#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((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;
|
||||
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
|
||||
typedef struct _FSMVtbl {
|
||||
// 状态机控制
|
||||
int (*selectEvent)(void *data); // 可以认为是纯虚函数, 子类必须重新实现
|
||||
int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现
|
||||
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||
void (*initData)(FSM *pFSM); // 子类必须重新实现
|
||||
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
|
||||
void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
|
||||
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
|
||||
void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
|
||||
}FSMVtbl;
|
||||
|
||||
|
||||
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
||||
int getFSMCurState(FSM *pFSM);
|
||||
int getFSMCurEvent(FSM *pFSM);
|
||||
void setChildNum(FSM *pFSM, int num);
|
||||
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 _preloaderGetReady(FSM *pFSM);
|
||||
int _getPreloaderOverFlag(FSM *pFSM);
|
||||
void _clearPreloaderOverFlag(FSM *pFSM);
|
||||
|
||||
FSMVtbl *_vptrFSM(FSM* pFSM);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ int main(){
|
|||
ChildFSM_Input(cFSM)->arrindex = i;
|
||||
PreloaderGetReady(cFSM);
|
||||
|
||||
ChildFSMData* data = getData((FSM *)(cFSM));
|
||||
ChildFSMData* data = _getData((FSM *)(cFSM));
|
||||
printf(" %d ", data->arrindex);
|
||||
|
||||
|
||||
|
|
|
@ -29,8 +29,13 @@ const static char *keyStr[] =
|
|||
|
||||
typedef struct _keyFSMData
|
||||
{
|
||||
/* ----------------------------------- 输入 ----------------------------------- */
|
||||
KeyIn in;
|
||||
|
||||
/* ----------------------------------- 输出 ----------------------------------- */
|
||||
KeyOutSignal out;
|
||||
|
||||
/* ---------------------------------- 内部变量 ---------------------------------- */
|
||||
int countDelay;
|
||||
int countMultiDown;
|
||||
}KeyFSMData;
|
||||
|
|
|
@ -26,10 +26,11 @@ int main(){
|
|||
for (int i = 0; i < NUM; i++)
|
||||
{
|
||||
printf("第%d次: ",i+1);
|
||||
const KeyFSMData* data = getData((FSM *)keyFSM);
|
||||
const KeyFSMData* data = _getData((FSM *)keyFSM);
|
||||
|
||||
*KeyFSM_Input(keyFSM) = testin[i];
|
||||
PreloaderGetReady(keyFSM);
|
||||
ClearPreloaderOverFlag(keyFSM);
|
||||
Step(keyFSM);
|
||||
|
||||
if(data->out){
|
||||
|
|
|
@ -15,7 +15,18 @@ int main(){
|
|||
TemplateFSM_Input(pFSM)->arrindex = i;
|
||||
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);
|
||||
printf("\n");
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "FSM_protected.h"
|
||||
#include "templateFSM.h"
|
||||
|
@ -21,9 +22,19 @@ static Event ceventArr[20] = {
|
|||
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];
|
||||
}
|
||||
|
||||
|
@ -47,6 +58,23 @@ static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
|||
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){ // 必须重新实现
|
||||
pFSM->base.privateVars.preloader.in = malloc(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.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||
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.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
#define __TEMPLATE_FSM_H_
|
||||
|
||||
|
||||
#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
|
||||
{
|
||||
|
@ -11,6 +11,12 @@ typedef struct _templateFSMIn
|
|||
int x;
|
||||
}TemplateFSMIn;
|
||||
|
||||
typedef struct _templateFSMSignals
|
||||
{
|
||||
int signalA;
|
||||
int signalB;
|
||||
}TemplateFSMSignals;
|
||||
|
||||
typedef struct _templateFSMData
|
||||
{
|
||||
TemplateFSMIn in;
|
||||
|
@ -18,6 +24,8 @@ typedef struct _templateFSMData
|
|||
int inner1;
|
||||
}TemplateFSMData;
|
||||
|
||||
|
||||
|
||||
typedef struct _TemplateFSM TemplateFSM;
|
||||
TemplateFSM *createTemplateFSM();
|
||||
|
||||
|
|
|
@ -117,8 +117,8 @@ const static char *eventStr[] = {
|
|||
"E2D",
|
||||
};
|
||||
static void printFSM(TemplateFSM* pFSM){
|
||||
FSM_LOG(" \t\tTemplateFSM: ");
|
||||
FSM_LOG("上次事件:%s, 当前状态:%s, 动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)]);
|
||||
FSM_LOG(" \tTemplateFSM: ");
|
||||
FSM_LOG("上次事件:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM));
|
||||
}
|
||||
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 297 KiB |
Loading…
Reference in New Issue