76 lines
2.1 KiB
C
76 lines
2.1 KiB
C
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
|
|||
|
#include "FSM_protected.h"
|
|||
|
#include "keyFSM.h"
|
|||
|
#include "keyFSM_private.h"
|
|||
|
|
|||
|
/*
|
|||
|
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
|||
|
*/
|
|||
|
static Event ceventArr[20] = {
|
|||
|
Idle_Event,
|
|||
|
Idle_Event,
|
|||
|
Idle2D,
|
|||
|
Idle_Event,
|
|||
|
Idle_Event,
|
|||
|
D2E,
|
|||
|
E2D,
|
|||
|
D2E,
|
|||
|
Idle_Event,
|
|||
|
Idle_Event,
|
|||
|
Idle_Event,
|
|||
|
Idle_Event,
|
|||
|
};
|
|||
|
|
|||
|
static Event selectEvent(KeyFSMData *data){ // 必须重新实现
|
|||
|
return ceventArr[data->arrindex];
|
|||
|
}
|
|||
|
|
|||
|
static void step(KeyFSM* pFSM){
|
|||
|
printFSM(pFSM);
|
|||
|
stepBaseFSM(BASE_FSM(pFSM));
|
|||
|
}
|
|||
|
|
|||
|
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
|||
|
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
|
|||
|
data->arrindex = 0;
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
唯一外界调用的函数
|
|||
|
*/
|
|||
|
|
|||
|
KeyFSM *createKeyFSM(){
|
|||
|
|
|||
|
KeyFSM *pFSM;
|
|||
|
pFSM = (KeyFSM *)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;
|
|||
|
|
|||
|
constructFSM((FSM_Ptr)pFSM);
|
|||
|
|
|||
|
return pFSM;
|
|||
|
}
|