电脑上能跑了
This commit is contained in:
parent
74c357c046
commit
a6ca70ae76
|
@ -3,13 +3,15 @@ cmake_minimum_required(VERSION 3.28)
|
||||||
project(controller)
|
project(controller)
|
||||||
|
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/usr)
|
|
||||||
|
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/usr SRC_FSM_USR)
|
|
||||||
|
|
||||||
aux_source_directory(src SRC_SUB)
|
# set(keytest 123)
|
||||||
aux_source_directory(. SRC_CUR)
|
if(DEFINED keytest)
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
||||||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)
|
||||||
|
else()
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest)
|
||||||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/childtest SRC_FSM_USR)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(test ${SRC_SUB} ${SRC_CUR} ${SRC_FSM_OOP} ${SRC_FSM_USR})
|
add_executable(test ${SRC_FSM_OOP} ${SRC_FSM_USR})
|
||||||
include_directories(include)
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "FSM_public.h"
|
#include "FSM_public.h"
|
||||||
|
|
||||||
|
// #define DSP28377
|
||||||
#ifdef DSP28377
|
#ifdef DSP28377
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef __FSM_PUBLIC_H_
|
#ifndef __FSM_PUBLIC_H_
|
||||||
#define __FSM_PUBLIC_H_
|
#define __FSM_PUBLIC_H_
|
||||||
|
|
||||||
// #define BASE_FSM(ptr) ((FSM *)(ptr))
|
#define BASE_FSM(ptr) ((FSM *)(ptr))
|
||||||
// #define BASE_PTR (FSM *)
|
#define BASE_PTR (FSM *)
|
||||||
|
|
||||||
typedef struct _FSM FSM;
|
typedef struct _FSM FSM;
|
||||||
typedef FSM * FSM_Ptr;
|
typedef FSM * FSM_Ptr;
|
||||||
|
|
|
@ -50,94 +50,90 @@ const static char *eventStr[] = {
|
||||||
|
|
||||||
|
|
||||||
State StartHandler(){
|
State StartHandler(){
|
||||||
printf(" start ");
|
FSM_LOG(" start ");
|
||||||
return A;
|
return A;
|
||||||
}
|
}
|
||||||
|
|
||||||
State A2BHandler(){
|
State A2BHandler(){
|
||||||
printf(" A2B ");
|
FSM_LOG(" A2B ");
|
||||||
return B;
|
return B;
|
||||||
}
|
}
|
||||||
|
|
||||||
State B2AHandler(){
|
State B2AHandler(){
|
||||||
printf(" B2A ");
|
FSM_LOG(" B2A ");
|
||||||
return A;
|
return A;
|
||||||
}
|
}
|
||||||
|
|
||||||
State B2CHandler(){
|
State B2CHandler(){
|
||||||
printf(" B2C ");
|
FSM_LOG(" B2C ");
|
||||||
return C;
|
return C;
|
||||||
}
|
}
|
||||||
|
|
||||||
State C2AHandler(){
|
State C2AHandler(){
|
||||||
printf(" C2A ");
|
FSM_LOG(" C2A ");
|
||||||
return A;
|
return A;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void A_enterAction(){
|
void A_enterAction(){
|
||||||
printf(" enterA ");
|
FSM_LOG(" enterA ");
|
||||||
}
|
}
|
||||||
void A_duringAction(){
|
void A_duringAction(){
|
||||||
printf(" duringA ");
|
FSM_LOG(" duringA ");
|
||||||
}
|
}
|
||||||
void A_exitAction(){
|
void A_exitAction(){
|
||||||
printf(" exitA ");
|
FSM_LOG(" exitA ");
|
||||||
}
|
}
|
||||||
|
|
||||||
void B_enterAction(FSM *pFSM){
|
void B_enterAction(void *data, FSM **childFSM){
|
||||||
printf(" enterB ");
|
FSM_LOG(" enterB ");
|
||||||
|
|
||||||
FSM *cFSM = pFSM->privateVars.childFSM[0];
|
FSM *cFSM = childFSM[0];
|
||||||
cFSM->vtbl.step(cFSM);
|
cFSM->vtbl.step(cFSM);
|
||||||
}
|
}
|
||||||
void B_duringAction(FSM *pFSM){
|
void B_duringAction(void *data, FSM **childFSM){
|
||||||
printf(" duringB ");
|
FSM_LOG(" duringB ");
|
||||||
|
|
||||||
FSM *cFSM = pFSM->privateVars.childFSM[0];
|
FSM *cFSM = childFSM[0];
|
||||||
cFSM->vtbl.step(cFSM);
|
cFSM->vtbl.step(cFSM);
|
||||||
}
|
}
|
||||||
void B_exitAction(FSM *pFSM){
|
void B_exitAction(void *data, FSM **childFSM){
|
||||||
FSM *cFSM = pFSM->privateVars.childFSM[0];
|
FSM *cFSM = childFSM[0];
|
||||||
cFSM->vtbl.reset(cFSM);
|
cFSM->vtbl.reset(cFSM);
|
||||||
|
|
||||||
printf(" exitB ");
|
FSM_LOG(" exitB ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void C_enterAction(){
|
void C_enterAction(){
|
||||||
printf(" enterC ");
|
FSM_LOG(" enterC ");
|
||||||
}
|
}
|
||||||
void C_duringAction(){
|
void C_duringAction(){
|
||||||
printf(" duringC ");
|
FSM_LOG(" duringC ");
|
||||||
}
|
}
|
||||||
void C_exitAction(){
|
void C_exitAction(){
|
||||||
printf(" exitC ");
|
FSM_LOG(" exitC ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){
|
static void setupHandler(FSMHandler* fcns){
|
||||||
typedef int (*transitionHandlerPtr)(FSM* pFSM);
|
|
||||||
#define AVOID_WARNING(handler) (transitionHandlerPtr)handler
|
|
||||||
|
|
||||||
fcns->duringActionTable[A] = A_duringAction;
|
addStateActionFcn(during, A);
|
||||||
fcns->duringActionTable[B] = B_duringAction;
|
addStateActionFcn(during, B);
|
||||||
fcns->duringActionTable[C] = C_duringAction;
|
addStateActionFcn(during, C);
|
||||||
|
addStateActionFcn(enter, A);
|
||||||
|
addStateActionFcn(enter, B);
|
||||||
|
addStateActionFcn(enter, C);
|
||||||
|
addStateActionFcn(exit, A);
|
||||||
|
addStateActionFcn(exit, B);
|
||||||
|
addStateActionFcn(exit, C);
|
||||||
|
|
||||||
fcns->enterActionTable[B] = B_enterAction;
|
addTransitionHandler(Idle, Start);
|
||||||
fcns->enterActionTable[C] = C_enterAction;
|
addTransitionHandler(A, A2B);
|
||||||
fcns->enterActionTable[A] = A_enterAction;
|
addTransitionHandler(B, B2A);
|
||||||
|
addTransitionHandler(B, B2C);
|
||||||
fcns->exitActionTable[A] = A_exitAction;
|
addTransitionHandler(C, C2A);
|
||||||
fcns->exitActionTable[B] = B_exitAction;
|
|
||||||
fcns->exitActionTable[C] = C_exitAction;
|
|
||||||
|
|
||||||
fcns->transitionTable[index(Idle, Start)] = AVOID_WARNING(StartHandler);
|
|
||||||
fcns->transitionTable[index(A, A2B)] = AVOID_WARNING(A2BHandler);
|
|
||||||
fcns->transitionTable[index(B, B2A)] = AVOID_WARNING(B2AHandler);
|
|
||||||
fcns->transitionTable[index(B, B2C)] = AVOID_WARNING(B2CHandler);
|
|
||||||
fcns->transitionTable[index(C, C2A)] = AVOID_WARNING(C2AHandler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,21 +163,21 @@ static Event selectEvent(ParentFSMData *data){
|
||||||
用户自定义事件选择逻辑————————end
|
用户自定义事件选择逻辑————————end
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void printFSM(ParentFSM* pFSM){
|
static void FSM_LOGSM(ParentFSM* pFSM){
|
||||||
printf("\tParentFSM: ");
|
FSM_LOG("\tParentFSM: ");
|
||||||
|
|
||||||
printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]);
|
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void step(ParentFSM* pFSM){
|
static void step(ParentFSM* pFSM){
|
||||||
printFSM(pFSM);
|
FSM_LOGSM(pFSM);
|
||||||
stepBaseFSM(BASE_FSM(pFSM));
|
stepBaseFSM(BASE_FSM(pFSM));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset(ParentFSM* pFSM){
|
static void reset(ParentFSM* pFSM){
|
||||||
resetBaseFSM(BASE_FSM(pFSM));
|
resetBaseFSM(BASE_FSM(pFSM));
|
||||||
printf(" ParentFSM-reset");
|
FSM_LOG(" ParentFSM-reset");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initData(ParentFSM *pFSM){
|
static void initData(ParentFSM *pFSM){
|
||||||
|
@ -197,11 +193,10 @@ ParentFSM *createParentFSM(){
|
||||||
ParentFSM *pFSM;
|
ParentFSM *pFSM;
|
||||||
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
|
pFSM->base.vtbl.step = step;
|
||||||
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
|
pFSM->base.vtbl.selectEvent = selectEvent;
|
||||||
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
|
pFSM->base.vtbl.initData = initData;
|
||||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.vtbl.setupHandler = setupHandler;
|
||||||
|
|
||||||
|
|
||||||
constructFSM((FSM_Ptr)pFSM);
|
constructFSM((FSM_Ptr)pFSM);
|
||||||
return pFSM;
|
return pFSM;
|
||||||
|
|
|
@ -36,23 +36,24 @@ static void initData(ChildFSM *pFSM){ // 必须重新实现
|
||||||
ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData));
|
ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData));
|
||||||
data->arrindex = 0;
|
data->arrindex = 0;
|
||||||
|
|
||||||
|
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
|
||||||
|
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
|
||||||
|
|
||||||
pFSM->base.data = data;
|
pFSM->base.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E);
|
addStateActionFcn(during, E);
|
||||||
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D);
|
addStateActionFcn(during, D);
|
||||||
|
addStateActionFcn(enter, D);
|
||||||
|
addStateActionFcn(exit, D);
|
||||||
|
addStateActionFcn(enter, E);
|
||||||
|
addStateActionFcn(exit, E);
|
||||||
|
|
||||||
fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D);
|
addTransitionHandler(Idle, Idle2D);
|
||||||
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
|
addTransitionHandler(Idle, Idle2E);
|
||||||
|
addTransitionHandler(D, D2E);
|
||||||
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction;
|
addTransitionHandler(E, E2D);
|
||||||
fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction;
|
|
||||||
|
|
||||||
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D);
|
|
||||||
fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E);
|
|
||||||
fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E);
|
|
||||||
fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -64,10 +65,10 @@ ChildFSM *createChildFSM(){
|
||||||
ChildFSM *pFSM;
|
ChildFSM *pFSM;
|
||||||
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
|
pFSM->base.vtbl.step = step;
|
||||||
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
|
pFSM->base.vtbl.selectEvent = selectEvent;
|
||||||
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
|
pFSM->base.vtbl.initData = initData;
|
||||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.vtbl.setupHandler = setupHandler;
|
||||||
|
|
||||||
constructFSM((FSM_Ptr)pFSM);
|
constructFSM((FSM_Ptr)pFSM);
|
||||||
|
|
||||||
|
|
|
@ -31,28 +31,28 @@ typedef enum _State
|
||||||
|
|
||||||
void actionFcn(enter, D)()
|
void actionFcn(enter, D)()
|
||||||
{
|
{
|
||||||
printf(" enterD ");
|
FSM_LOG(" enterD ");
|
||||||
}
|
}
|
||||||
void actionFcn(during, D)()
|
void actionFcn(during, D)()
|
||||||
{
|
{
|
||||||
printf(" duringD ");
|
FSM_LOG(" duringD ");
|
||||||
}
|
}
|
||||||
void actionFcn(exit, D)()
|
void actionFcn(exit, D)()
|
||||||
{
|
{
|
||||||
printf(" exitD ");
|
FSM_LOG(" exitD ");
|
||||||
}
|
}
|
||||||
|
|
||||||
void actionFcn(enter, E)()
|
void actionFcn(enter, E)()
|
||||||
{
|
{
|
||||||
printf(" enterE ");
|
FSM_LOG(" enterE ");
|
||||||
}
|
}
|
||||||
void actionFcn(during, E)()
|
void actionFcn(during, E)()
|
||||||
{
|
{
|
||||||
printf(" duringE ");
|
FSM_LOG(" duringE ");
|
||||||
}
|
}
|
||||||
void actionFcn(exit, E)()
|
void actionFcn(exit, E)()
|
||||||
{
|
{
|
||||||
printf(" exitE ");
|
FSM_LOG(" exitE ");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -72,25 +72,25 @@ typedef enum _Event{
|
||||||
|
|
||||||
State transitionHandler(Idle2D)()
|
State transitionHandler(Idle2D)()
|
||||||
{
|
{
|
||||||
printf(" Idle2D ");
|
FSM_LOG(" Idle2D ");
|
||||||
return D;
|
return D;
|
||||||
}
|
}
|
||||||
|
|
||||||
State transitionHandler(Idle2E)()
|
State transitionHandler(Idle2E)()
|
||||||
{
|
{
|
||||||
printf(" Idle2E ");
|
FSM_LOG(" Idle2E ");
|
||||||
return E;
|
return E;
|
||||||
}
|
}
|
||||||
|
|
||||||
State transitionHandler(D2E)()
|
State transitionHandler(D2E)()
|
||||||
{
|
{
|
||||||
printf(" D2E ");
|
FSM_LOG(" D2E ");
|
||||||
return E;
|
return E;
|
||||||
}
|
}
|
||||||
|
|
||||||
State transitionHandler(E2D)()
|
State transitionHandler(E2D)()
|
||||||
{
|
{
|
||||||
printf(" E2D ");
|
FSM_LOG(" E2D ");
|
||||||
return D;
|
return D;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,8 +113,8 @@ const static char *eventStr[] = {
|
||||||
"E2D",
|
"E2D",
|
||||||
};
|
};
|
||||||
static void printFSM(ChildFSM* pFSM){
|
static void printFSM(ChildFSM* pFSM){
|
||||||
printf(" \t\tChildFSM: ");
|
FSM_LOG(" \t\tChildFSM: ");
|
||||||
printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
|
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,8 @@ int main(){
|
||||||
cFSM = createChildFSM();
|
cFSM = createChildFSM();
|
||||||
pFSM = createParentFSM();
|
pFSM = createParentFSM();
|
||||||
|
|
||||||
setChildNum(BASE_FSM(pFSM), 1);
|
setChildNum((pFSM), 1);
|
||||||
registerChildFSM(BASE_FSM(pFSM), BASE_FSM(cFSM), 0);
|
registerChildFSM((pFSM), (cFSM), 0);
|
||||||
|
|
||||||
for (int i = 0; i < 15; i++)
|
for (int i = 0; i < 15; i++)
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,6 @@ int main(){
|
||||||
ChildFSMData* data = getData((FSM_Ptr)(cFSM));
|
ChildFSMData* data = getData((FSM_Ptr)(cFSM));
|
||||||
printf(" %d ", data->arrindex);
|
printf(" %d ", data->arrindex);
|
||||||
|
|
||||||
setEvent((FSM_Ptr)pFSM);
|
|
||||||
|
|
||||||
vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM);
|
vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue