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