必须保留预装载器,加锁做不到

This commit is contained in:
godcreator02 2024-04-23 17:37:25 +08:00
parent ca211e646a
commit c063cfe90f
10 changed files with 73 additions and 79 deletions

View File

@ -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"
},

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)
set(keytest 789)
set(keytest 789)
# set(child_parent 789)
if(DEFINED keytest)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)

View File

@ -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;
}
}
@ -53,10 +53,10 @@ void stepBaseFSM(FSM *pFSM)
setNextState(pFSM);
// pFSM->vtbl.resetSignals(pFSM);
resetSignals(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));
@ -114,10 +114,7 @@ FSM* newBaseFSM(int numState, int defaultState){
pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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)]);
}

View File

@ -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;

View File

@ -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;

View File

@ -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 ");