预装载去掉了,现在直接将数据装载进data里
This commit is contained in:
parent
1bb48779ae
commit
c9cb5b2cb4
|
@ -35,7 +35,8 @@
|
|||
"limits": "c",
|
||||
"*.tcc": "c",
|
||||
"typeinfo": "c",
|
||||
"templatefsm.h": "c"
|
||||
"templatefsm.h": "c",
|
||||
"templatefsm_private.h": "c"
|
||||
},
|
||||
|
||||
|
||||
|
|
|
@ -45,7 +45,8 @@ static inline void preload(FSM* pFSM){
|
|||
/* -------------------------------------------------------------------------- */
|
||||
void stepBaseFSM(FSM *pFSM)
|
||||
{
|
||||
preload(pFSM);
|
||||
pFSM->pureVtbl.loadExternalData(pFSM->data);
|
||||
// preload(pFSM);
|
||||
setNextState(pFSM);
|
||||
pFSM->pureVtbl.resetSignals(&pFSM->signals);
|
||||
|
||||
|
@ -180,6 +181,7 @@ FSM* newBaseFSM(int numState, int defaultState){
|
|||
FSMPureVtbl pureVtbl = {
|
||||
.setupHandler = NULL,
|
||||
.initData = NULL,
|
||||
.loadExternalData = NULL,
|
||||
.initDataLoader = NULL,
|
||||
.initSignals = NULL,
|
||||
.resetSignals = NULL,
|
||||
|
|
|
@ -102,18 +102,19 @@ typedef struct _FSMSignals
|
|||
/* -------------------------------------------------------------------------- */
|
||||
typedef struct _FSMPureVtbl {
|
||||
// 状态机控制
|
||||
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
|
||||
|
||||
void (*initData)(FSM *pFSM); // =0子类必须重新实现
|
||||
void (*loadExternalData)(void *extData); // =0子类必须重新实现
|
||||
|
||||
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
|
||||
|
||||
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
|
||||
void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现
|
||||
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
|
||||
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
|
||||
}FSMPureVtbl;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 基类定义,纯虚类 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 18:52:14
|
||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||
* @LastEditTime: 2024-04-23 21:50:59
|
||||
* @LastEditTime: 2024-04-24 13:17:49
|
||||
* @FilePath: \vscode\FSM_OOP\template\main.c
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
|
@ -13,6 +13,9 @@
|
|||
|
||||
TemplateFSM *pFSM;
|
||||
|
||||
int arrindex = 10;
|
||||
int x = 5;
|
||||
|
||||
int main(){
|
||||
|
||||
pFSM = createTemplateFSM();
|
||||
|
@ -32,6 +35,12 @@ int main(){
|
|||
if(i == 4){
|
||||
SetSignal(pFSM, Signal_A);
|
||||
}
|
||||
if(i == 8){
|
||||
arrindex = 0;
|
||||
}
|
||||
if(i == 7){
|
||||
x = 0;
|
||||
}
|
||||
|
||||
printf("%d, " ,i);
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 20:08:03
|
||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||
* @LastEditTime: 2024-04-23 22:08:11
|
||||
* @LastEditTime: 2024-04-24 13:15:26
|
||||
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
|
@ -17,28 +17,11 @@
|
|||
/* -------------------------------------------------------------------------- */
|
||||
/* 纯虚函数,允许调用privateVars */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
||||
|
||||
TemplateFSMData tempData = {
|
||||
.external = {
|
||||
.arrindex = 0,
|
||||
.x = 0,
|
||||
},
|
||||
.inner = {
|
||||
.inner1 = 0,
|
||||
.y1 = 0,
|
||||
},
|
||||
};
|
||||
*data = tempData;
|
||||
|
||||
pFSM->base.data = data;
|
||||
static void loadExternalData(TemplateFSMExternalData *extData){ // 必须重新实现
|
||||
extData->arrindex = arrindex;
|
||||
extData->x = x;
|
||||
}
|
||||
|
||||
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
||||
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData));
|
||||
pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData);
|
||||
}
|
||||
|
||||
|
||||
static void resetSignals(FSMSignals *signals){ // 必须重新实现
|
||||
|
@ -55,6 +38,29 @@ static void resetSignals(FSMSignals *signals){ // 必须重新实现
|
|||
}
|
||||
|
||||
|
||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
|
||||
|
||||
TemplateFSMData tempData = {
|
||||
.external = {
|
||||
.arrindex = 0,
|
||||
.x = 0,
|
||||
},
|
||||
.internal = {
|
||||
.inner1 = 0,
|
||||
.y1 = 0,
|
||||
},
|
||||
};
|
||||
*data = tempData;
|
||||
|
||||
pFSM->base.data = data;
|
||||
}
|
||||
|
||||
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
||||
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData));
|
||||
pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData);
|
||||
}
|
||||
|
||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||
addSelectNextStateFcn(D);
|
||||
|
@ -78,7 +84,6 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
|||
}
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 其他重新实现的函数,父类已有实现,实现多态 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
@ -105,6 +110,7 @@ TemplateFSM *createTemplateFSM(){
|
|||
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
|
||||
pFSM->base.pureVtbl.loadExternalData = loadExternalData;
|
||||
|
||||
// 调用父类构造函数
|
||||
constructFSM((FSM *)pFSM);
|
||||
|
|
|
@ -36,7 +36,7 @@ typedef struct _templateFSMInnerData
|
|||
typedef struct _templateFSMData
|
||||
{
|
||||
TemplateFSMExternalData external;
|
||||
TemplateFSMInnerData inner;
|
||||
TemplateFSMInnerData internal;
|
||||
}TemplateFSMData;
|
||||
|
||||
typedef struct _TemplateFSM TemplateFSM;
|
||||
|
|
|
@ -1,10 +1,18 @@
|
|||
#ifndef __TEMPLATE_PRIVATE_FSM_H_
|
||||
#ifdef __TEMPLATE_PRIVATE_FSM_H_
|
||||
#error only include once
|
||||
|
||||
#else
|
||||
#define __TEMPLATE_PRIVATE_FSM_H_
|
||||
|
||||
#include "FSM_protected.h"
|
||||
#include "templateFSM.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 用到的外部变量 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
extern int arrindex;
|
||||
extern int x;
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
@ -36,6 +44,9 @@ static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
|
|||
signals->lastTriggeredSignal = Signal_A;
|
||||
return E;
|
||||
}
|
||||
else if(arrindex == 0){
|
||||
return E;
|
||||
}
|
||||
return Idle;
|
||||
}
|
||||
|
||||
|
@ -44,6 +55,9 @@ static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){
|
|||
signals->lastTriggeredSignal = Signal_A;
|
||||
return D;
|
||||
}
|
||||
else if(x == 0){
|
||||
return D;
|
||||
}
|
||||
return Idle;
|
||||
}
|
||||
|
||||
|
@ -83,7 +97,7 @@ static void actionFcn(exit, E)()
|
|||
/* -------------------------------------------------------------------------- */
|
||||
/* 转移函数 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
void transitionGeneralAction(TemplateFSMData *data){
|
||||
static void transitionGeneralAction(TemplateFSMData *data){
|
||||
FSM_LOG("general");
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue