电脑上能跑了

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)
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/usr SRC_FSM_USR)
aux_source_directory(src SRC_SUB)
aux_source_directory(. SRC_CUR)
# set(keytest 123)
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})
include_directories(include)
add_executable(test ${SRC_FSM_OOP} ${SRC_FSM_USR})

View File

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

View File

@ -1,8 +1,8 @@
#ifndef __FSM_PUBLIC_H_
#define __FSM_PUBLIC_H_
// #define BASE_FSM(ptr) ((FSM *)(ptr))
// #define BASE_PTR (FSM *)
#define BASE_FSM(ptr) ((FSM *)(ptr))
#define BASE_PTR (FSM *)
typedef struct _FSM FSM;
typedef FSM * FSM_Ptr;

View File

@ -50,94 +50,90 @@ const static char *eventStr[] = {
State StartHandler(){
printf(" start ");
FSM_LOG(" start ");
return A;
}
State A2BHandler(){
printf(" A2B ");
FSM_LOG(" A2B ");
return B;
}
State B2AHandler(){
printf(" B2A ");
FSM_LOG(" B2A ");
return A;
}
State B2CHandler(){
printf(" B2C ");
FSM_LOG(" B2C ");
return C;
}
State C2AHandler(){
printf(" C2A ");
FSM_LOG(" C2A ");
return A;
}
void A_enterAction(){
printf(" enterA ");
FSM_LOG(" enterA ");
}
void A_duringAction(){
printf(" duringA ");
FSM_LOG(" duringA ");
}
void A_exitAction(){
printf(" exitA ");
FSM_LOG(" exitA ");
}
void B_enterAction(FSM *pFSM){
printf(" enterB ");
void B_enterAction(void *data, FSM **childFSM){
FSM_LOG(" enterB ");
FSM *cFSM = pFSM->privateVars.childFSM[0];
FSM *cFSM = childFSM[0];
cFSM->vtbl.step(cFSM);
}
void B_duringAction(FSM *pFSM){
printf(" duringB ");
void B_duringAction(void *data, FSM **childFSM){
FSM_LOG(" duringB ");
FSM *cFSM = pFSM->privateVars.childFSM[0];
FSM *cFSM = childFSM[0];
cFSM->vtbl.step(cFSM);
}
void B_exitAction(FSM *pFSM){
FSM *cFSM = pFSM->privateVars.childFSM[0];
void B_exitAction(void *data, FSM **childFSM){
FSM *cFSM = childFSM[0];
cFSM->vtbl.reset(cFSM);
printf(" exitB ");
FSM_LOG(" exitB ");
}
void C_enterAction(){
printf(" enterC ");
FSM_LOG(" enterC ");
}
void C_duringAction(){
printf(" duringC ");
FSM_LOG(" duringC ");
}
void C_exitAction(){
printf(" exitC ");
FSM_LOG(" exitC ");
}
static void setupHandler(FSMHandler* fcns){
typedef int (*transitionHandlerPtr)(FSM* pFSM);
#define AVOID_WARNING(handler) (transitionHandlerPtr)handler
fcns->duringActionTable[A] = A_duringAction;
fcns->duringActionTable[B] = B_duringAction;
fcns->duringActionTable[C] = C_duringAction;
addStateActionFcn(during, A);
addStateActionFcn(during, B);
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;
fcns->enterActionTable[C] = C_enterAction;
fcns->enterActionTable[A] = A_enterAction;
fcns->exitActionTable[A] = A_exitAction;
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);
addTransitionHandler(Idle, Start);
addTransitionHandler(A, A2B);
addTransitionHandler(B, B2A);
addTransitionHandler(B, B2C);
addTransitionHandler(C, C2A);
}
@ -167,21 +163,21 @@ static Event selectEvent(ParentFSMData *data){
end
*/
static void printFSM(ParentFSM* pFSM){
printf("\tParentFSM: ");
static void FSM_LOGSM(ParentFSM* pFSM){
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){
printFSM(pFSM);
FSM_LOGSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
}
static void reset(ParentFSM* pFSM){
resetBaseFSM(BASE_FSM(pFSM));
printf(" ParentFSM-reset");
FSM_LOG(" ParentFSM-reset");
}
static void initData(ParentFSM *pFSM){
@ -197,11 +193,10 @@ ParentFSM *createParentFSM(){
ParentFSM *pFSM;
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.vtbl.step = step;
pFSM->base.vtbl.selectEvent = selectEvent;
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
constructFSM((FSM_Ptr)pFSM);
return pFSM;

View File

@ -36,23 +36,24 @@ static void initData(ChildFSM *pFSM){ // 必须重新实现
ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData));
data->arrindex = 0;
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
pFSM->base.data = data;
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E);
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D);
addStateActionFcn(during, E);
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);
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction;
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);
addTransitionHandler(Idle, Idle2D);
addTransitionHandler(Idle, Idle2E);
addTransitionHandler(D, D2E);
addTransitionHandler(E, E2D);
}
/*
@ -64,10 +65,10 @@ ChildFSM *createChildFSM(){
ChildFSM *pFSM;
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.vtbl.step = step;
pFSM->base.vtbl.selectEvent = selectEvent;
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
constructFSM((FSM_Ptr)pFSM);

View File

@ -31,28 +31,28 @@ typedef enum _State
void actionFcn(enter, D)()
{
printf(" enterD ");
FSM_LOG(" enterD ");
}
void actionFcn(during, D)()
{
printf(" duringD ");
FSM_LOG(" duringD ");
}
void actionFcn(exit, D)()
{
printf(" exitD ");
FSM_LOG(" exitD ");
}
void actionFcn(enter, E)()
{
printf(" enterE ");
FSM_LOG(" enterE ");
}
void actionFcn(during, E)()
{
printf(" duringE ");
FSM_LOG(" duringE ");
}
void actionFcn(exit, E)()
{
printf(" exitE ");
FSM_LOG(" exitE ");
}
/*
@ -72,25 +72,25 @@ typedef enum _Event{
State transitionHandler(Idle2D)()
{
printf(" Idle2D ");
FSM_LOG(" Idle2D ");
return D;
}
State transitionHandler(Idle2E)()
{
printf(" Idle2E ");
FSM_LOG(" Idle2E ");
return E;
}
State transitionHandler(D2E)()
{
printf(" D2E ");
FSM_LOG(" D2E ");
return E;
}
State transitionHandler(E2D)()
{
printf(" E2D ");
FSM_LOG(" E2D ");
return D;
}
@ -113,8 +113,8 @@ const static char *eventStr[] = {
"E2D",
};
static void printFSM(ChildFSM* pFSM){
printf(" \t\tChildFSM: ");
printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
FSM_LOG(" \t\tChildFSM: ");
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
}

View File

@ -12,8 +12,8 @@ int main(){
cFSM = createChildFSM();
pFSM = createParentFSM();
setChildNum(BASE_FSM(pFSM), 1);
registerChildFSM(BASE_FSM(pFSM), BASE_FSM(cFSM), 0);
setChildNum((pFSM), 1);
registerChildFSM((pFSM), (cFSM), 0);
for (int i = 0; i < 15; i++)
{
@ -23,7 +23,6 @@ int main(){
ChildFSMData* data = getData((FSM_Ptr)(cFSM));
printf(" %d ", data->arrindex);
setEvent((FSM_Ptr)pFSM);
vptrFSM((FSM_Ptr)pFSM)->step((FSM_Ptr)pFSM);