Compare commits

...

16 Commits

Author SHA1 Message Date
TrashGod 50b9788e6a 把状态的定义单独拉一个文件,把FSM的privatevars也单列一个文件,这样可以在cla里使用 2024-07-06 17:34:20 +08:00
godcreator02 27acc2bb1b 添加一个打印信息 2024-07-02 16:42:07 +08:00
godcreator02 d48d5c7cc1 父子状态机测试,父状态机during166,第一次进入子状态机530,后续during子状态机319,子状态机状态变化416 2024-07-02 14:51:35 +08:00
godcreator02 ea121bcb29 在DSP上测试按键状态机ok,168-289 2024-07-02 14:44:07 +08:00
TrashGod 951e6d1695 按键状态机编译通过 2024-06-28 22:39:41 +08:00
TrashGod 010e6a907f 按键状态机在vscode可以跑了 2024-06-28 22:13:30 +08:00
TrashGod 2667b895df Merge branch 'feature/重新加入子状态机' into develop 2024-06-28 21:45:08 +08:00
TrashGod f0c905baa9 no message 2024-06-28 21:44:33 +08:00
TrashGod 5240b83578 目前看起来没问题了,明天去板子上测试一下 2024-06-28 21:40:28 +08:00
TrashGod f48889bf23 封装了一下函数,更好懂了 2024-06-28 19:45:02 +08:00
TrashGod 58d2918d06 跑起来和plecs的结果一样 2024-06-28 19:13:27 +08:00
TrashGod 6cefb9dae5 去掉了template的默认状态,和plecs对标 2024-06-28 17:43:17 +08:00
godcreator02 d6791ef8d4 bug不少,还需要修复 2024-06-26 20:21:14 +08:00
godcreator02 04c8c07b8f 去掉了step函数里所有的if,NULL函数用一个空函数代替,这样代码运行速度提升不少,最快178,最慢255 2024-06-22 20:49:23 +08:00
godcreator02 0cff421be5 保存doxygen配置 2024-05-07 18:35:14 +08:00
godcreator02 e31139d36b Merge tag '2.2' into develop
2.2
2024-05-07 16:46:28 +08:00
31 changed files with 1833 additions and 594 deletions

View File

@ -44,15 +44,8 @@
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FP_MODE.860711964" name="Floating Point mode (--fp_mode)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FP_MODE" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FP_MODE.relaxed" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.INCLUDE_PATH.2094867255" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.INCLUDE_PATH" valueType="includePath">
<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/baseFSM"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/usr"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/include/common"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/include/headers"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../key_FSM/FSM_OOP/usr"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../key_FSM/FSM_OOP/baseFSM"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../FSM_vscode/FSM_OOP/childtest"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../FSM_vscode/FSM_OOP/baseFSM"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../FSM_vscode/FSM_OOP/keytest"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/keytest"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/childtest"/>
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/baseFSM"/>
@ -61,8 +54,6 @@
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.ADVICE__PERFORMANCE.171868085" name="Provide advice on optimization techniques (--advice:performance)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.ADVICE__PERFORMANCE" value="--advice:performance=all" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DEFINE.1681891118" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DEFINE" valueType="definedSymbols">
<listOptionValue builtIn="false" value="_INLINE"/>
<listOptionValue builtIn="false" value="NDEBUG"/>
<listOptionValue builtIn="false" value="DSP28377"/>
<listOptionValue builtIn="false" value="CPU1"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DEBUGGING_MODEL.1901056751" name="Debugging model" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
@ -73,6 +64,12 @@
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.1704240081" name="Wrap diagnostic messages (--diag_wrap) [deprecated]" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DISPLAY_ERROR_NUMBER.65226327" name="Emit diagnostic identifier numbers (--display_error_number, -pden) [deprecated]" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.ABI.476173017" name="Application binary interface [See 'General' page to edit] (--abi)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.ABI.eabi" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_SUPPRESS.591047759" name="Suppress diagnostic &lt;id&gt; (--diag_suppress, -pds)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_SUPPRESS" valueType="stringList">
<listOptionValue builtIn="false" value="303"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OTHER_FLAGS.1805123875" name="Other flags" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OTHER_FLAGS" valueType="stringList">
<listOptionValue builtIn="false" value=""/>
</option>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__C_SRCS.1245540863" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__C_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__CPP_SRCS.2068954361" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__CPP_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__ASM_SRCS.812447921" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__ASM_SRCS"/>
@ -101,6 +98,12 @@
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.ENTRY_POINT.1816405551" name="Specify program entry point for the output module (--entry_point, -e)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.ENTRY_POINT" value="code_start" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.CINIT_COMPRESSION.934245867" name="Compress ELF C style auto initialization data (--cinit_compression)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.CINIT_COMPRESSION" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.CINIT_COMPRESSION.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.INITIALIZATION_MODEL.483430313" name="Initialization model" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.INITIALIZATION_MODEL" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.INITIALIZATION_MODEL.RAM_MODEL" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_SUPPRESS.828333989" name="Suppress diagnostic &lt;id&gt; (--diag_suppress)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_SUPPRESS" valueType="stringList"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.NO_WARNINGS.1360684884" name="Suppress warnings (--no_warnings)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.NO_WARNINGS" value="false" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.NO_DEMANGLE.134029592" name="Don't demangle symbol names in diagnostics (--no_demangle)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.NO_DEMANGLE" value="false" valueType="boolean"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_REMARK.591856308" name="Treat diagnostic &lt;id&gt; as remark (--diag_remark)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_REMARK" valueType="stringList"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_ERROR.1347655044" name="Treat diagnostic &lt;id&gt; as error (--diag_error)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_ERROR" valueType="stringList"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.EMIT_WARNINGS_AS_ERRORS.320090475" name="Treat warnings as errors (--emit_warnings_as_errors, -pdew)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.EMIT_WARNINGS_AS_ERRORS" value="false" valueType="boolean"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__CMD_SRCS.737359659" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__CMD_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__CMD2_SRCS.1248498450" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__CMD2_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__GEN_CMDS.212203086" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__GEN_CMDS"/>
@ -109,7 +112,7 @@
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="ParentFSM.c|childFSM.c|2837x_FLASH_lnk_cpu1.cmd|source/F2837xD_SWPrioritizedPieVect.c|2837xD_FLASH_lnk_cpu1.cmd" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry excluding="2837x_FLASH_lnk_cpu1.cmd|source/F2837xD_SWPrioritizedPieVect.c|2837xD_FLASH_lnk_cpu1.cmd" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>

View File

@ -19,3 +19,6 @@ encoding//CPU1_RAM/source/subdir_vars.mk=UTF-8
encoding//CPU1_RAM/sources.mk=UTF-8
encoding//CPU1_RAM/subdir_rules.mk=UTF-8
encoding//CPU1_RAM/subdir_vars.mk=UTF-8
encoding/<project>=UTF-8
encoding/FSM_private.h=UTF-8
encoding/FSM_protected.h=UTF-8

View File

@ -8,6 +8,8 @@
#define LED_BLINKY_GPIO 2
#define INPUT_GPIO 15
#pragma diag_suppress 303
uint32_t exec_time[50];
uint32_t stop_time;
int index = 0;
@ -30,36 +32,6 @@ int isDown = 0;
//ChildFSM *cFSM;
//ParentFSM *pFSM;
//void childTest(){
//
// cFSM = createChildFSM();
// pFSM = createParentFSM();
//
// setChildNum((pFSM), 1);
// registerChildFSM((pFSM), (cFSM), 0);
//
// for (int i = 0; i < 15; i++)
// {
// ParentFSM_Input(pFSM)->arrindex = i;
// SetPreloaderReady(pFSM);
//
// ChildFSM_Input(cFSM)->arrindex = i;
// SetPreloaderReady(cFSM);
//
// ChildFSMData* data = getData((FSM *)(cFSM));
// printf(" %d ", data->arrindex);
//
// tic();
// _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
// toc(index++);
// printf("\n");
// }
//}
KeyFSM* keyFSM;
@ -68,7 +40,6 @@ KeyIn keystat;
void keyFSMTest(){
keyFSM = createKeyFSM();
data = _getData((FSM *)keyFSM);
printf("hello 28377\n");
@ -80,8 +51,9 @@ void keyFSMTest(){
Step(keyFSM);
toc(index++);
if(data->internal.out != Idle){
printf("%s\n", keyStr[data->internal.out]);
KeyOut out = readKeyFSMOut(keyFSM);
if(out != Idle){
printf("\t\t\t\t%d\n", out);
}
else{
index--;
@ -91,27 +63,41 @@ void keyFSMTest(){
}
}
typedef int (*fcn)(int, int);
int printtest(int a, int b){
return a+b;
}
void funptrTest(){
fcn fcnptr;
fcnptr = printtest;
int index = 0;
while(1){
ChildFSM *cFSM;
ParentFSM *pFSM;
enum ParentFSMSignals i[20] = {0, Signal_toA, Signal_toB,0,0,0,0,0, Signal_toC, Signal_toA, Signal_toB, Signal_toA};
enum ChildFSMSignals j[20] = {0,0,Signal_toD,0,0,Signal_toE, Signal_toD, Signal_toE,0,0,0,0};
void childFSMTest(){
cFSM = createChildFSM();
pFSM = createParentFSM();
bind_ParentFSM_ChildFSMs(pFSM, (FSM *)cFSM);
((ParentFSMData *)GetData(cFSM))->external.x = 1;
for (int k = 0; k < 15; k++)
{
printf("i: ",k+1);
SetSignal(pFSM, i[k]);
SetSignal(cFSM, j[k]);
if(k > 5){
((ParentFSMData *)GetData(cFSM))->external.x = 0;
}
tic();
int c = fcnptr(10, 20);
toc(index);
index++;
Step(pFSM);
toc(index++);
printf("%d\n", c);
DELAY_US(20*1000);
printf("\n");
}
}
void main(void)
{
InitSysCtrl();
@ -124,10 +110,8 @@ void main(void)
GPIO_SetupPinMux(LED_BLINKY_GPIO, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP);
// childTest();
keyFSMTest();
// funptrTest();
// keyFSMTest();
childFSMTest();
}

View File

@ -36,7 +36,9 @@
"*.tcc": "c",
"typeinfo": "c",
"templatefsm.h": "c",
"templatefsm_private.h": "c"
"templatefsm_private.h": "c",
"keyfsm_private.h": "c",
"childfsm_state.h": "c"
},

View File

@ -6,8 +6,8 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
set(keytest 789)
# set(child_parent 789)
# set(keytest 789)
set(child_parent 789)
if(DEFINED keytest)
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)

View File

@ -27,25 +27,32 @@
*
* @param pFSM
*/
static inline void setNextState(FSM* pFSM){
int curState = pFSM->privateVars->curState;
if(curState != 0){
pFSM->signals.lastTriggeredSignal = Idle_Signal;
pFSM->privateVars->nextState = pFSM->privateVars->fcns.selectNextState[curState](pFSM->data, &pFSM->signals);
pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState;
}
static inline void updateNextState(FSM* pFSM){
int curState = getCurState(pFSM);
if(0 == pFSM->privateVars->numChild)
return;
for (int i = 0; i < pFSM->privateVars->numChild; i++)
{
FSM *cFSM = pFSM->privateVars->childFSM[i];
setNextState(cFSM);
}
int nextState = doSelectNextState(pFSM, curState);
setNextState(pFSM, nextState);
updateIndex(pFSM);
}
/**
* @brief 退exit函数
*
* @param pFSM
*/
static void shutFSM(FSM *pFSM)
{
int curState = getCurState(pFSM);
if(hasChildFSM(pFSM, curState)){
shutFSM(getChildFSM(pFSM, curState));
}
doExit(pFSM);
setCurState(pFSM, FSM_Idle);
}
/**
* @brief
* @deprecated
@ -71,88 +78,85 @@ void stepBaseFSM(FSM *pFSM)
{
pFSM->pureVtbl.loadExternalData(pFSM->data);
// preload(pFSM);
setNextState(pFSM);
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
updateNextState(pFSM);
doResetSignals(pFSM);
FSMHandler *fcns = &pFSM->privateVars->fcns;
int curState = pFSM->privateVars->curState;
void *data = pFSM->data;
FSM **childFSM = pFSM->privateVars->childFSM;
int index = pFSM->privateVars->index;
int nextState = pFSM->privateVars->nextState;
int curState = getCurState(pFSM);
int index = getIndex(pFSM);
int nextState = getNextState(pFSM);
if(nextState && curState != nextState){ // 状态切换
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM);
// 退出子状态机
if(hasChildFSM(pFSM, curState)){
FSM *cFSM = getChildFSM(pFSM, curState);
shutFSM(cFSM);
}
if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数
(*fcns->transitionTable[index])(data);
doExit(pFSM);
doTransition(pFSM); // 有特定的状态转移函数
doGeneralTransition(pFSM); // 通用状态转移函数
if(fcns->transitionGeneralAction != NULL)
fcns->transitionGeneralAction(data); // 通用状态转移函数
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
doEnter(pFSM, nextState);
pFSM->privateVars->curState = nextState;
}
else if(curState == 0){ // 处理刚运行进入的默认状态
nextState = pFSM->privateVars->defaultState;
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
pFSM->privateVars->curState = nextState;
// 进子状态机,必须从默认状态开始
if(hasChildFSM(pFSM, nextState)){
FSM *cFSM = getChildFSM(pFSM, nextState);
Step(cFSM);
}
setCurState(pFSM, nextState);
}
else // 状态机没动
{
if (fcns->duringActionTable[curState] != NULL)
fcns->duringActionTable[curState](data, childFSM);
if(!hasChildFSM(pFSM, curState)){
doDuring(pFSM);
}
else{
FSM *cFSM = getChildFSM(pFSM, curState);
Step(cFSM);
}
}
}
/* -------------------------------------------------------------------------- */
/* public 函数 */
/* -------------------------------------------------------------------------- */
void resetBaseFSM(FSM *pFSM)
{
if (pFSM->privateVars->fcns.exitActionTable[pFSM->privateVars->curState] != NULL)
pFSM->privateVars->fcns.exitActionTable[pFSM->privateVars->curState](pFSM->data, pFSM->privateVars->childFSM);
pFSM->privateVars->curState = 0;
}
void _stepFSM(FSM *pFSM){
pFSM->publicFcns.step(pFSM);
}
const char * _curState2ASCII(FSM *pFSM){
return pFSM->publicFcns.curState2ASCII(pFSM);
}
int getFSMCurState(FSM *pFSM){
inline int getFSMCurState(FSM *pFSM){
return pFSM->privateVars->curState;
}
int getFSMNextState(FSM *pFSM){
inline int getFSMNextState(FSM *pFSM){
return pFSM->privateVars->nextState;
}
void setChildNum(FSM *pFSM, int num){
pFSM->privateVars->numChild = num;
pFSM->privateVars->childFSM = (FSM **)calloc(num, sizeof(FSM *));
void registerChildFSM(FSM *parent, FSM *child, int state){
parent->privateVars->childFSMTable[state] = child;
}
void registerChildFSM(FSM *parent, FSM *child, int index){
parent->privateVars->childFSM[index] = child;
}
const void *_getData(FSM* pFSM){
return (const void *)pFSM->data;
}
void _setSignal(FSM *pFSM, Uint16 signalFlag){
void _setSignal(FSM *pFSM, unsigned int signalFlag){
pFSM->signals.all |= (1 << signalFlag);
}
/**
* @brief
* @deprecated
@ -200,14 +204,14 @@ void _clearPreloaderOverFlag(FSM *pFSM){
/* -------------------------------------------------------------------------- */
/* 构造函数,分两段,先新建再赋值 */
/* -------------------------------------------------------------------------- */
FSM* newBaseFSM(int numState, int defaultState){
FSM* newBaseFSM(int numState){
typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *);
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars = newFMSPrivateVars(numState, defaultState);
pFSM->privateVars = newFMSPrivateVars(numState);
FSMPureVtbl pureVtbl = {
.setupHandler = NULL,
@ -220,7 +224,6 @@ FSM* newBaseFSM(int numState, int defaultState){
pFSM->pureVtbl = pureVtbl;
pFSM->publicFcns.step = stepBaseFSM;
pFSM->publicFcns.reset = resetBaseFSM;
return pFSM;
}
@ -231,6 +234,8 @@ void constructFSM(FSM* pFSM){
assert(pFSM->pureVtbl.initData);
assert(pFSM->pureVtbl.initDataLoader);
pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns);
pFSM->pureVtbl.initData(pFSM);
pFSM->pureVtbl.initDataLoader(pFSM);

View File

@ -16,60 +16,27 @@
#include <string.h>
#include "FSM_protected.h"
#include "FSM_private_vars.h"
typedef struct FSMHandler FSMHandler;
typedef struct FSM FSM;
typedef struct FSMSignals FSMSignals;
/* -------------------------------------------------------------------------- */
/* private数据类型 */
/* -------------------------------------------------------------------------- */
/**
* @brief
* @deprecated
*
*/
typedef struct FSMDataLoader
{
void *shadowData;
int isReady;
int isOverflow;
size_t size;
}FSMDataLoader;
/**
* @brief 访
*
* @brief
*/
typedef struct FSMPrivateVars
{
int numState; /**< 状态数量 */
int defaultState; /**< Idle状态不能停留必须指定一个初始状态 */
int curState; /**< 当前状态 */
int nextState; /**< nextState为Idle代表状态机不发生变化 */
int index; /**< 状态转移函数表对应的标号 */
FSMHandler fcns; /**< 状态函数表 */
int numChild; /**< @deprecated 和子状态机相关的暂时弃用 */
FSM **childFSM; /**< @deprecated 和子状态机相关的暂时弃用 */
FSMDataLoader preloader; /**< @deprecated 弃用 */
}FSMPrivateVars;
static void empty_func(void * a){
}
/**
* @brief FSM.c中调用
*
* @param numState
* @param defaultState
* @return FSMPrivateVars*
*/
FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
FSMPrivateVars* newFMSPrivateVars(int numState){
typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *);
@ -77,24 +44,109 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars));
privateVars->numState = numState;
privateVars->defaultState = defaultState;
privateVars->curState = 0;
privateVars->nextState = 0;
privateVars->numChild = 0;
privateVars->childFSMTable = calloc(numState, sizeof(FSM));
privateVars->preloader.isReady = 0;
privateVars->fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
privateVars->fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
for (int i = 0; i < numState; i++)
{
privateVars->fcns.duringActionTable[i] = empty_func;
privateVars->fcns.enterActionTable[i] = empty_func;
privateVars->fcns.exitActionTable[i] = empty_func;
}
privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr)); // 包括默认状态,所以要+1
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
for (int i = 0; i < numState * numState; i++)
{
privateVars->fcns.transitionTable[i] = empty_func;
}
privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
privateVars->fcns.transitionGeneralAction = empty_func;
return privateVars;
}
#endif
/* -------------------------------------------------------------------------- */
/* 以下开始是FSM私有函数 */
/* -------------------------------------------------------------------------- */
static inline FSM * getChildFSM(FSM *pFSM, int state){
return pFSM->privateVars->childFSMTable[state];
}
static inline int hasChildFSM(FSM *pFSM, int state){
return (pFSM->privateVars->childFSMTable[state] != NULL);
}
static inline void setCurState(FSM *pFSM, int state){
pFSM->privateVars->curState = state;
}
static inline int getCurState(FSM *pFSM){
return pFSM->privateVars->curState;
}
static inline int setNextState(FSM *pFSM, int state){
return pFSM->privateVars->nextState = state;
}
static inline int getNextState(FSM *pFSM){
return pFSM->privateVars->nextState;
}
static inline int getIndex(FSM *pFSM){
return pFSM->privateVars->index;
}
static inline void updateIndex(FSM *pFSM){
pFSM->privateVars->index = pFSM->privateVars->curState * pFSM->privateVars->numState + pFSM->privateVars->nextState;
}
static inline void doExit(FSM *pFSM){
pFSM->privateVars->fcns.exitActionTable[getCurState(pFSM)](pFSM->data);
}
static inline void doEnter(FSM *pFSM, int state){
pFSM->privateVars->fcns.enterActionTable[state](pFSM->data);
}
static inline void doDuring(FSM *pFSM){
pFSM->privateVars->fcns.duringActionTable[getCurState(pFSM)](pFSM->data);
}
static inline void doGeneralTransition(FSM *pFSM){
pFSM->privateVars->fcns.transitionGeneralAction(pFSM->data);
}
static inline void doTransition(FSM *pFSM){
int index = getIndex(pFSM);
pFSM->privateVars->fcns.transitionTable[index](pFSM->data);
}
static inline int doSelectNextState(FSM *pFSM, int state){
return pFSM->privateVars->fcns.selectNextState[state](pFSM->data, &pFSM->signals);
}
static inline void doResetSignals(FSM *pFSM){
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
}
static inline void clearLastTriggeredSignal(FSM *pFSM){
pFSM->signals.lastTriggeredSignal = FSM_Idle;
}
#endif

View File

@ -0,0 +1,63 @@
/**
* @file FSM_private.h
* @author (dalaoshi@stu.xjtu.edu.cn)
* @brief 使
* @details 访
* @version 2.1
* @date 2024-05-07
*
* @copyright 2024
*
*/
#ifndef __FSM_PRIVATE_VARS_H_
#define __FSM_PRIVATE_VARS_H_
#include "FSM_protected.h"
typedef struct FSMHandler FSMHandler;
typedef struct FSM FSM;
typedef struct FSMSignals FSMSignals;
/* -------------------------------------------------------------------------- */
/* private数据类型 */
/* -------------------------------------------------------------------------- */
/**
* @brief
* @deprecated
*
*/
typedef struct FSMDataLoader
{
void *shadowData;
int isReady;
int isOverflow;
unsigned long long size;
}FSMDataLoader;
/**
* @brief 访
*
*/
typedef struct FSMPrivateVars
{
int numState; /**< 状态数量 */
int defaultState; /**< Idle状态不能停留必须指定一个初始状态 */
int curState; /**< 当前状态 */
int nextState; /**< nextState为Idle代表状态机不发生变化 */
int index; /**< 状态转移函数表对应的标号 */
FSMHandler fcns; /**< 状态函数表 */
// FSM *childFSM; /**< 限定只能有一个子状态机 */
FSM **childFSMTable; /**< 每个状态都可配置一个子状态机 */
FSMDataLoader preloader; /**< @deprecated 弃用 */
}FSMPrivateVars;
#endif

View File

@ -48,10 +48,11 @@ typedef struct FSM FSM;
typedef struct FSMSignals FSMSignals;
typedef struct FSMPrivateVars FSMPrivateVars;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_State_Fcns)(void *data);
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
typedef const char * (*Avoid_WARNING_2ASCII_Fcns)(FSM *pFSM);
typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals, void *);
typedef void (*Avoid_WARNING_loadData_Fcns)(void*);
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
@ -68,13 +69,12 @@ typedef struct FSMHandler{
int (**selectNextState)(void *data, FSMSignals* signals); /**< 每个状态配置的状态选择函数 */
void (**transitionTable)(void *data); /**< 状态转移函数表 */
void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行 */
void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行。常用来清空内部变量 */
void (**enterActionTable)(void *data, FSM **cFSM); /**< 进入状态时运行的函数和plecs对标 */
void (**duringActionTable)(void *data, FSM **cFSM); /**< 状态不变时运行的函数和plecs对标 */
void (**exitActionTable)(void *data, FSM **cFSM); /**< 状态退出时运行的函数和plecs对标 */
void (**enterActionTable)(void *data); /**< 进入状态时运行的函数和plecs对标 */
void (**duringActionTable)(void *data); /**< 状态不变时运行的函数和plecs对标 */
void (**exitActionTable)(void *data); /**< 状态退出时运行的函数和plecs对标 */
void (**childFSMStepTable)(FSM **cFSM); /**< @deprecated 子状态机暂时弃用 */
}FSMHandler;
/**
@ -84,10 +84,12 @@ typedef struct FSMHandler{
*/
typedef struct FSMSignals
{
Uint16 all; /**< 外部信号 */
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
unsigned int all; /**< 外部信号 */
unsigned int lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
}FSMSignals;
#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */
#define FSM_Idle 0 /**< 清空上次触发信号,占用第一个信号位 */
/* -------------------------------------------------------------------------- */
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
@ -133,17 +135,16 @@ typedef struct FSM
/* -------------------------------------------------------------------------- */
void stepBaseFSM(FSM *pFSM);
void constructFSM(FSM* pFSM);
FSM* newBaseFSM(int numState, int defaultState);
void resetBaseFSM(FSM *pFSM);
FSM* newBaseFSM(int numState);
void registerChildFSM(FSM *parent, FSM *child, int state);
/* -------------------------------------------------------------------------- */
/* 内联函数 */
/* -------------------------------------------------------------------------- */
static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){
static inline void clearSignal(FSMSignals *signals, unsigned int signalFlag){
signals->all &= ~(1 << signalFlag);
}
static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){
static inline unsigned int getSignal(FSMSignals *signals, unsigned int signalFlag){
return (signals->all >> signalFlag) & 1;
}
static inline void clearAllSignals(FSMSignals *signals){
@ -151,4 +152,6 @@ static inline void clearAllSignals(FSMSignals *signals){
}
#endif

View File

@ -11,8 +11,6 @@
#ifndef __FSM_PUBLIC_H_
#define __FSM_PUBLIC_H_
typedef unsigned int Uint16;
typedef unsigned long Uint32;
#define BASE_FSM(ptr) ((FSM *)(ptr))
#define BASE_PTR (FSM *)
@ -23,30 +21,29 @@ typedef struct FSMPublicFcns
{
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
const char *(*curState2ASCII)(FSM *pFSM);
}FSMPublicFcns;
/* -------------------------------- 避免警告的函数定义 ------------------------------- */
#define Step(pFSM) _stepFSM((FSM *)pFSM) /**< 外界调用这个 */
#define CurState2ASCII(pFSM) _curState2ASCII((FSM *)pFSM) /**< 外界调用这个 */
#define GetData(pFSM) _getData((FSM*)pFSM) /**< 外界调用这个 */
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal) /**< 外界调用这个 */
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); /**< @deprecated */
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
void _stepFSM(FSM *pFSM);
const char * _curState2ASCII(FSM *pFSM);
/* --------------------------------- 状态机信息获取 -------------------------------- */
int getFSMCurState(FSM *pFSM);
int getFSMNextState(FSM *pFSM);
void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index);
/* ------------------------------ Data和Signals ------------------------------ */
const void *_getData(FSM* pFSM);
void _setSignal(FSM *pFSM, Uint16 signalFlag);
void _setSignal(FSM *pFSM, unsigned int signalFlag);
/* ---------------------------------- 预装载器 ---------------------------------- */
void *_preloadIn(FSM *pFSM);

View File

@ -1,123 +1,83 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "parentFSM.h"
#include "FSM_protected.h"
#define DEFAULT_STATE Idle
typedef struct _ParentFSM
{
FSM base;
}ParentFSM;
typedef enum _State{
Idle,
A,
B,
C,
Count_State,
}State;
typedef enum _Event{
Idle_Event,
Start,
A2B,
B2A,
B2C,
C2A,
Count_Event,
}Event;
const static char *stateStr[] = {
"Idle",
"A",
"B",
"C",
};
const static char *eventStr[] = {
"Idle",
"Start",
"A2B",
"B2A",
"B2C",
"C2A",
};
#include "parentFSM.h"
#include "parentFSM_private.h"
State StartHandler(){
FSM_LOG(" start ");
return A;
}
State A2BHandler(){
FSM_LOG(" A2B ");
return B;
}
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
State B2AHandler(){
FSM_LOG(" B2A ");
return A;
}
State B2CHandler(){
FSM_LOG(" B2C ");
return C;
}
State C2AHandler(){
FSM_LOG(" C2A ");
return A;
/**
* @brief
* @deprecated data是否需要加锁再说
* @param data
*/
static void loadExternalData(ParentFSMData *data){ // 必须重新实现
}
void A_enterAction(){
FSM_LOG(" enterA ");
}
void A_duringAction(){
FSM_LOG(" duringA ");
}
void A_exitAction(){
FSM_LOG(" exitA ");
/**
* @brief
* @details notion
* @param signals
* @param data
*/
static void resetSignals(FSMSignals *signals, ParentFSMData *data){ // 必须重新实现
clearAllSignals(signals);
}
void B_enterAction(void *data, FSM **childFSM){
FSM_LOG(" enterB ");
FSM *cFSM = childFSM[0];
cFSM->pureVtbl.step(cFSM);
}
void B_duringAction(void *data, FSM **childFSM){
FSM_LOG(" duringB ");
/**
* @brief
*
* @param pFSM
*/
static void initData(ParentFSM *pFSM){ // 必须重新实现
ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData));
FSM *cFSM = childFSM[0];
cFSM->pureVtbl.step(cFSM);
}
void B_exitAction(void *data, FSM **childFSM){
FSM *cFSM = childFSM[0];
cFSM->pureVtbl.reset(cFSM);
ParentFSMData tempData = {
.external = {
.arrindex = 0,
.x = 0,
},
.internal = {
.inner1 = 0,
.y1 = 0,
},
};
*data = tempData;
FSM_LOG(" exitB ");
pFSM->base.data = data;
}
/**
* @brief
* @deprecated
* @param pFSM
*/
static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
// pFSM->base.privateVars->preloader.shadowData = malloc(sizeof(ParentFSMExternalData));
// pFSM->base.privateVars->preloader.size = sizeof(ParentFSMExternalData);
}
void C_enterAction(){
FSM_LOG(" enterC ");
}
void C_duringAction(){
FSM_LOG(" duringC ");
}
void C_exitAction(){
FSM_LOG(" exitC ");
}
static void setupHandler(FSMHandler* fcns){
/**
* @brief
*
* @param fcns
*/
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle);
addSelectNextStateFcn(A);
addSelectNextStateFcn(B);
addSelectNextStateFcn(C);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(during, A);
addStateActionFcn(during, B);
addStateActionFcn(during, C);
@ -128,85 +88,68 @@ static void setupHandler(FSMHandler* fcns){
addStateActionFcn(exit, B);
addStateActionFcn(exit, C);
addTransitionHandler(Idle, Start);
addTransitionHandler(A, A2B);
addTransitionHandler(B, B2A);
addTransitionHandler(B, B2C);
addTransitionHandler(C, C2A);
}
/*
begin
*/
Event peventArr[20] = {
Idle_Event,
Start,
A2B,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
B2C,
C2A,
A2B,
B2A,
};
static Event selectEvent(ParentFSMData *data){
return peventArr[data->arrindex];
}
/*
end
*/
static void printFSM(ParentFSM* pFSM){
FSM_LOG("\tParentFSM: ");
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]);
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(Idle, A);
addTransitionHandler(A, B);
addTransitionHandler(B, A);
addTransitionHandler(B, C);
addTransitionHandler(C, A);
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
}
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
/**
* @brief step函数
*
* @param pFSM
*/
static void step(ParentFSM* pFSM){
printFSM(pFSM);
_stepFSM(BASE_FSM(pFSM));
}
static void reset(ParentFSM* pFSM){
resetBaseFSM(BASE_FSM(pFSM));
FSM_LOG(" ParentFSM-reset");
}
static void initData(ParentFSM *pFSM){
ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData));
data->arrindex = 0;
pFSM->base.data = data;
}
static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(ParentFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ParentFSMData);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("NextState:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
}
/**
* @brief
*
* @param pFSM
* @param B_FSM B状态对应的子状态机的指针
*/
void bind_ParentFSM_ChildFSMs(ParentFSM *pFSM, FSM *B_FSM){
registerChildFSM((FSM *)pFSM, B_FSM, B);
}
/* -------------------------------------------------------------------------- */
/* 子类构造函数 */
/* -------------------------------------------------------------------------- */
/**
* @brief Create a Parent FSM object
* @details 访
* @return ParentFSM*
*/
ParentFSM *createParentFSM(){
ParentFSM *pFSM;
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM = (ParentFSM *)newBaseFSM(Count_State);
// 重新实现的函数
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData;
// 调用父类构造函数
constructFSM((FSM *)pFSM);
FSM_LOG("ok\n");
pFSM->base.pureVtbl.step = step;
pFSM->base.pureVtbl.selectNextState = selectEvent;
pFSM->base.pureVtbl.initData = initData;
pFSM->base.pureVtbl.setupHandler = setupHandler;
pFSM->base.pureVtbl.initDataLoader = initDataLoader;
constructFSM((FSM *)pFSM);
return pFSM;
}
}

View File

@ -0,0 +1,149 @@
#ifdef __PARENTFSM_PRIVATE_FSM_H_
#error This file can only be included once!!!
#else
#define __PARENTFSM_PRIVATE_FSM_H_
#endif
#include "FSM_protected.h"
#include "parentFSM.h"
#include "parentFSM_state.h"
#include <stdio.h>
/* -------------------------------------------------------------------------- */
/* 继承基类 */
/* -------------------------------------------------------------------------- */
typedef struct ParentFSM
{
FSM base;
}ParentFSM;
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle)(ParentFSMData *data, FSMSignals *signals){
return A;
}
static State selectNextStateFcn(A)(ParentFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_toB)){
signals->lastTriggeredSignal = Signal_toB;
return B;
}
return Idle;
}
static State selectNextStateFcn(B)(ParentFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_toA)){
signals->lastTriggeredSignal = Signal_toA;
return A;
}
else if(getSignal(signals, Signal_toC)){
signals->lastTriggeredSignal = Signal_toC;
return C;
}
return Idle;
}
static State selectNextStateFcn(C)(ParentFSM *data, FSMSignals *signals){
if(getSignal(signals, Signal_toA)){
signals->lastTriggeredSignal = Signal_toA;
return A;
}
return Idle;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, A)()
{
FSM_LOG(" enterA ");
}
static void actionFcn(during, A)()
{
FSM_LOG(" duringA ");
}
static void actionFcn(exit, A)()
{
FSM_LOG(" exitA ");
}
static void actionFcn(enter, B)()
{
FSM_LOG(" enterB ");
}
static void actionFcn(during, B)()
{
FSM_LOG(" duringB ");
}
static void actionFcn(exit, B)()
{
FSM_LOG(" exitB ");
}
static void actionFcn(enter, C)()
{
FSM_LOG(" enterC ");
}
static void actionFcn(during, C)()
{
FSM_LOG(" duringC ");
}
static void actionFcn(exit, C)()
{
FSM_LOG(" exitC");
}
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
static void transitionGeneralAction(ParentFSMData *data){
FSM_LOG("general");
}
static void transitionHandler(Idle, A)()
{
FSM_LOG(" Idle2A ");
}
static void transitionHandler(A, B)()
{
FSM_LOG(" A2B ");
}
static void transitionHandler(B, A)()
{
FSM_LOG(" B2A ");
}
static void transitionHandler(B, C)()
{
FSM_LOG(" B2C ");
}
static void transitionHandler(C, A)()
{
FSM_LOG(" C2A ");
}
/* -------------------------------------------------------------------------- */
/* 打印调试 */
/* -------------------------------------------------------------------------- */
const static char *stateStr[] = {
"Idle",
"A",
"B",
"C",
};
static void printFSM(ParentFSM* pFSM){
FSM_LOG(" \tParent: ");
FSM_LOG("CurrentState:%s, Action", stateStr[getFSMCurState((FSM *)pFSM)]);
}

View File

@ -1,82 +1,143 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "FSM_protected.h"
#include "childFSM.h"
#include "childFSM_private.h"
/*
*/
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(ChildFSMData *data){ // 必须重新实现
return ceventArr[data->arrindex];
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
/**
* @brief
* @deprecated data是否需要加锁再说
* @param data
*/
static void loadExternalData(ChildFSMData *data){ // 必须重新实现
}
static void step(ChildFSM* pFSM){
printFSM(pFSM);
_stepFSM(BASE_FSM(pFSM));
/**
* @brief
* @details notion
* @param signals
* @param data
*/
static void resetSignals(FSMSignals *signals, ChildFSMData *data){ // 必须重新实现
clearAllSignals(signals);
}
/**
* @brief
*
* @param pFSM
*/
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);
ChildFSMData tempData = {
.external = {
.arrindex = 0,
.x = 0,
},
.internal = {
.inner1 = 0,
.y1 = 0,
},
};
*data = tempData;
pFSM->base.data = data;
}
/**
* @brief
* @deprecated
* @param pFSM
*/
static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
// pFSM->base.privateVars->preloader.shadowData = malloc(sizeof(ChildFSMExternalData));
// pFSM->base.privateVars->preloader.size = sizeof(ChildFSMExternalData);
}
/**
* @brief
*
* @param fcns
*/
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, E);
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle);
addSelectNextStateFcn(D);
addSelectNextStateFcn(E);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(during, D);
addStateActionFcn(during, E);
addStateActionFcn(enter, D);
addStateActionFcn(exit, D);
addStateActionFcn(enter, E);
addStateActionFcn(exit, D);
addStateActionFcn(exit, E);
addTransitionHandler(Idle, Idle2D);
addTransitionHandler(Idle, Idle2E);
addTransitionHandler(D, D2E);
addTransitionHandler(E, E2D);
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(Idle, D);
addTransitionHandler(Idle, E);
addTransitionHandler(D, E);
addTransitionHandler(E, D);
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
}
/*
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
/**
* @brief step函数
*
* @param pFSM
*/
static void step(ChildFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("NextState:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
}
/* -------------------------------------------------------------------------- */
/* 子类构造函数 */
/* -------------------------------------------------------------------------- */
/**
* @brief Create a Child FSM object
* @details 访
* @return ChildFSM*
*/
ChildFSM *createChildFSM(){
ChildFSM *pFSM;
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM = (ChildFSM *)newBaseFSM(Count_State);
pFSM->base.pureVtbl.step = step;
pFSM->base.pureVtbl.selectNextState = selectEvent;
pFSM->base.pureVtbl.initData = initData;
pFSM->base.pureVtbl.setupHandler = setupHandler;
pFSM->base.pureVtbl.initDataLoader = initDataLoader;
// 重新实现的函数
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData;
constructFSM((FSM *)pFSM);
// 调用父类构造函数
constructFSM((FSM *)pFSM);
FSM_LOG("ok\n");
return pFSM;
}
}

View File

@ -1,17 +1,57 @@
#ifndef __CHILD_FSM_H_
#define __CHILD_FSM_H_
/* -------------------------------------------------------------------------- */
/* 提前做类型声明 */
/* -------------------------------------------------------------------------- */
#define ChildFSM_Input(pFSM) ((ChildFSMData *)_preloadIn((FSM *)pFSM))
typedef struct _childFSMData
/* -------------------------------------------------------------------------- */
/* 自定义数据和信号 */
/* -------------------------------------------------------------------------- */
/**
* @brief 15
* @details Unint16存储的信号位
*
*/
enum ChildFSMSignals{
Signal_toD = 1, /**< 必须从1开始0预留给Idle信号了*/
Signal_toE,
};
/**
* @brief
*
*/
typedef struct ChildFSMExternalData
{
int arrindex;
int x;
}ChildFSMExternalData;
/**
* @brief
*
*/
typedef struct ChildFSMInnerData
{
int y1;
int inner1;
}ChildFSMInnerData;
/* -------------------------------------------------------------------------- */
/* 下面的改个名字就行了 */
/* -------------------------------------------------------------------------- */
typedef struct ChildFSMData
{
ChildFSMExternalData external;
ChildFSMInnerData internal;
}ChildFSMData;
typedef struct _ChildFSM ChildFSM;
typedef struct ChildFSM ChildFSM;
ChildFSM *createChildFSM();
#endif

View File

@ -1,121 +1,123 @@
#ifndef __CHILD_PRIVATE_FSM_H_
#define __CHILD_PRIVATE_FSM_H_
#ifdef __CHILDFSM_PRIVATE_FSM_H_
#error This file can only be included once!!!
#else
#define __CHILDFSM_PRIVATE_FSM_H_
#endif
#include "FSM_protected.h"
#include "childFSM.h"
#include "childFSM_state.h"
#include <stdio.h>
/*
*/
typedef struct _ChildFSM
/* -------------------------------------------------------------------------- */
/* 继承基类 */
/* -------------------------------------------------------------------------- */
typedef struct ChildFSM
{
// 继承父类
FSM base;
}ChildFSM;
/*
action, exit, during
*/
typedef enum _State
{
Idle,
D,
E,
Count_State,
} State;
#define DEFAULT_STATE E
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle)(ChildFSMData *data, FSMSignals *signals){
if(data->external.x == 1)
return D;
else
return E;
}
void actionFcn(enter, D)()
static State selectNextStateFcn(D)(ChildFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_toE)){
signals->lastTriggeredSignal = Signal_toE;
return E;
}
return Idle;
}
static State selectNextStateFcn(E)(ChildFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_toD)){
signals->lastTriggeredSignal = Signal_toD;
return D;
}
return Idle;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, D)()
{
FSM_LOG(" enterD ");
}
void actionFcn(during, D)()
static void actionFcn(during, D)()
{
FSM_LOG(" duringD ");
}
void actionFcn(exit, D)()
static void actionFcn(exit, D)()
{
FSM_LOG(" exitD ");
}
void actionFcn(enter, E)()
static void actionFcn(enter, E)()
{
FSM_LOG(" enterE ");
}
void actionFcn(during, E)()
static void actionFcn(during, E)()
{
FSM_LOG(" duringE ");
}
void actionFcn(exit, E)()
static void actionFcn(exit, E)()
{
FSM_LOG(" exitE ");
}
/*
*/
typedef enum _Event{
Idle_Event,
Idle2D,
Idle2E,
D2E,
E2D,
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
static void transitionGeneralAction(FSM pFSM){
// FSM_LOG("general");
}
Count_Event,
}Event;
// static void transitionGeneralAction(TemplateFSMData *data){
// FSM_LOG("general");
// }
State transitionHandler(Idle2D)()
static void transitionHandler(Idle, D)()
{
FSM_LOG(" Idle2D ");
return D;
}
State transitionHandler(Idle2E)()
static void transitionHandler(Idle, E)()
{
FSM_LOG(" Idle2E ");
return E;
}
State transitionHandler(D2E)()
static void transitionHandler(D, E)()
{
FSM_LOG(" D2E ");
return E;
}
State transitionHandler(E2D)()
static void transitionHandler(E, D)()
{
FSM_LOG(" E2D ");
return D;
}
/*
begin
*/
/* -------------------------------------------------------------------------- */
/* 打印调试 */
/* -------------------------------------------------------------------------- */
const static char *stateStr[] = {
"Idle",
"D",
"E",
};
const static char *eventStr[] = {
"Idle",
"Idle2D",
"Idle2E",
"D2E",
"E2D",
};
static void printFSM(ChildFSM* pFSM){
FSM_LOG(" \t\tChildFSM: ");
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
FSM_LOG(" \tChild: ");
FSM_LOG("CurrentState:%s, Action", stateStr[getFSMCurState((FSM *)pFSM)]);
}
#endif

View File

@ -0,0 +1,22 @@
#ifndef __CHILD_FSM_STATE_H_
#define __CHILD_FSM_STATE_H_
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0 */
D,
E,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
#endif

View File

@ -7,27 +7,31 @@
ChildFSM *cFSM;
ParentFSM *pFSM;
enum ParentFSMSignals i[20] = {0, Signal_toA, Signal_toB,0,0,0,0,0, Signal_toC, Signal_toA, Signal_toB, Signal_toA};
enum ChildFSMSignals j[20] = {0,0,Signal_toD,0,0,Signal_toE, Signal_toD, Signal_toE,0,0,0,0};
int main(){
cFSM = createChildFSM();
pFSM = createParentFSM();
setChildNum((pFSM), 1);
registerChildFSM((pFSM), (cFSM), 0);
bind_ParentFSM_ChildFSMs(pFSM, (FSM *)cFSM);
for (int i = 0; i < 15; i++)
((ParentFSMData *)GetData(cFSM))->external.x = 1;
for (int k = 0; k < 15; k++)
{
ParentFSM_Input(pFSM)->arrindex = i;
PreloaderGetReady(pFSM);
printf("%d: ",k+1);
SetSignal(pFSM, i[k]);
SetSignal(cFSM, j[k]);
ChildFSM_Input(cFSM)->arrindex = i;
PreloaderGetReady(cFSM);
if(k > 5){
((ParentFSMData *)GetData(cFSM))->external.x = 0;
}
ChildFSMData* data = _getData((FSM *)(cFSM));
printf(" %d ", data->arrindex);
Step(pFSM);
_vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
printf("\n");
}

View File

@ -1,15 +1,67 @@
#ifndef __PARENT_FSM_H_
#define __PARENT_FSM_H_
#define ParentFSM_Input(pFSM) ((ParentFSMData *)_preloadIn((FSM *)pFSM))
typedef struct _parentFSMData
/* -------------------------------------------------------------------------- */
/* 提前做类型声明 */
/* -------------------------------------------------------------------------- */
typedef struct FSM FSM;
typedef struct ParentFSM ParentFSM;
/* -------------------------------------------------------------------------- */
/* 子状态机绑定,需要自己实现逻辑 */
/* -------------------------------------------------------------------------- */
void bind_ParentFSM_ChildFSMs(ParentFSM *pFSM, FSM *B_FSM);
/* -------------------------------------------------------------------------- */
/* 自定义数据和信号 */
/* -------------------------------------------------------------------------- */
/**
* @brief 15
* @details Unint16存储的信号位
*
*/
enum ParentFSMSignals{
Signal_toA = 1, /**< 必须从1开始0预留给Idle信号了*/
Signal_toB,
Signal_toC,
};
/**
* @brief
*
*/
typedef struct ParentFSMExternalData
{
int arrindex;
int x;
}ParentFSMExternalData;
/**
* @brief
*
*/
typedef struct ParentFSMInnerData
{
int y1;
int inner1;
}ParentFSMInnerData;
/* -------------------------------------------------------------------------- */
/* 这一块改个名字就行了 */
/* -------------------------------------------------------------------------- */
typedef struct ParentFSMData
{
ParentFSMExternalData external;
ParentFSMInnerData internal;
}ParentFSMData;
typedef struct _ParentFSM ParentFSM;
ParentFSM *createParentFSM();
#endif

View File

@ -0,0 +1,24 @@
#ifndef __PARENT_FSM_STATE_H_
#define __PARENT_FSM_STATE_H_
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0表示空状态 */
A,
B,
C,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
#endif

View File

@ -14,6 +14,25 @@
#include "keyFSM.h"
#include "keyFSM_private.h"
extern KeyIn keystat;
/* -------------------------------------------------------------------------- */
/* 用户定义逻辑 */
/* -------------------------------------------------------------------------- */
KeyOut readKeyFSMOut(KeyFSM *FSM){
KeyFSMData *data= FSM->base.data;
KeyOut out = data->internal.out;
data->internal.out = Idle;
return out;
}
void setKeyFSMOut(KeyFSMData *data, KeyOut keyout){
data->internal.out = keyout;
}
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
@ -22,7 +41,7 @@ static void loadExternalData(KeyFSMData *data){ // 必须重新实现
}
static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现
data->internal.out = Idle;
// data->internal.out = Idle;
}
static void initData(KeyFSM *pFSM){ // 必须重新实现
@ -41,6 +60,7 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle_State);
addSelectNextStateFcn(Waiting);
addSelectNextStateFcn(DownDebouncing);
addSelectNextStateFcn(Downing);
@ -96,7 +116,7 @@ static void step(KeyFSM* pFSM){
KeyFSM *createKeyFSM(){
KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
pFSM = (KeyFSM *)newBaseFSM(Count_State);
#ifndef DSP28377
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;

View File

@ -51,5 +51,7 @@ typedef struct _KeyFSM KeyFSM;
KeyFSM *createKeyFSM();
KeyOut readKeyFSMOut(KeyFSM *FSM);
#endif

View File

@ -6,7 +6,7 @@
#include <stdio.h>
#include <assert.h>
extern KeyIn keystat;
/*
@ -37,14 +37,17 @@ typedef enum _State
Count_State,
} State;
#define DEFAULT_STATE Waiting
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle_State)(KeyFSMData *data){
return Waiting;
}
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
if(data->external.in == Down){
if(data->external.in == pDown){
FSM_LOG(" 物理按键按下 ");
return DownDebouncing;
}
@ -83,7 +86,7 @@ static State selectNextStateFcn(Holding)(KeyFSMData *data){
}
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
if(data->external.in == Down){
if(data->external.in == pDown){
FSM_LOG(" 物理按键按下 ");
return Holding;
}
@ -94,7 +97,7 @@ static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
}
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
if(data->external.in == Down){
if(data->external.in == pDown){
FSM_LOG(" 物理按键按下 ");
if(data->internal.countMultiDown){
return MultiDowning;
@ -111,7 +114,7 @@ static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
}
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
if(data->external.in == Down){
if(data->external.in == pDown){
FSM_LOG(" 物理按键按下 ");
return MultiDownDebouncing;
}
@ -213,17 +216,17 @@ void transitionGeneralAction(KeyFSMData *data){
data->internal.countDelay = 0;
}
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
static void transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
data->internal.out = Down;
}
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
static void transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
data->internal.out = Idle;
data->internal.countMultiDown++;
}
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
static void transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
switch (data->internal.countMultiDown + 1)
{
case 2:
@ -241,18 +244,18 @@ static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* da
}
static State transitionHandler(Downing, Holding)(KeyFSMData* data){
static void transitionHandler(Downing, Holding)(KeyFSMData* data){
data->internal.out = Hold;
}
static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
static void transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
data->internal.countMultiDown = 0;
}
/*
begin
begin
*/
const static char *stateStr[] = {
"Idle",
@ -270,7 +273,7 @@ const static char *stateStr[] = {
static void printFSM(KeyFSM* pFSM){
KeyFSMData* data = pFSM->base.data;
FSM_LOG("KeyFSM: ");
FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->internal.countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
FSM_LOG("%d, 当前状态:%s, \t上一个下次状态:%s \t转移:", data->internal.countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
}

View File

@ -1,4 +1,5 @@
#include <stdio.h>
#include "assert.h"
#include "keyFSM.h"
#include "FSM_public.h"
@ -23,19 +24,20 @@ KeyIn keystat;
int main(){
KeyFSM* keyFSM = createKeyFSM();
for (int i = 0; i < NUM; i++)
{
printf("第%d次: ",i+1);
const KeyFSMData* data = _getData((FSM *)keyFSM);
keystat = testin[i];
Step(keyFSM);
if(data->internal.out){
printf("\t\t\t\t%d", data->internal.out);
KeyOut out = readKeyFSMOut(keyFSM);
if(out != Idle){
printf("\t\t\t\t%d", out);
}
printf("\n");
}

View File

@ -1,4 +1,5 @@
#include <stdio.h>
#include <assert.h>
#include "templateFSM.h"
#include "FSM_public.h"
@ -27,8 +28,11 @@ int main(){
if(i == 7){
x = 0;
}
printf("%d, " ,i);
printf("\t\t %s", CurState2ASCII(pFSM));
Step(pFSM);
printf("\n");

View File

@ -17,6 +17,11 @@
#include "templateFSM.h"
#include "templateFSM_private.h"
const char * curState2ASCII(TemplateFSM *pFSM){
return stateStr[getFSMCurState((FSM *)pFSM)];
}
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
@ -92,6 +97,7 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
*/
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle);
addSelectNextStateFcn(D);
addSelectNextStateFcn(E);
@ -142,10 +148,11 @@ static void step(TemplateFSM* pFSM){
*/
TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
pFSM = (TemplateFSM *)newBaseFSM(Count_State);
// 重新实现的函数
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.publicFcns.curState2ASCII = (Avoid_WARNING_2ASCII_Fcns)curState2ASCII;
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;

View File

@ -54,8 +54,6 @@ typedef struct TemplateFSMInnerData
/* -------------------------------------------------------------------------- */
/* 下面的改个名字就行了 */
/* -------------------------------------------------------------------------- */
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) /**< @deprecated 暂时弃用 */
typedef struct TemplateFSMData
{
TemplateFSMExternalData external;
@ -64,6 +62,7 @@ typedef struct TemplateFSMData
typedef struct TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM();
const char * curState2ASCII_TemplateFSM(TemplateFSM *pFSM);
#endif

View File

@ -17,6 +17,7 @@
#include "FSM_protected.h"
#include "templateFSM.h"
#include "templateFSM_state.h"
#include <stdio.h>
/* -------------------------------------------------------------------------- */
@ -34,28 +35,17 @@ typedef struct TemplateFSM
FSM base;
}TemplateFSM;
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0 */
D,
E,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
#define DEFAULT_STATE E /**< 默认状态Idle状态会先跳转到默认状态 */
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle)(TemplateFSMData *data, FSMSignals *signals){
return E;
}
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_A)){
@ -115,7 +105,7 @@ static void actionFcn(exit, E)()
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
static void transitionGeneralAction(FSM pFSM){
static void transitionGeneralAction(FSM *pFSM){
FSM_LOG("general");
}

View File

@ -0,0 +1,22 @@
#ifndef __TEMPLATE_FSM_STATE_H_
#define __TEMPLATE_FSM_STATE_H_
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0 */
D,
E,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
#endif

View File

@ -42,7 +42,7 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.
PROJECT_NAME = 科湃100kW样机代码
PROJECT_NAME = 状态机框架
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
@ -61,7 +61,7 @@ PROJECT_BRIEF = "by 天神"
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.
PROJECT_LOGO = C:/Users/97498/Desktop/无标题.png
PROJECT_LOGO = D:/godsays/indexfiles/AZ8OJKZLGK/FSM/vscode/doxygen/logo_transparent.png
# With the PROJECT_ICON tag one can specify an icon that is included in the tabs
# when the HTML document is shown. Doxygen will copy the logo to the output
@ -74,7 +74,7 @@ PROJECT_ICON =
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.
OUTPUT_DIRECTORY = C:/Users/97498/Desktop/doxgentest
OUTPUT_DIRECTORY = manual
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# sub-directories (in 2 levels) under the output directory of each output format
@ -643,7 +643,7 @@ CASE_SENSE_NAMES = SYSTEM
# scope will be hidden.
# The default value is: NO.
HIDE_SCOPE_NAMES = YES
HIDE_SCOPE_NAMES = NO
# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
# append additional text to a page's title, such as Class Reference. If set to
@ -822,7 +822,7 @@ FILE_VERSION_FILTER =
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.
LAYOUT_FILE = D:/godsays/indexfiles/M3J7THMQES/empty_project_with_init_28388S/doxygen/DoxygenLayout.xml
LAYOUT_FILE = doxygen/DoxygenLayout.xml
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
@ -950,7 +950,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
INPUT =
INPUT = FSM_OOP
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@ -1056,10 +1056,7 @@ RECURSIVE = YES
# Note that relative paths are relative to the directory from which doxygen is
# run.
EXCLUDE = D:/godsays/indexfiles/M3J7THMQES/empty_project_with_init_28388S/include \
D:/godsays/indexfiles/M3J7THMQES/empty_project_with_init_28388S/source \
D:/godsays/indexfiles/M3J7THMQES/empty_project_with_init_28388S/CPU1_FLASH \
D:/godsays/indexfiles/M3J7THMQES/empty_project_with_init_28388S/CPU1_RAM
EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded

View File

@ -1,5 +1,5 @@
Plecs {
Name base64 "54q25oCB5py65rWL6K+V"
Name base64 "54i25a2Q54q25oCB5py65rWL6K+V"
Version "4.7"
CircuitModel "ContStateSpace"
StartTime "0.0"
@ -47,7 +47,7 @@ Plecs {
ScriptsDialogGeometry ""
ScriptsDialogSplitterPos "0"
Schematic {
Location [1734, 301; 2376, 730]
Location [306, 311; 948, 731]
ZoomFactor 1.71498
SliderPosition [0, 0]
ShowBrowser off
@ -139,9 +139,9 @@ Plecs {
Show off
}
FSM {
Location [-1, -8; 2559, 1309]
ZoomFactor 1.14437
SliderPosition [0, 0]
Location [190, 122; 1746, 914]
ZoomFactor 0.76361
SliderPosition [0, 47]
FsmState {
Name "A"
Position [360, 480]
@ -161,8 +161,8 @@ Plecs {
}
FsmState {
Name "B"
Position [1110, 430]
Frame [-420, -270; 420, 270]
Position [1210, 400]
Frame [-520, -240; 520, 240]
Parameter {
Name "EnterAction"
Value "printf(\" enterB \");"
@ -177,7 +177,7 @@ Plecs {
}
FsmState {
Name "D"
Position [-240, -10]
Position [-340, 20]
Frame [-100, -90; 100, 90]
Parameter {
Name "EnterAction"
@ -192,10 +192,18 @@ Plecs {
Value "printf(\" exitD \");"
}
}
FsmState {
Name ".Junction"
Position [-190, -130]
}
FsmState {
Name ".PointState"
Position [-190, -170]
}
FsmState {
Name "E"
Position [210, -10]
Frame [-100, -90; 100, 90]
Position [240, 20]
Frame [-230, -90; 230, 90]
Parameter {
Name "EnterAction"
Value "printf(\" enterE \");"
@ -209,19 +217,11 @@ Plecs {
Value "printf(\" exitE \");"
}
}
FsmState {
Name ".Junction"
Position [-90, -160]
}
FsmState {
Name ".PointState"
Position [-90, -200]
}
}
FsmState {
Name "C"
Position [650, 1050]
Frame [-100, -90; 100, 90]
Position [850, 1050]
Frame [-300, -90; 300, 90]
Parameter {
Name "EnterAction"
Value "printf(\" enterC \");"
@ -367,6 +367,38 @@ Plecs {
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath ".PointState"
TerminalLoc right
TerminalCoord 0.5
External on
}
FsmDstInfo {
StatePath "A"
TerminalLoc top
TerminalCoord 0.507833
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value ""
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value ""
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B/D"
@ -527,38 +559,6 @@ Plecs {
Value "2"
}
}
FsmTransition {
FsmSrcInfo {
StatePath ".PointState"
TerminalLoc bottom
TerminalCoord 0.5
External on
}
FsmDstInfo {
StatePath "A"
TerminalLoc top
TerminalCoord 0.509626
External on
}
SegmentLengths [63.5]
LabelPosition 0.5
Parameter {
Name "Trigger"
Value ""
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value ""
}
Parameter {
Name "Priority"
Value "1"
}
}
}
}
Component {
@ -571,7 +571,7 @@ Plecs {
LabelPosition south
Parameter {
Variable "DialogGeometry"
Value "[1296 663 655 313]"
Value "[947 556 655 313]"
Show off
}
Parameter {
@ -683,17 +683,17 @@ Plecs {
Direction up
Flipped off
LabelPosition south
Location [811, 582; 1161, 825]
Location [974, 426; 1324, 693]
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADYAAAA"
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADwAAAA"
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
"AAAAA=="
SavedViews "AAAAAgAAAAA="
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA"
"wAAAGQAAAACAAAAZAAAAAkAAABkAAAACAAAAGQAAAAFAAAAZAAAAAQAAABkAAAABwAAAGQAAAAGAA"
"AAZAAAAAEAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
"gAAAGQAAAAJAAAAZAAAAAgAAABkAAAABQAAAGQAAAAEAAAAZAAAAAcAAABkAAAABgAAAGQAAAABAA"
"AAZAAAAAMAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
"AAYAAAAAQAAAAAAAAPoAAAAABg="
@ -781,4 +781,4 @@ Plecs {
}
}
}
DemoSignature "C/ZrxOQHJ0OXW30du/vTiFYFVRZZzc0r6Uyc2MRNbyo="
DemoSignature "jw8KDReJrMPoo1lAaPtOZeufBUfPGFLDXzJKLXRaW0c="

784
状态机测试.plecs Normal file
View File

@ -0,0 +1,784 @@
Plecs {
Name base64 "54q25oCB5py65rWL6K+V"
Version "4.7"
CircuitModel "ContStateSpace"
StartTime "0.0"
TimeSpan "2"
Timeout ""
Solver "auto"
MaxStep "1e-3"
InitStep "-1"
FixedStep "1e-3"
Refine "1"
ZCStepSize "1e-9"
RelTol "1e-3"
AbsTol "-1"
TurnOnThreshold "0"
SyncFixedStepTasks "2"
UseSingleCommonBaseRate "2"
LossVariableLimitExceededMsg "3"
NegativeSwitchLossMsg "3"
DivisionByZeroMsg "3"
StiffnessDetectionMsg "2"
MaxConsecutiveZCs "1000"
AlgebraicLoopWithStateMachineMsg "3"
AssertionAction "1"
InitializationCommands ""
InitialState "1"
SystemState ""
TaskingMode "1"
TaskConfigurations ""
CodeGenParameterInlining "2"
CodeGenFloatingPointFormat "2"
CodeGenAbsTimeUsageMsg "3"
CodeGenBaseName ""
CodeGenOutputDir ""
CodeGenExtraOpts ""
CodeGenTarget "Generic"
CodeGenTargetSettings ""
ExtendedMatrixPrecision "1"
MatrixSignificanceCheck "2"
EnableStateSpaceSplitting "2"
DisplayStateSpaceSplitting "1"
DiscretizationMethod "2"
ExternalModeSettings ""
AlgebraicLoopMethod "1"
AlgebraicLoopTolerance "1e-6"
ScriptsDialogGeometry ""
ScriptsDialogSplitterPos "0"
Schematic {
Location [633, 310; 1275, 736]
ZoomFactor 1.71498
SliderPosition [0, 0]
ShowBrowser off
BrowserWidth 100
Component {
Type FsmBlock
Name "State Machine"
Show on
Position [260, 100]
Direction up
Flipped off
LabelPosition south
Frame [-40, -15; 40, 15]
Parameter {
Variable "InputVariables"
Value "i,j"
Show off
}
Parameter {
Variable "InputTypes"
Value "1,1"
Show off
}
Parameter {
Variable "InternalConstants"
Value ""
Show off
}
Parameter {
Variable "InternalConstantValues"
Value ""
Show off
}
Parameter {
Variable "InternalVariables"
Value ""
Show off
}
Parameter {
Variable "InternalVariableValues"
Value ""
Show off
}
Parameter {
Variable "OutputVariables"
Value ""
Show off
}
Parameter {
Variable "Declarations"
Value "#include <stdio.h>\n"
"\n"
"typedef enum _ParentEvent{\n"
" Parent_Idle_Event,\n"
" Start,\n"
" A2B,\n"
" B2A,\n"
" B2C,\n"
" C2A,\n"
"\n"
" Parent_Count_Event,\n"
"}ParentEvent;\n"
"\n"
"\n"
"typedef enum _ChildEvent{\n"
" Child_Idle_Event,\n"
" Idle2D,\n"
" Idle2E,\n"
" D2E,\n"
" E2D,\n"
"\n"
" Child_Count_Event,\n"
"}ChildEvent;"
Show off
}
Parameter {
Variable "TransitionOrder"
Value "2"
Show off
}
Parameter {
Variable "SampleTime"
Value "0.1"
Show off
}
Parameter {
Variable "Animate"
Value "1"
Show off
}
FSM {
Location [-1, -8; 1919, 979]
ZoomFactor 1.14437
SliderPosition [0, -1]
FsmState {
Name "A"
Position [360, 480]
Frame [-100, -90; 100, 90]
Parameter {
Name "EnterAction"
Value "printf(\" enterA \");"
}
Parameter {
Name "DuringAction"
Value "printf(\" duringA \");"
}
Parameter {
Name "ExitAction"
Value "printf(\" exitA \");"
}
}
FsmState {
Name "B"
Position [1110, 430]
Frame [-420, -270; 420, 270]
Parameter {
Name "EnterAction"
Value "printf(\" enterB \");"
}
Parameter {
Name "DuringAction"
Value ""
}
Parameter {
Name "ExitAction"
Value "printf(\" exitB \");"
}
FsmState {
Name "D"
Position [-240, -10]
Frame [-100, -90; 100, 90]
Parameter {
Name "EnterAction"
Value "printf(\" enterD \");"
}
Parameter {
Name "DuringAction"
Value "printf(\" duringD \");"
}
Parameter {
Name "ExitAction"
Value "printf(\" exitD \");"
}
}
FsmState {
Name "E"
Position [210, -10]
Frame [-100, -90; 100, 90]
Parameter {
Name "EnterAction"
Value "printf(\" enterE \");"
}
Parameter {
Name "DuringAction"
Value "printf(\" duringE \");"
}
Parameter {
Name "ExitAction"
Value "printf(\" exitE \");"
}
}
FsmState {
Name ".Junction"
Position [-90, -160]
}
FsmState {
Name ".PointState"
Position [-90, -200]
}
}
FsmState {
Name "C"
Position [650, 1050]
Frame [-100, -90; 100, 90]
Parameter {
Name "EnterAction"
Value "printf(\" enterC \");"
}
Parameter {
Name "DuringAction"
Value "printf(\" duringC \");"
}
Parameter {
Name "ExitAction"
Value "printf(\" exitC \");"
}
}
FsmState {
Name ".PointState"
Position [330, 250]
}
FsmTransition {
FsmSrcInfo {
StatePath "A"
TerminalLoc right
TerminalCoord 0.390136
External on
}
FsmDstInfo {
StatePath "B"
TerminalLoc left
TerminalCoord 0.511449
External on
}
SegmentLengths [107.3600447694556]
LabelPosition 0.685
Parameter {
Name "Trigger"
Value "i==A2B"
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" A2B \");"
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B"
TerminalLoc left
TerminalCoord 0.654101
External on
}
FsmDstInfo {
StatePath "A"
TerminalLoc right
TerminalCoord 0.641567
External on
}
SegmentLengths [-110]
LabelPosition 0.5
Parameter {
Name "Trigger"
Value "i==B2A"
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" B2A \");"
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B"
TerminalLoc bottom
TerminalCoord 0.491978
External on
}
FsmDstInfo {
StatePath "C"
TerminalLoc top
TerminalCoord 0.435411
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value "i==B2C"
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" B2C \");"
}
Parameter {
Name "Priority"
Value "2"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "C"
TerminalLoc left
TerminalCoord 0.480089
External on
}
FsmDstInfo {
StatePath "A"
TerminalLoc bottom
TerminalCoord 0.531347
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value "i == C2A"
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" C2A \");"
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B/D"
TerminalLoc right
TerminalCoord 0.336937
External on
}
FsmDstInfo {
StatePath "B/E"
TerminalLoc left
TerminalCoord 0.350905
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value "j==D2E"
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" D2E \");"
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B/E"
TerminalLoc left
TerminalCoord 0.593025
External on
}
FsmDstInfo {
StatePath "B/D"
TerminalLoc right
TerminalCoord 0.560432
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value "j==E2D"
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" E2D \");"
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B/.PointState"
TerminalLoc bottom
TerminalCoord 0.5
External on
}
FsmDstInfo {
StatePath "B/.Junction"
TerminalLoc top
TerminalCoord 0.5
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value ""
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value ""
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B/.Junction"
TerminalLoc left
TerminalCoord 0.5
External on
}
FsmDstInfo {
StatePath "B/D"
TerminalLoc top
TerminalCoord 0.606534
External on
}
SegmentLengths []
LabelPosition 0.135
Parameter {
Name "Trigger"
Value ""
}
Parameter {
Name "Condition"
Value "j == Idle2D"
}
Parameter {
Name "Action"
Value "printf(\" Idle2D \");"
}
Parameter {
Name "Priority"
Value "1"
}
}
FsmTransition {
FsmSrcInfo {
StatePath "B/.Junction"
TerminalLoc right
TerminalCoord 0.5
External on
}
FsmDstInfo {
StatePath "B/E"
TerminalLoc top
TerminalCoord 0.519516
External on
}
SegmentLengths []
LabelPosition 0.5
Parameter {
Name "Trigger"
Value ""
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value "printf(\" Idle2E \");"
}
Parameter {
Name "Priority"
Value "2"
}
}
FsmTransition {
FsmSrcInfo {
StatePath ".PointState"
TerminalLoc bottom
TerminalCoord 0.5
External on
}
FsmDstInfo {
StatePath "A"
TerminalLoc top
TerminalCoord 0.509626
External on
}
SegmentLengths [63.5]
LabelPosition 0.5
Parameter {
Name "Trigger"
Value ""
}
Parameter {
Name "Condition"
Value ""
}
Parameter {
Name "Action"
Value ""
}
Parameter {
Name "Priority"
Value "1"
}
}
}
}
Component {
Type CScript
Name "C-Script"
Show on
Position [75, 70]
Direction up
Flipped off
LabelPosition south
Parameter {
Variable "DialogGeometry"
Value "[1276 398 582 313]"
Show off
}
Parameter {
Variable "NumInputs"
Value "1"
Show off
}
Parameter {
Variable "NumOutputs"
Value "2"
Show off
}
Parameter {
Variable "NumContStates"
Value "0"
Show off
}
Parameter {
Variable "NumDiscStates"
Value "0"
Show off
}
Parameter {
Variable "NumZCSignals"
Value "0"
Show off
}
Parameter {
Variable "DirectFeedthrough"
Value "0"
Show off
}
Parameter {
Variable "Ts"
Value "0.1"
Show off
}
Parameter {
Variable "Parameters"
Value ""
Show off
}
Parameter {
Variable "LangStandard"
Value "2"
Show off
}
Parameter {
Variable "GnuExtensions"
Value "1"
Show off
}
Parameter {
Variable "RuntimeCheck"
Value "2"
Show off
}
Parameter {
Variable "Declarations"
Value "#include <stdio.h>\n"
"\n"
"static int index = 0;\n"
"static int pu[20] = {0,1,2,0,0,0,0,0, 4,5,2,3};\n"
"static int cu[20] = {0,0,1,0,0,3,4,3,0,0,0,0};"
Show off
}
Parameter {
Variable "StartFcn"
Value ""
Show off
}
Parameter {
Variable "OutputFcn"
Value base64 "cHJpbnRmKCJcbuesrCVk5qyhIiwgaW5kZXgpOwpPdXRwdXQo"
"MCkgPSBwdVtpbmRleF07Ck91dHB1dCgxKSA9IGN1W2luZGV4XTsKaW5kZXgrKzsKCgo="
Show off
}
Parameter {
Variable "UpdateFcn"
Value ""
Show off
}
Parameter {
Variable "DerivativeFcn"
Value ""
Show off
}
Parameter {
Variable "TerminateFcn"
Value ""
Show off
}
Parameter {
Variable "StoreCustomStateFcn"
Value ""
Show off
}
Parameter {
Variable "RestoreCustomStateFcn"
Value ""
Show off
}
}
Component {
Type Scope
Name "Scope"
Show on
Position [165, 35]
Direction up
Flipped off
LabelPosition south
Location [811, 582; 1161, 833]
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADgAAAA"
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
"AAAAA=="
SavedViews "AAAAAgAAAAA="
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAB"
"gAAAGQAAAAHAAAAZAAAAAgAAABkAAAACQAAAGQAAAABAAAAZAAAAAIAAABkAAAAAwAAAGQAAAAEAA"
"AAZAAAAAUAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
"AAYAAAAAQAAAAAAAAPoAAAAABg="
PlotPalettes "AAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
Axes "1"
TimeRange "0.0"
ScrollingMode "1"
SingleTimeAxis "1"
Open "0"
Ts "-1"
SampleLimit "0"
XAxisLabel "Time / s"
ShowLegend "1"
Axis {
Name ""
AutoScale 1
MinValue 0
MaxValue 1
Signals {}
SignalTypes [ ]
Untangle 0
KeepBaseline off
BaselineValue 0
}
Fourier {
SingleXAxis on
AxisLabel "Frequency / Hz"
Scaling 0
PhaseDisplay 0
ShowFourierLegend off
Axis {
Name ""
AutoScale 1
MinValue 0
MaxValue 1
Signals {}
Untangle 0
KeepBaseline off
BaselineValue 0
}
}
}
Component {
Type SignalDemux
Name "Demux"
Show off
Position [165, 100]
Direction right
Flipped on
LabelPosition south
Parameter {
Variable "Width"
Value "2"
Show off
}
}
Connection {
Type Signal
SrcComponent "C-Script"
SrcTerminal 2
Points [135, 70]
Branch {
DstComponent "Scope"
DstTerminal 1
}
Branch {
Points [135, 100]
DstComponent "Demux"
DstTerminal 1
}
}
Connection {
Type Signal
SrcComponent "Demux"
SrcTerminal 2
DstComponent "State Machine"
DstTerminal 1
}
Connection {
Type Signal
SrcComponent "Demux"
SrcTerminal 3
DstComponent "State Machine"
DstTerminal 2
}
}
}
DemoSignature "vzTf+CQbDjWT4Ix1MTz+0HTDihYd6Bo2fAit4HiYDxE="