电脑上能跑了
This commit is contained in:
parent
74c357c046
commit
a6ca70ae76
|
@ -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})
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "FSM_public.h"
|
||||
|
||||
// #define DSP28377
|
||||
#ifdef DSP28377
|
||||
#define NDEBUG
|
||||
#else
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)]);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue