必须保留预装载器,加锁做不到
This commit is contained in:
parent
ca211e646a
commit
c063cfe90f
|
@ -24,7 +24,17 @@
|
|||
"keyfsm.h": "c",
|
||||
"fsm_public.h": "c",
|
||||
"stdio.h": "c",
|
||||
"assert.h": "c"
|
||||
"assert.h": "c",
|
||||
"climits": "c",
|
||||
"cmath": "c",
|
||||
"cstdarg": "c",
|
||||
"cstdint": "c",
|
||||
"cstdio": "c",
|
||||
"cstdlib": "c",
|
||||
"type_traits": "c",
|
||||
"limits": "c",
|
||||
"*.tcc": "c",
|
||||
"typeinfo": "c"
|
||||
},
|
||||
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
void resetBaseFSM(FSM *pFSM)
|
||||
{
|
||||
if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL)
|
||||
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->data, pFSM->privateVars.childFSM);
|
||||
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->privateVars.data, pFSM->privateVars.childFSM);
|
||||
|
||||
pFSM->privateVars.curState = 0;
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ void resetBaseFSM(FSM *pFSM)
|
|||
static inline void setNextState(FSM* pFSM){
|
||||
int curState = pFSM->privateVars.curState;
|
||||
if(curState != 0){
|
||||
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
|
||||
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->privateVars.data, pFSM->signals);
|
||||
}
|
||||
|
||||
if(0 == pFSM->privateVars.numChild)
|
||||
|
@ -37,9 +37,9 @@ static inline void setNextState(FSM* pFSM){
|
|||
}
|
||||
|
||||
static inline void preload(FSM* pFSM){
|
||||
if(pFSM->privateVars.preloader.isReady){
|
||||
memcpy(pFSM->data, pFSM->privateVars.preloader.in, pFSM->privateVars.preloader.preloadSize);
|
||||
pFSM->privateVars.preloader.isReady = 0;
|
||||
if(pFSM->preloader.isReady){
|
||||
memcpy(pFSM->privateVars.data, pFSM->preloader.shadowData, pFSM->preloader.size);
|
||||
pFSM->preloader.isReady = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ void stepBaseFSM(FSM *pFSM)
|
|||
|
||||
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
||||
int curState = pFSM->privateVars.curState;
|
||||
void *data = pFSM->data;
|
||||
void *data = pFSM->privateVars.data;
|
||||
FSM **childFSM = pFSM->privateVars.childFSM;
|
||||
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
|
||||
int nextState = pFSM->privateVars.nextState;
|
||||
|
@ -103,7 +103,7 @@ FSM* newBaseFSM(int numState, int defaultState){
|
|||
pFSM->privateVars.nextState = 0;
|
||||
pFSM->privateVars.numChild = 0;
|
||||
|
||||
pFSM->privateVars.preloader.isReady = 0;
|
||||
pFSM->preloader.isReady = 0;
|
||||
|
||||
pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
|
||||
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
|
||||
|
@ -115,9 +115,6 @@ FSM* newBaseFSM(int numState, int defaultState){
|
|||
|
||||
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
||||
|
||||
|
||||
|
||||
|
||||
FSMVtbl vtbl = {
|
||||
.reset = resetBaseFSM,
|
||||
.step = stepBaseFSM,
|
||||
|
@ -176,7 +173,7 @@ void registerChildFSM(FSM *parent, FSM *child, int index){
|
|||
}
|
||||
|
||||
const void *_getData(FSM* pFSM){
|
||||
return (const void *)pFSM->data;
|
||||
return (const void *)pFSM->privateVars.data;
|
||||
}
|
||||
|
||||
void *_getSignals(FSM* pFSM){
|
||||
|
@ -185,22 +182,22 @@ void *_getSignals(FSM* pFSM){
|
|||
|
||||
|
||||
void *_preloadIn(FSM *pFSM){
|
||||
return pFSM->privateVars.preloader.in;
|
||||
return pFSM->preloader.shadowData;
|
||||
}
|
||||
|
||||
void _preloaderGetReady(FSM *pFSM){
|
||||
if(pFSM->privateVars.preloader.isReady){
|
||||
pFSM->privateVars.preloader.isOverflow = 1;
|
||||
if(pFSM->preloader.isReady){
|
||||
pFSM->preloader.isOverflow = 1;
|
||||
}
|
||||
pFSM->privateVars.preloader.isReady = 1;
|
||||
pFSM->preloader.isReady = 1;
|
||||
}
|
||||
|
||||
int _getPreloaderOverFlag(FSM *pFSM){
|
||||
return pFSM->privateVars.preloader.isOverflow;
|
||||
return pFSM->preloader.isOverflow;
|
||||
}
|
||||
|
||||
void _clearPreloaderOverFlag(FSM *pFSM){
|
||||
pFSM->privateVars.preloader.isOverflow = 0;
|
||||
pFSM->preloader.isOverflow = 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -25,14 +25,13 @@
|
|||
|
||||
#define selectNextStateFcn(curstate) curstate##_##selectNextState
|
||||
#define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler
|
||||
#define delayHanlder(curstate, nextstate) curstate##2##nextstate##DelayHandler
|
||||
#define actionFcn(action, curstate) curstate##_##action##Action
|
||||
#define index(curstate, nextstate) (curstate*Count_State + nextstate)
|
||||
|
||||
|
||||
typedef struct _FSMHandler FSMHandler;
|
||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
||||
typedef void (*Avoid_WARNING_Delay_General_Handlers)(void *data);
|
||||
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
|
||||
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
|
||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
|
||||
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
|
||||
|
@ -42,7 +41,6 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
|||
#define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate)
|
||||
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
|
||||
#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate)
|
||||
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_General_Handlers)delayHanlder(curstate, nextstate)
|
||||
|
||||
|
||||
|
||||
|
@ -63,10 +61,10 @@ typedef struct _FSMHandler{
|
|||
|
||||
typedef struct _FSMDataLoader
|
||||
{
|
||||
void *in;
|
||||
void *shadowData;
|
||||
int isReady;
|
||||
int isOverflow;
|
||||
size_t preloadSize;
|
||||
size_t size;
|
||||
}FSMDataLoader;
|
||||
|
||||
|
||||
|
@ -78,12 +76,13 @@ typedef struct _FSMPrivateVars
|
|||
int curState;
|
||||
int nextState;
|
||||
|
||||
FSMDataLoader preloader;
|
||||
|
||||
FSMHandler fcns;
|
||||
|
||||
int numChild;
|
||||
FSM **childFSM;
|
||||
|
||||
void *data;
|
||||
|
||||
}FMSPrivateVars;
|
||||
|
||||
|
||||
|
@ -98,7 +97,7 @@ typedef struct _FSM
|
|||
FMSPrivateVars privateVars;
|
||||
|
||||
// protected
|
||||
void *data;
|
||||
FSMDataLoader preloader;
|
||||
void *signals;
|
||||
int signalSize;
|
||||
} FSM;
|
||||
|
|
|
@ -30,7 +30,6 @@ typedef struct _FSMVtbl {
|
|||
|
||||
void (*initData)(FSM *pFSM); // 子类必须重新实现
|
||||
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
|
||||
void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
|
||||
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
|
||||
void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
|
||||
}FSMVtbl;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 19:02:11
|
||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||
* @LastEditTime: 2024-04-23 15:07:57
|
||||
* @LastEditTime: 2024-04-23 17:15:11
|
||||
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
|
@ -22,7 +22,7 @@ static void step(KeyFSM* pFSM){
|
|||
printFSM(pFSM);
|
||||
stepBaseFSM((FSM *)pFSM);
|
||||
|
||||
KeyFSMData * data = pFSM->base.data;
|
||||
KeyFSMData * data = pFSM->base.privateVars.data;
|
||||
|
||||
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
|
||||
}
|
||||
|
@ -34,22 +34,20 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
|
|||
data->in = Up;
|
||||
data->out = Idle;
|
||||
|
||||
pFSM->base.data = data;
|
||||
pFSM->base.privateVars.data = data;
|
||||
|
||||
pFSM->base.signals = &data->out;
|
||||
}
|
||||
|
||||
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
||||
pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn));
|
||||
pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
|
||||
pFSM->base.preloader.shadowData = malloc(sizeof(KeyIn));
|
||||
pFSM->base.preloader.size = sizeof(KeyIn);
|
||||
}
|
||||
|
||||
static void initSignals(KeyFSM *pFSM){
|
||||
static void initSignals(KeyFSM *pFSM){ // 必须重新实现
|
||||
pFSM->base.signalSize = sizeof(KeyOutSignal);
|
||||
}
|
||||
|
||||
static void resetSignals(KeyFSM *pFSM){
|
||||
memset(pFSM->base.signals, 0, sizeof(KeyOutSignal));
|
||||
}
|
||||
|
||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||
|
@ -84,7 +82,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
|||
addTransitionHandler(MultiDownWaiting, Waiting);
|
||||
|
||||
|
||||
fcns->transitionGeneralAction = (Avoid_WARNING_Delay_General_Handlers)transitionGeneralAction;
|
||||
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -104,7 +102,6 @@ KeyFSM *createKeyFSM(){
|
|||
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;
|
||||
|
||||
constructFSM((FSM *)pFSM);
|
||||
|
||||
|
|
|
@ -212,9 +212,6 @@ static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
|
|||
data->out = Down;
|
||||
}
|
||||
|
||||
static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){
|
||||
data->out = Idle;
|
||||
}
|
||||
|
||||
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
|
||||
data->out = Idle;
|
||||
|
@ -266,7 +263,7 @@ const static char *stateStr[] = {
|
|||
};
|
||||
|
||||
static void printFSM(KeyFSM* pFSM){
|
||||
KeyFSMData* data = pFSM->base.data;
|
||||
KeyFSMData* data = pFSM->base.privateVars.data;
|
||||
FSM_LOG("KeyFSM: ");
|
||||
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 20:08:03
|
||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||
* @LastEditTime: 2024-04-20 21:05:34
|
||||
* @LastEditTime: 2024-04-23 17:09:52
|
||||
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
|
@ -26,39 +26,34 @@ static void step(TemplateFSM* pFSM){
|
|||
|
||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
||||
|
||||
TemplateFSMData tempData = {
|
||||
.in = {
|
||||
.external = {
|
||||
.arrindex = 0,
|
||||
.x = 0,
|
||||
},
|
||||
.inner1 = 0,
|
||||
.y1 = 0,
|
||||
.inner = {
|
||||
.inner1 = 0,
|
||||
.y1 = 0,
|
||||
},
|
||||
};
|
||||
*data = tempData;
|
||||
|
||||
pFSM->base.data = data;
|
||||
pFSM->base.privateVars.data = data;
|
||||
}
|
||||
|
||||
|
||||
static void initSignals(TemplateFSM *pFSM){
|
||||
TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals));
|
||||
TemplateFSMSignals tempSignals = {
|
||||
.signalA = 0,
|
||||
.signalB = 0,
|
||||
};
|
||||
*signals = tempSignals;
|
||||
TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals));
|
||||
|
||||
pFSM->base.signals = signals;
|
||||
pFSM->base.signalSize = sizeof(TemplateFSMSignals);
|
||||
}
|
||||
|
||||
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);
|
||||
pFSM->base.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData));
|
||||
pFSM->base.preloader.size = sizeof(TemplateFSMExternalData);
|
||||
}
|
||||
|
||||
|
||||
|
@ -83,9 +78,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
|||
addTransitionHandler(D, E);
|
||||
addTransitionHandler(E, D);
|
||||
|
||||
addDelayHandler(D, E);
|
||||
|
||||
fcns->transitionGeneralAction = &transitionGeneralAction;
|
||||
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -100,7 +93,6 @@ TemplateFSM *createTemplateFSM(){
|
|||
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.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||
|
||||
|
|
|
@ -2,26 +2,33 @@
|
|||
#define __TEMPLATE_FSM_H_
|
||||
|
||||
|
||||
#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM))
|
||||
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM))
|
||||
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
|
||||
|
||||
typedef struct _templateFSMIn
|
||||
{
|
||||
int arrindex;
|
||||
int x;
|
||||
}TemplateFSMIn;
|
||||
|
||||
typedef struct _templateFSMSignals
|
||||
{
|
||||
int signalA;
|
||||
int signalB;
|
||||
}TemplateFSMSignals;
|
||||
|
||||
typedef struct _templateFSMData
|
||||
|
||||
typedef struct _templateFSMExternalData
|
||||
{
|
||||
int arrindex;
|
||||
int x;
|
||||
}TemplateFSMExternalData;
|
||||
|
||||
typedef struct _templateFSMInnerData
|
||||
{
|
||||
TemplateFSMIn in;
|
||||
int y1;
|
||||
int inner1;
|
||||
}TemplateFSMInnerData;
|
||||
|
||||
|
||||
typedef struct _templateFSMData
|
||||
{
|
||||
TemplateFSMExternalData external;
|
||||
TemplateFSMInnerData inner;
|
||||
}TemplateFSMData;
|
||||
|
||||
|
||||
|
|
|
@ -93,10 +93,6 @@ static void transitionHandler(Idle, D)()
|
|||
FSM_LOG(" Idle2D ");
|
||||
}
|
||||
|
||||
static void delayHanlder(D, E)(TemplateFSMData *data){
|
||||
FSM_LOG(" DelayD2E");
|
||||
}
|
||||
|
||||
static State transitionHandler(Idle, E)()
|
||||
{
|
||||
FSM_LOG(" Idle2E ");
|
||||
|
|
Loading…
Reference in New Issue