电脑上能跑了

This commit is contained in:
godcreator 2024-01-30 16:06:02 +08:00
parent 74c357c046
commit a6ca70ae76
7 changed files with 86 additions and 88 deletions

View File

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

View File

@ -3,6 +3,7 @@
#include "FSM_public.h" #include "FSM_public.h"
// #define DSP28377
#ifdef DSP28377 #ifdef DSP28377
#define NDEBUG #define NDEBUG
#else #else

View File

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

View File

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

View File

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

View File

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

View File

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