预装载去掉了,现在直接将数据装载进data里

This commit is contained in:
godcreator02 2024-04-24 13:18:59 +08:00
parent 1bb48779ae
commit c9cb5b2cb4
7 changed files with 66 additions and 33 deletions

View File

@ -35,7 +35,8 @@
"limits": "c",
"*.tcc": "c",
"typeinfo": "c",
"templatefsm.h": "c"
"templatefsm.h": "c",
"templatefsm_private.h": "c"
},

View File

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

View File

@ -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;
/* -------------------------------------------------------------------------- */
/* 基类定义,纯虚类 */
/* -------------------------------------------------------------------------- */

View File

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

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

View File

@ -36,7 +36,7 @@ typedef struct _templateFSMInnerData
typedef struct _templateFSMData
{
TemplateFSMExternalData external;
TemplateFSMInnerData inner;
TemplateFSMInnerData internal;
}TemplateFSMData;
typedef struct _TemplateFSM TemplateFSM;

View File

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