Compare commits
14 Commits
0cff421be5
...
50b9788e6a
Author | SHA1 | Date |
---|---|---|
TrashGod | 50b9788e6a | |
godcreator02 | 27acc2bb1b | |
godcreator02 | d48d5c7cc1 | |
godcreator02 | ea121bcb29 | |
TrashGod | 951e6d1695 | |
TrashGod | 010e6a907f | |
TrashGod | 2667b895df | |
TrashGod | f0c905baa9 | |
TrashGod | 5240b83578 | |
TrashGod | f48889bf23 | |
TrashGod | 58d2918d06 | |
TrashGod | 6cefb9dae5 | |
godcreator02 | d6791ef8d4 | |
godcreator02 | 04c8c07b8f |
|
@ -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 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">
|
<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}"/>
|
||||||
<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/common"/>
|
||||||
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/include/headers"/>
|
<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/keytest"/>
|
||||||
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/childtest"/>
|
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/childtest"/>
|
||||||
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/baseFSM"/>
|
<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 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">
|
<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="_INLINE"/>
|
||||||
<listOptionValue builtIn="false" value="NDEBUG"/>
|
|
||||||
<listOptionValue builtIn="false" value="DSP28377"/>
|
|
||||||
<listOptionValue builtIn="false" value="CPU1"/>
|
<listOptionValue builtIn="false" value="CPU1"/>
|
||||||
</option>
|
</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"/>
|
<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.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.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 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 <id> (--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__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__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"/>
|
<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.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.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 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 <id> (--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 <id> 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 <id> 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__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__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"/>
|
<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>
|
</toolChain>
|
||||||
</folderInfo>
|
</folderInfo>
|
||||||
<sourceEntries>
|
<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>
|
</sourceEntries>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
|
|
|
@ -19,3 +19,6 @@ encoding//CPU1_RAM/source/subdir_vars.mk=UTF-8
|
||||||
encoding//CPU1_RAM/sources.mk=UTF-8
|
encoding//CPU1_RAM/sources.mk=UTF-8
|
||||||
encoding//CPU1_RAM/subdir_rules.mk=UTF-8
|
encoding//CPU1_RAM/subdir_rules.mk=UTF-8
|
||||||
encoding//CPU1_RAM/subdir_vars.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
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#define LED_BLINKY_GPIO 2
|
#define LED_BLINKY_GPIO 2
|
||||||
#define INPUT_GPIO 15
|
#define INPUT_GPIO 15
|
||||||
|
|
||||||
|
#pragma diag_suppress 303
|
||||||
|
|
||||||
uint32_t exec_time[50];
|
uint32_t exec_time[50];
|
||||||
uint32_t stop_time;
|
uint32_t stop_time;
|
||||||
int index = 0;
|
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;
|
KeyFSM* keyFSM;
|
||||||
|
@ -68,7 +40,6 @@ KeyIn keystat;
|
||||||
|
|
||||||
void keyFSMTest(){
|
void keyFSMTest(){
|
||||||
keyFSM = createKeyFSM();
|
keyFSM = createKeyFSM();
|
||||||
data = _getData((FSM *)keyFSM);
|
|
||||||
|
|
||||||
printf("hello 28377\n");
|
printf("hello 28377\n");
|
||||||
|
|
||||||
|
@ -80,8 +51,9 @@ void keyFSMTest(){
|
||||||
Step(keyFSM);
|
Step(keyFSM);
|
||||||
toc(index++);
|
toc(index++);
|
||||||
|
|
||||||
if(data->internal.out != Idle){
|
KeyOut out = readKeyFSMOut(keyFSM);
|
||||||
printf("%s\n", keyStr[data->internal.out]);
|
if(out != Idle){
|
||||||
|
printf("\t\t\t\t%d\n", out);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
index--;
|
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;
|
ChildFSM *cFSM;
|
||||||
while(1){
|
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();
|
tic();
|
||||||
int c = fcnptr(10, 20);
|
Step(pFSM);
|
||||||
toc(index);
|
toc(index++);
|
||||||
index++;
|
|
||||||
|
|
||||||
printf("%d\n", c);
|
printf("\n");
|
||||||
DELAY_US(20*1000);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
InitSysCtrl();
|
InitSysCtrl();
|
||||||
|
@ -124,10 +110,8 @@ void main(void)
|
||||||
GPIO_SetupPinMux(LED_BLINKY_GPIO, GPIO_MUX_CPU1, 0);
|
GPIO_SetupPinMux(LED_BLINKY_GPIO, GPIO_MUX_CPU1, 0);
|
||||||
GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP);
|
GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP);
|
||||||
|
|
||||||
|
// keyFSMTest();
|
||||||
// childTest();
|
childFSMTest();
|
||||||
keyFSMTest();
|
|
||||||
// funptrTest();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,9 @@
|
||||||
"*.tcc": "c",
|
"*.tcc": "c",
|
||||||
"typeinfo": "c",
|
"typeinfo": "c",
|
||||||
"templatefsm.h": "c",
|
"templatefsm.h": "c",
|
||||||
"templatefsm_private.h": "c"
|
"templatefsm_private.h": "c",
|
||||||
|
"keyfsm_private.h": "c",
|
||||||
|
"childfsm_state.h": "c"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
||||||
|
|
||||||
|
|
||||||
set(keytest 789)
|
# set(keytest 789)
|
||||||
# set(child_parent 789)
|
set(child_parent 789)
|
||||||
if(DEFINED keytest)
|
if(DEFINED keytest)
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest SRC_FSM_USR)
|
||||||
|
|
|
@ -27,25 +27,32 @@
|
||||||
*
|
*
|
||||||
* @param pFSM 状态机变量的基类指针
|
* @param pFSM 状态机变量的基类指针
|
||||||
*/
|
*/
|
||||||
static inline void setNextState(FSM* pFSM){
|
static inline void updateNextState(FSM* pFSM){
|
||||||
int curState = pFSM->privateVars->curState;
|
int curState = getCurState(pFSM);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(0 == pFSM->privateVars->numChild)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < pFSM->privateVars->numChild; i++)
|
int nextState = doSelectNextState(pFSM, curState);
|
||||||
{
|
setNextState(pFSM, nextState);
|
||||||
FSM *cFSM = pFSM->privateVars->childFSM[i];
|
updateIndex(pFSM);
|
||||||
setNextState(cFSM);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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
|
* @brief
|
||||||
* @deprecated 去掉了所有和预装载器相关的内容
|
* @deprecated 去掉了所有和预装载器相关的内容
|
||||||
|
@ -71,88 +78,85 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
{
|
{
|
||||||
pFSM->pureVtbl.loadExternalData(pFSM->data);
|
pFSM->pureVtbl.loadExternalData(pFSM->data);
|
||||||
// preload(pFSM);
|
// preload(pFSM);
|
||||||
setNextState(pFSM);
|
updateNextState(pFSM);
|
||||||
pFSM->pureVtbl.resetSignals(&pFSM->signals, pFSM->data);
|
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(nextState && curState != nextState){ // 状态切换
|
||||||
if (fcns->exitActionTable[curState] != NULL)
|
// 退出子状态机
|
||||||
fcns->exitActionTable[curState](data, childFSM);
|
if(hasChildFSM(pFSM, curState)){
|
||||||
|
FSM *cFSM = getChildFSM(pFSM, curState);
|
||||||
if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数
|
shutFSM(cFSM);
|
||||||
(*fcns->transitionTable[index])(data);
|
|
||||||
|
|
||||||
if(fcns->transitionGeneralAction != NULL)
|
|
||||||
fcns->transitionGeneralAction(data); // 通用状态转移函数
|
|
||||||
|
|
||||||
if (fcns->enterActionTable[nextState] != NULL)
|
|
||||||
fcns->enterActionTable[nextState](data, childFSM);
|
|
||||||
|
|
||||||
pFSM->privateVars->curState = nextState;
|
|
||||||
}
|
}
|
||||||
else if(curState == 0){ // 处理刚运行进入的默认状态
|
|
||||||
nextState = pFSM->privateVars->defaultState;
|
doExit(pFSM);
|
||||||
if (fcns->enterActionTable[nextState] != NULL)
|
|
||||||
fcns->enterActionTable[nextState](data, childFSM);
|
doTransition(pFSM); // 有特定的状态转移函数
|
||||||
pFSM->privateVars->curState = nextState;
|
doGeneralTransition(pFSM); // 通用状态转移函数
|
||||||
|
|
||||||
|
doEnter(pFSM, nextState);
|
||||||
|
|
||||||
|
// 进子状态机,必须从默认状态开始
|
||||||
|
if(hasChildFSM(pFSM, nextState)){
|
||||||
|
FSM *cFSM = getChildFSM(pFSM, nextState);
|
||||||
|
Step(cFSM);
|
||||||
|
}
|
||||||
|
setCurState(pFSM, nextState);
|
||||||
}
|
}
|
||||||
else // 状态机没动
|
else // 状态机没动
|
||||||
{
|
{
|
||||||
if (fcns->duringActionTable[curState] != NULL)
|
if(!hasChildFSM(pFSM, curState)){
|
||||||
fcns->duringActionTable[curState](data, childFSM);
|
doDuring(pFSM);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
FSM *cFSM = getChildFSM(pFSM, curState);
|
||||||
|
Step(cFSM);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* public 函数 */
|
/* 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){
|
void _stepFSM(FSM *pFSM){
|
||||||
pFSM->publicFcns.step(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;
|
return pFSM->privateVars->curState;
|
||||||
}
|
}
|
||||||
int getFSMNextState(FSM *pFSM){
|
inline int getFSMNextState(FSM *pFSM){
|
||||||
return pFSM->privateVars->nextState;
|
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){
|
const void *_getData(FSM* pFSM){
|
||||||
return (const void *)pFSM->data;
|
return (const void *)pFSM->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setSignal(FSM *pFSM, Uint16 signalFlag){
|
void _setSignal(FSM *pFSM, unsigned int signalFlag){
|
||||||
pFSM->signals.all |= (1 << signalFlag);
|
pFSM->signals.all |= (1 << signalFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief
|
||||||
* @deprecated 弃用
|
* @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 (*StateFuncPtr)(void *);
|
||||||
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
||||||
typedef int (*TransitionFuncPtr)(void *, int *);
|
typedef int (*TransitionFuncPtr)(void *, int *);
|
||||||
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
|
typedef int (*SelectNextStateFcnPtr)(void *, FSMSignals *);
|
||||||
|
|
||||||
FSM *pFSM = calloc(1, sizeof(FSM));
|
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||||
pFSM->privateVars = newFMSPrivateVars(numState, defaultState);
|
pFSM->privateVars = newFMSPrivateVars(numState);
|
||||||
|
|
||||||
FSMPureVtbl pureVtbl = {
|
FSMPureVtbl pureVtbl = {
|
||||||
.setupHandler = NULL,
|
.setupHandler = NULL,
|
||||||
|
@ -220,7 +224,6 @@ FSM* newBaseFSM(int numState, int defaultState){
|
||||||
pFSM->pureVtbl = pureVtbl;
|
pFSM->pureVtbl = pureVtbl;
|
||||||
|
|
||||||
pFSM->publicFcns.step = stepBaseFSM;
|
pFSM->publicFcns.step = stepBaseFSM;
|
||||||
pFSM->publicFcns.reset = resetBaseFSM;
|
|
||||||
|
|
||||||
return pFSM;
|
return pFSM;
|
||||||
}
|
}
|
||||||
|
@ -231,6 +234,8 @@ void constructFSM(FSM* pFSM){
|
||||||
assert(pFSM->pureVtbl.initData);
|
assert(pFSM->pureVtbl.initData);
|
||||||
assert(pFSM->pureVtbl.initDataLoader);
|
assert(pFSM->pureVtbl.initDataLoader);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns);
|
pFSM->pureVtbl.setupHandler(&pFSM->privateVars->fcns);
|
||||||
pFSM->pureVtbl.initData(pFSM);
|
pFSM->pureVtbl.initData(pFSM);
|
||||||
pFSM->pureVtbl.initDataLoader(pFSM);
|
pFSM->pureVtbl.initDataLoader(pFSM);
|
||||||
|
|
|
@ -16,60 +16,27 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
|
#include "FSM_private_vars.h"
|
||||||
|
|
||||||
typedef struct FSMHandler FSMHandler;
|
typedef struct FSMHandler FSMHandler;
|
||||||
typedef struct FSM FSM;
|
typedef struct FSM FSM;
|
||||||
typedef struct FSMSignals FSMSignals;
|
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
|
static void empty_func(void * a){
|
||||||
{
|
}
|
||||||
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;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 仅在FSM.c中调用,新建私有变量并分配空间
|
* @brief 仅在FSM.c中调用,新建私有变量并分配空间
|
||||||
*
|
*
|
||||||
* @param numState
|
* @param numState
|
||||||
* @param defaultState
|
|
||||||
* @return FSMPrivateVars*
|
* @return FSMPrivateVars*
|
||||||
*/
|
*/
|
||||||
FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
|
FSMPrivateVars* newFMSPrivateVars(int numState){
|
||||||
typedef void (*StateFuncPtr)(void *);
|
typedef void (*StateFuncPtr)(void *);
|
||||||
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
||||||
typedef int (*TransitionFuncPtr)(void *, int *);
|
typedef int (*TransitionFuncPtr)(void *, int *);
|
||||||
|
@ -77,10 +44,9 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
|
||||||
|
|
||||||
FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars));
|
FSMPrivateVars *privateVars = calloc(1, sizeof(FSMPrivateVars));
|
||||||
privateVars->numState = numState;
|
privateVars->numState = numState;
|
||||||
privateVars->defaultState = defaultState;
|
|
||||||
privateVars->curState = 0;
|
privateVars->curState = 0;
|
||||||
privateVars->nextState = 0;
|
privateVars->nextState = 0;
|
||||||
privateVars->numChild = 0;
|
privateVars->childFSMTable = calloc(numState, sizeof(FSM));
|
||||||
|
|
||||||
privateVars->preloader.isReady = 0;
|
privateVars->preloader.isReady = 0;
|
||||||
|
|
||||||
|
@ -88,13 +54,99 @@ FSMPrivateVars* newFMSPrivateVars(int numState, int defaultState){
|
||||||
privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
|
privateVars->fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
|
||||||
privateVars->fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
|
privateVars->fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
|
||||||
|
|
||||||
privateVars->fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
|
for (int i = 0; i < numState; i++)
|
||||||
privateVars->fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
|
{
|
||||||
privateVars->fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
|
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;
|
||||||
|
|
||||||
privateVars->fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
|
||||||
|
|
||||||
return privateVars;
|
return privateVars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 以下开始是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
|
#endif
|
|
@ -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
|
|
@ -48,10 +48,11 @@ typedef struct FSM FSM;
|
||||||
typedef struct FSMSignals FSMSignals;
|
typedef struct FSMSignals FSMSignals;
|
||||||
typedef struct FSMPrivateVars FSMPrivateVars;
|
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_General_Handlers)(void *data);
|
||||||
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
|
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
|
||||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
|
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_ResetSignals_Fcns)(FSMSignals* signals, void *);
|
||||||
typedef void (*Avoid_WARNING_loadData_Fcns)(void*);
|
typedef void (*Avoid_WARNING_loadData_Fcns)(void*);
|
||||||
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
|
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
|
||||||
|
@ -68,13 +69,12 @@ typedef struct FSMHandler{
|
||||||
int (**selectNextState)(void *data, FSMSignals* signals); /**< 每个状态配置的状态选择函数 */
|
int (**selectNextState)(void *data, FSMSignals* signals); /**< 每个状态配置的状态选择函数 */
|
||||||
|
|
||||||
void (**transitionTable)(void *data); /**< 状态转移函数表 */
|
void (**transitionTable)(void *data); /**< 状态转移函数表 */
|
||||||
void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行 */
|
void (*transitionGeneralAction)(void *data); /**< 通用状态转移函数,不论有没有独立的状态转移函数都会执行。常用来清空内部变量 */
|
||||||
|
|
||||||
void (**enterActionTable)(void *data, FSM **cFSM); /**< 进入状态时运行的函数,和plecs对标 */
|
void (**enterActionTable)(void *data); /**< 进入状态时运行的函数,和plecs对标 */
|
||||||
void (**duringActionTable)(void *data, FSM **cFSM); /**< 状态不变时运行的函数,和plecs对标 */
|
void (**duringActionTable)(void *data); /**< 状态不变时运行的函数,和plecs对标 */
|
||||||
void (**exitActionTable)(void *data, FSM **cFSM); /**< 状态退出时运行的函数,和plecs对标 */
|
void (**exitActionTable)(void *data); /**< 状态退出时运行的函数,和plecs对标 */
|
||||||
|
|
||||||
void (**childFSMStepTable)(FSM **cFSM); /**< @deprecated 子状态机暂时弃用 */
|
|
||||||
}FSMHandler;
|
}FSMHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,10 +84,12 @@ typedef struct FSMHandler{
|
||||||
*/
|
*/
|
||||||
typedef struct FSMSignals
|
typedef struct FSMSignals
|
||||||
{
|
{
|
||||||
Uint16 all; /**< 外部信号 */
|
unsigned int all; /**< 外部信号 */
|
||||||
Uint16 lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
unsigned int lastTriggeredSignal; /**< 上一次触发的外部信号,用于信号清除 */
|
||||||
}FSMSignals;
|
}FSMSignals;
|
||||||
#define Idle_Signal 0 /**< 清空上次触发信号,占用第一个信号位 */
|
|
||||||
|
|
||||||
|
#define FSM_Idle 0 /**< 清空上次触发信号,占用第一个信号位 */
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
||||||
|
@ -133,17 +135,16 @@ typedef struct FSM
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
void stepBaseFSM(FSM *pFSM);
|
void stepBaseFSM(FSM *pFSM);
|
||||||
void constructFSM(FSM* pFSM);
|
void constructFSM(FSM* pFSM);
|
||||||
FSM* newBaseFSM(int numState, int defaultState);
|
FSM* newBaseFSM(int numState);
|
||||||
void resetBaseFSM(FSM *pFSM);
|
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);
|
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;
|
return (signals->all >> signalFlag) & 1;
|
||||||
}
|
}
|
||||||
static inline void clearAllSignals(FSMSignals *signals){
|
static inline void clearAllSignals(FSMSignals *signals){
|
||||||
|
@ -151,4 +152,6 @@ static inline void clearAllSignals(FSMSignals *signals){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,8 +11,6 @@
|
||||||
#ifndef __FSM_PUBLIC_H_
|
#ifndef __FSM_PUBLIC_H_
|
||||||
#define __FSM_PUBLIC_H_
|
#define __FSM_PUBLIC_H_
|
||||||
|
|
||||||
typedef unsigned int Uint16;
|
|
||||||
typedef unsigned long Uint32;
|
|
||||||
|
|
||||||
#define BASE_FSM(ptr) ((FSM *)(ptr))
|
#define BASE_FSM(ptr) ((FSM *)(ptr))
|
||||||
#define BASE_PTR (FSM *)
|
#define BASE_PTR (FSM *)
|
||||||
|
@ -23,30 +21,29 @@ typedef struct FSMPublicFcns
|
||||||
{
|
{
|
||||||
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
|
const char *(*curState2ASCII)(FSM *pFSM);
|
||||||
}FSMPublicFcns;
|
}FSMPublicFcns;
|
||||||
|
|
||||||
/* -------------------------------- 避免警告的函数定义 ------------------------------- */
|
/* -------------------------------- 避免警告的函数定义 ------------------------------- */
|
||||||
#define Step(pFSM) _stepFSM((FSM *)pFSM) /**< 外界调用这个 */
|
#define Step(pFSM) _stepFSM((FSM *)pFSM) /**< 外界调用这个 */
|
||||||
|
#define CurState2ASCII(pFSM) _curState2ASCII((FSM *)pFSM) /**< 外界调用这个 */
|
||||||
#define GetData(pFSM) _getData((FSM*)pFSM) /**< 外界调用这个 */
|
#define GetData(pFSM) _getData((FSM*)pFSM) /**< 外界调用这个 */
|
||||||
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal) /**< 外界调用这个 */
|
#define SetSignal(pFSM, signal) _setSignal((FSM*)pFSM, signal) /**< 外界调用这个 */
|
||||||
|
|
||||||
|
|
||||||
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); /**< @deprecated */
|
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); /**< @deprecated */
|
||||||
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
||||||
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) /**< @deprecated */
|
||||||
|
|
||||||
|
|
||||||
void _stepFSM(FSM *pFSM);
|
void _stepFSM(FSM *pFSM);
|
||||||
|
const char * _curState2ASCII(FSM *pFSM);
|
||||||
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
||||||
int getFSMCurState(FSM *pFSM);
|
int getFSMCurState(FSM *pFSM);
|
||||||
int getFSMNextState(FSM *pFSM);
|
int getFSMNextState(FSM *pFSM);
|
||||||
void setChildNum(FSM *pFSM, int num);
|
|
||||||
void registerChildFSM(FSM *parent, FSM *child, int index);
|
|
||||||
|
|
||||||
/* ------------------------------ Data和Signals ------------------------------ */
|
/* ------------------------------ Data和Signals ------------------------------ */
|
||||||
const void *_getData(FSM* pFSM);
|
const void *_getData(FSM* pFSM);
|
||||||
void _setSignal(FSM *pFSM, Uint16 signalFlag);
|
void _setSignal(FSM *pFSM, unsigned int signalFlag);
|
||||||
|
|
||||||
/* ---------------------------------- 预装载器 ---------------------------------- */
|
/* ---------------------------------- 预装载器 ---------------------------------- */
|
||||||
void *_preloadIn(FSM *pFSM);
|
void *_preloadIn(FSM *pFSM);
|
||||||
|
|
|
@ -1,123 +1,83 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "parentFSM.h"
|
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
|
#include "parentFSM.h"
|
||||||
#define DEFAULT_STATE Idle
|
#include "parentFSM_private.h"
|
||||||
|
|
||||||
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",
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
State StartHandler(){
|
|
||||||
FSM_LOG(" start ");
|
|
||||||
return A;
|
|
||||||
}
|
|
||||||
|
|
||||||
State A2BHandler(){
|
/* -------------------------------------------------------------------------- */
|
||||||
FSM_LOG(" A2B ");
|
/* 纯虚函数,允许调用privateVars */
|
||||||
return B;
|
/* -------------------------------------------------------------------------- */
|
||||||
}
|
|
||||||
|
|
||||||
State B2AHandler(){
|
/**
|
||||||
FSM_LOG(" B2A ");
|
* @brief
|
||||||
return A;
|
* @deprecated 暂时没用,后续考虑data是否需要加锁再说
|
||||||
}
|
* @param data 主要是外部数据
|
||||||
|
*/
|
||||||
State B2CHandler(){
|
static void loadExternalData(ParentFSMData *data){ // 必须重新实现
|
||||||
FSM_LOG(" B2C ");
|
|
||||||
return C;
|
|
||||||
}
|
|
||||||
|
|
||||||
State C2AHandler(){
|
|
||||||
FSM_LOG(" C2A ");
|
|
||||||
return A;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void A_enterAction(){
|
/**
|
||||||
FSM_LOG(" enterA ");
|
* @brief 根据条件重置信号
|
||||||
}
|
* @details 清除被响应信号和所有小于被响应信号优先级的信号,具体可以参考notion
|
||||||
void A_duringAction(){
|
* @param signals 状态机接收到的信号
|
||||||
FSM_LOG(" duringA ");
|
* @param data 状态机数据
|
||||||
}
|
*/
|
||||||
void A_exitAction(){
|
static void resetSignals(FSMSignals *signals, ParentFSMData *data){ // 必须重新实现
|
||||||
FSM_LOG(" exitA ");
|
clearAllSignals(signals);
|
||||||
}
|
}
|
||||||
|
|
||||||
void B_enterAction(void *data, FSM **childFSM){
|
/**
|
||||||
FSM_LOG(" enterB ");
|
* @brief 给所有内部、外部数据分配堆空间
|
||||||
|
*
|
||||||
|
* @param pFSM
|
||||||
|
*/
|
||||||
|
static void initData(ParentFSM *pFSM){ // 必须重新实现
|
||||||
|
ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData));
|
||||||
|
|
||||||
FSM *cFSM = childFSM[0];
|
ParentFSMData tempData = {
|
||||||
cFSM->pureVtbl.step(cFSM);
|
.external = {
|
||||||
|
.arrindex = 0,
|
||||||
|
.x = 0,
|
||||||
|
},
|
||||||
|
.internal = {
|
||||||
|
.inner1 = 0,
|
||||||
|
.y1 = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
*data = tempData;
|
||||||
|
|
||||||
|
pFSM->base.data = data;
|
||||||
}
|
}
|
||||||
void B_duringAction(void *data, FSM **childFSM){
|
|
||||||
FSM_LOG(" duringB ");
|
|
||||||
|
|
||||||
FSM *cFSM = childFSM[0];
|
/**
|
||||||
cFSM->pureVtbl.step(cFSM);
|
* @brief
|
||||||
}
|
* @deprecated 弃用
|
||||||
void B_exitAction(void *data, FSM **childFSM){
|
* @param pFSM
|
||||||
FSM *cFSM = childFSM[0];
|
*/
|
||||||
cFSM->pureVtbl.reset(cFSM);
|
static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
|
||||||
|
// pFSM->base.privateVars->preloader.shadowData = malloc(sizeof(ParentFSMExternalData));
|
||||||
FSM_LOG(" exitB ");
|
// pFSM->base.privateVars->preloader.size = sizeof(ParentFSMExternalData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void C_enterAction(){
|
/**
|
||||||
FSM_LOG(" enterC ");
|
* @brief 设置状态选择函数、状态内函数和状态转移函数
|
||||||
}
|
*
|
||||||
void C_duringAction(){
|
* @param fcns 状态机函数表
|
||||||
FSM_LOG(" duringC ");
|
*/
|
||||||
}
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
void C_exitAction(){
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
FSM_LOG(" exitC ");
|
addSelectNextStateFcn(Idle);
|
||||||
}
|
addSelectNextStateFcn(A);
|
||||||
|
addSelectNextStateFcn(B);
|
||||||
|
addSelectNextStateFcn(C);
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){
|
|
||||||
|
|
||||||
|
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
||||||
addStateActionFcn(during, A);
|
addStateActionFcn(during, A);
|
||||||
addStateActionFcn(during, B);
|
addStateActionFcn(during, B);
|
||||||
addStateActionFcn(during, C);
|
addStateActionFcn(during, C);
|
||||||
|
@ -128,85 +88,68 @@ static void setupHandler(FSMHandler* fcns){
|
||||||
addStateActionFcn(exit, B);
|
addStateActionFcn(exit, B);
|
||||||
addStateActionFcn(exit, C);
|
addStateActionFcn(exit, C);
|
||||||
|
|
||||||
addTransitionHandler(Idle, Start);
|
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
|
||||||
addTransitionHandler(A, A2B);
|
addTransitionHandler(Idle, A);
|
||||||
addTransitionHandler(B, B2A);
|
addTransitionHandler(A, B);
|
||||||
addTransitionHandler(B, B2C);
|
addTransitionHandler(B, A);
|
||||||
addTransitionHandler(C, C2A);
|
addTransitionHandler(B, C);
|
||||||
}
|
addTransitionHandler(C, A);
|
||||||
|
|
||||||
|
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
|
||||||
|
|
||||||
/*
|
|
||||||
用户自定义事件选择逻辑—————————————————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]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 其他重新实现的函数,父类已有实现,实现多态 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* @brief 重新实现基类的step函数,添加一些打印信息
|
||||||
|
*
|
||||||
|
* @param pFSM 子类状态机指针
|
||||||
|
*/
|
||||||
static void step(ParentFSM* pFSM){
|
static void step(ParentFSM* pFSM){
|
||||||
printFSM(pFSM);
|
printFSM(pFSM);
|
||||||
_stepFSM(BASE_FSM(pFSM));
|
stepBaseFSM(BASE_FSM(pFSM));
|
||||||
}
|
FSM_LOG("NextState:%s", stateStr[getFSMNextState((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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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 *createParentFSM(){
|
||||||
|
|
||||||
ParentFSM *pFSM;
|
ParentFSM *pFSM;
|
||||||
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ParentFSM *)newBaseFSM(Count_State);
|
||||||
|
|
||||||
pFSM->base.pureVtbl.step = step;
|
// 重新实现的函数
|
||||||
pFSM->base.pureVtbl.selectNextState = selectEvent;
|
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
pFSM->base.pureVtbl.initData = initData;
|
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
pFSM->base.pureVtbl.setupHandler = setupHandler;
|
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||||
pFSM->base.pureVtbl.initDataLoader = 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;
|
return pFSM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)]);
|
||||||
|
}
|
|
@ -1,82 +1,143 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
#include "childFSM.h"
|
#include "childFSM.h"
|
||||||
#include "childFSM_private.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){ // 必须重新实现
|
static void initData(ChildFSM *pFSM){ // 必须重新实现
|
||||||
ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData));
|
ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData));
|
||||||
data->arrindex = 0;
|
|
||||||
|
|
||||||
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
|
ChildFSMData tempData = {
|
||||||
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
|
.external = {
|
||||||
|
.arrindex = 0,
|
||||||
|
.x = 0,
|
||||||
|
},
|
||||||
|
.internal = {
|
||||||
|
.inner1 = 0,
|
||||||
|
.y1 = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
*data = tempData;
|
||||||
|
|
||||||
pFSM->base.data = data;
|
pFSM->base.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* @deprecated 弃用
|
||||||
|
* @param pFSM
|
||||||
|
*/
|
||||||
static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现
|
static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现
|
||||||
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
|
// pFSM->base.privateVars->preloader.shadowData = malloc(sizeof(ChildFSMExternalData));
|
||||||
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
|
// pFSM->base.privateVars->preloader.size = sizeof(ChildFSMExternalData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置状态选择函数、状态内函数和状态转移函数
|
||||||
|
*
|
||||||
|
* @param fcns 状态机函数表
|
||||||
|
*/
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addStateActionFcn(during, E);
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
addSelectNextStateFcn(Idle);
|
||||||
|
addSelectNextStateFcn(D);
|
||||||
|
addSelectNextStateFcn(E);
|
||||||
|
|
||||||
|
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
||||||
addStateActionFcn(during, D);
|
addStateActionFcn(during, D);
|
||||||
|
addStateActionFcn(during, E);
|
||||||
addStateActionFcn(enter, D);
|
addStateActionFcn(enter, D);
|
||||||
addStateActionFcn(exit, D);
|
|
||||||
addStateActionFcn(enter, E);
|
addStateActionFcn(enter, E);
|
||||||
|
addStateActionFcn(exit, D);
|
||||||
addStateActionFcn(exit, E);
|
addStateActionFcn(exit, E);
|
||||||
|
|
||||||
addTransitionHandler(Idle, Idle2D);
|
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
|
||||||
addTransitionHandler(Idle, Idle2E);
|
addTransitionHandler(Idle, D);
|
||||||
addTransitionHandler(D, D2E);
|
addTransitionHandler(Idle, E);
|
||||||
addTransitionHandler(E, E2D);
|
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 *createChildFSM(){
|
||||||
|
|
||||||
ChildFSM *pFSM;
|
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.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
pFSM->base.pureVtbl.initData = initData;
|
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
pFSM->base.pureVtbl.setupHandler = setupHandler;
|
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||||
pFSM->base.pureVtbl.initDataLoader = 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;
|
return pFSM;
|
||||||
}
|
}
|
|
@ -1,17 +1,57 @@
|
||||||
#ifndef __CHILD_FSM_H_
|
#ifndef __CHILD_FSM_H_
|
||||||
#define __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 arrindex;
|
||||||
|
int x;
|
||||||
|
}ChildFSMExternalData;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 自定义内部数据
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef struct ChildFSMInnerData
|
||||||
|
{
|
||||||
|
int y1;
|
||||||
|
int inner1;
|
||||||
|
}ChildFSMInnerData;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 下面的改个名字就行了 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
typedef struct ChildFSMData
|
||||||
|
{
|
||||||
|
ChildFSMExternalData external;
|
||||||
|
ChildFSMInnerData internal;
|
||||||
}ChildFSMData;
|
}ChildFSMData;
|
||||||
|
|
||||||
typedef struct _ChildFSM ChildFSM;
|
typedef struct ChildFSM ChildFSM;
|
||||||
|
|
||||||
ChildFSM *createChildFSM();
|
ChildFSM *createChildFSM();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,121 +1,123 @@
|
||||||
#ifndef __CHILD_PRIVATE_FSM_H_
|
#ifdef __CHILDFSM_PRIVATE_FSM_H_
|
||||||
#define __CHILD_PRIVATE_FSM_H_
|
#error This file can only be included once!!!
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define __CHILDFSM_PRIVATE_FSM_H_
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
#include "childFSM.h"
|
#include "childFSM.h"
|
||||||
|
#include "childFSM_state.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
/* -------------------------------------------------------------------------- */
|
||||||
继承基类
|
/* 继承基类 */
|
||||||
*/
|
/* -------------------------------------------------------------------------- */
|
||||||
typedef struct _ChildFSM
|
typedef struct ChildFSM
|
||||||
{
|
{
|
||||||
// 继承父类
|
|
||||||
FSM base;
|
FSM base;
|
||||||
}ChildFSM;
|
}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 ");
|
FSM_LOG(" enterD ");
|
||||||
}
|
}
|
||||||
void actionFcn(during, D)()
|
static void actionFcn(during, D)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" duringD ");
|
FSM_LOG(" duringD ");
|
||||||
}
|
}
|
||||||
void actionFcn(exit, D)()
|
static void actionFcn(exit, D)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" exitD ");
|
FSM_LOG(" exitD ");
|
||||||
}
|
}
|
||||||
|
|
||||||
void actionFcn(enter, E)()
|
static void actionFcn(enter, E)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" enterE ");
|
FSM_LOG(" enterE ");
|
||||||
}
|
}
|
||||||
void actionFcn(during, E)()
|
static void actionFcn(during, E)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" duringE ");
|
FSM_LOG(" duringE ");
|
||||||
}
|
}
|
||||||
void actionFcn(exit, E)()
|
static void actionFcn(exit, E)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" exitE ");
|
FSM_LOG(" exitE ");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
事件和对应的转移函数
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum _Event{
|
/* -------------------------------------------------------------------------- */
|
||||||
Idle_Event,
|
/* 转移函数 */
|
||||||
Idle2D,
|
/* -------------------------------------------------------------------------- */
|
||||||
Idle2E,
|
static void transitionGeneralAction(FSM pFSM){
|
||||||
D2E,
|
// FSM_LOG("general");
|
||||||
E2D,
|
}
|
||||||
|
|
||||||
Count_Event,
|
// static void transitionGeneralAction(TemplateFSMData *data){
|
||||||
}Event;
|
// FSM_LOG("general");
|
||||||
|
// }
|
||||||
|
|
||||||
|
static void transitionHandler(Idle, D)()
|
||||||
State transitionHandler(Idle2D)()
|
|
||||||
{
|
{
|
||||||
FSM_LOG(" Idle2D ");
|
FSM_LOG(" Idle2D ");
|
||||||
return D;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
State transitionHandler(Idle2E)()
|
static void transitionHandler(Idle, E)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" Idle2E ");
|
FSM_LOG(" Idle2E ");
|
||||||
return E;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
State transitionHandler(D2E)()
|
static void transitionHandler(D, E)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" D2E ");
|
FSM_LOG(" D2E ");
|
||||||
return E;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
State transitionHandler(E2D)()
|
static void transitionHandler(E, D)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" E2D ");
|
FSM_LOG(" E2D ");
|
||||||
return D;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 打印调试 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
/*
|
|
||||||
用户自定义事件选择逻辑—————————————————begin
|
|
||||||
*/
|
|
||||||
const static char *stateStr[] = {
|
const static char *stateStr[] = {
|
||||||
"Idle",
|
"Idle",
|
||||||
"D",
|
"D",
|
||||||
"E",
|
"E",
|
||||||
};
|
|
||||||
const static char *eventStr[] = {
|
|
||||||
"Idle",
|
|
||||||
"Idle2D",
|
|
||||||
"Idle2E",
|
|
||||||
"D2E",
|
|
||||||
"E2D",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void printFSM(ChildFSM* pFSM){
|
static void printFSM(ChildFSM* pFSM){
|
||||||
FSM_LOG(" \t\tChildFSM: ");
|
FSM_LOG(" \tChild: ");
|
||||||
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
|
FSM_LOG("CurrentState:%s, Action", stateStr[getFSMCurState((FSM *)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -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
|
|
@ -7,27 +7,31 @@
|
||||||
ChildFSM *cFSM;
|
ChildFSM *cFSM;
|
||||||
ParentFSM *pFSM;
|
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(){
|
int main(){
|
||||||
|
|
||||||
cFSM = createChildFSM();
|
cFSM = createChildFSM();
|
||||||
pFSM = createParentFSM();
|
pFSM = createParentFSM();
|
||||||
|
|
||||||
setChildNum((pFSM), 1);
|
bind_ParentFSM_ChildFSMs(pFSM, (FSM *)cFSM);
|
||||||
registerChildFSM((pFSM), (cFSM), 0);
|
|
||||||
|
|
||||||
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;
|
printf("%d: ",k+1);
|
||||||
PreloaderGetReady(pFSM);
|
SetSignal(pFSM, i[k]);
|
||||||
|
SetSignal(cFSM, j[k]);
|
||||||
|
|
||||||
ChildFSM_Input(cFSM)->arrindex = i;
|
if(k > 5){
|
||||||
PreloaderGetReady(cFSM);
|
((ParentFSMData *)GetData(cFSM))->external.x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ChildFSMData* data = _getData((FSM *)(cFSM));
|
Step(pFSM);
|
||||||
printf(" %d ", data->arrindex);
|
|
||||||
|
|
||||||
|
|
||||||
_vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,67 @@
|
||||||
#ifndef __PARENT_FSM_H_
|
#ifndef __PARENT_FSM_H_
|
||||||
#define __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 arrindex;
|
||||||
|
int x;
|
||||||
|
}ParentFSMExternalData;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 自定义内部数据
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef struct ParentFSMInnerData
|
||||||
|
{
|
||||||
|
int y1;
|
||||||
|
int inner1;
|
||||||
|
}ParentFSMInnerData;
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 这一块改个名字就行了 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
typedef struct ParentFSMData
|
||||||
|
{
|
||||||
|
ParentFSMExternalData external;
|
||||||
|
ParentFSMInnerData internal;
|
||||||
}ParentFSMData;
|
}ParentFSMData;
|
||||||
typedef struct _ParentFSM ParentFSM;
|
|
||||||
|
|
||||||
ParentFSM *createParentFSM();
|
ParentFSM *createParentFSM();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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
|
|
@ -14,6 +14,25 @@
|
||||||
#include "keyFSM.h"
|
#include "keyFSM.h"
|
||||||
#include "keyFSM_private.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 */
|
/* 纯虚函数,允许调用privateVars */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -22,7 +41,7 @@ static void loadExternalData(KeyFSMData *data){ // 必须重新实现
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现
|
static void resetSignals(FSMSignals *signals, KeyFSMData *data){ // 必须重新实现
|
||||||
data->internal.out = Idle;
|
// data->internal.out = Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
static void initData(KeyFSM *pFSM){ // 必须重新实现
|
||||||
|
@ -41,6 +60,7 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
addSelectNextStateFcn(Idle_State);
|
||||||
addSelectNextStateFcn(Waiting);
|
addSelectNextStateFcn(Waiting);
|
||||||
addSelectNextStateFcn(DownDebouncing);
|
addSelectNextStateFcn(DownDebouncing);
|
||||||
addSelectNextStateFcn(Downing);
|
addSelectNextStateFcn(Downing);
|
||||||
|
@ -96,7 +116,7 @@ static void step(KeyFSM* pFSM){
|
||||||
KeyFSM *createKeyFSM(){
|
KeyFSM *createKeyFSM(){
|
||||||
|
|
||||||
KeyFSM *pFSM;
|
KeyFSM *pFSM;
|
||||||
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
pFSM = (KeyFSM *)newBaseFSM(Count_State);
|
||||||
|
|
||||||
#ifndef DSP28377
|
#ifndef DSP28377
|
||||||
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
|
|
|
@ -51,5 +51,7 @@ typedef struct _KeyFSM KeyFSM;
|
||||||
KeyFSM *createKeyFSM();
|
KeyFSM *createKeyFSM();
|
||||||
|
|
||||||
|
|
||||||
|
KeyOut readKeyFSMOut(KeyFSM *FSM);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
extern KeyIn keystat;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,14 +37,17 @@ typedef enum _State
|
||||||
|
|
||||||
Count_State,
|
Count_State,
|
||||||
} State;
|
} State;
|
||||||
#define DEFAULT_STATE Waiting
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下一个状态选择函数 */
|
/* 下一个状态选择函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static State selectNextStateFcn(Idle_State)(KeyFSMData *data){
|
||||||
|
return Waiting;
|
||||||
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
||||||
|
|
||||||
if(data->external.in == Down){
|
if(data->external.in == pDown){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
return DownDebouncing;
|
return DownDebouncing;
|
||||||
}
|
}
|
||||||
|
@ -83,7 +86,7 @@ static State selectNextStateFcn(Holding)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
|
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
|
||||||
if(data->external.in == Down){
|
if(data->external.in == pDown){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
return Holding;
|
return Holding;
|
||||||
}
|
}
|
||||||
|
@ -94,7 +97,7 @@ static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
||||||
if(data->external.in == Down){
|
if(data->external.in == pDown){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
if(data->internal.countMultiDown){
|
if(data->internal.countMultiDown){
|
||||||
return MultiDowning;
|
return MultiDowning;
|
||||||
|
@ -111,7 +114,7 @@ static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
||||||
}
|
}
|
||||||
|
|
||||||
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
|
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
|
||||||
if(data->external.in == Down){
|
if(data->external.in == pDown){
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
return MultiDownDebouncing;
|
return MultiDownDebouncing;
|
||||||
}
|
}
|
||||||
|
@ -213,17 +216,17 @@ void transitionGeneralAction(KeyFSMData *data){
|
||||||
data->internal.countDelay = 0;
|
data->internal.countDelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
|
static void transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
|
||||||
data->internal.out = Down;
|
data->internal.out = Down;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
|
static void transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
|
||||||
data->internal.out = Idle;
|
data->internal.out = Idle;
|
||||||
data->internal.countMultiDown++;
|
data->internal.countMultiDown++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
|
static void transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
|
||||||
switch (data->internal.countMultiDown + 1)
|
switch (data->internal.countMultiDown + 1)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -241,11 +244,11 @@ 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;
|
data->internal.out = Hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
|
static void transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
|
||||||
data->internal.countMultiDown = 0;
|
data->internal.countMultiDown = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +273,7 @@ const static char *stateStr[] = {
|
||||||
static void printFSM(KeyFSM* pFSM){
|
static void printFSM(KeyFSM* pFSM){
|
||||||
KeyFSMData* data = pFSM->base.data;
|
KeyFSMData* data = pFSM->base.data;
|
||||||
FSM_LOG("KeyFSM: ");
|
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)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include "assert.h"
|
||||||
|
|
||||||
#include "keyFSM.h"
|
#include "keyFSM.h"
|
||||||
#include "FSM_public.h"
|
#include "FSM_public.h"
|
||||||
|
@ -23,19 +24,20 @@ KeyIn keystat;
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
|
|
||||||
|
|
||||||
KeyFSM* keyFSM = createKeyFSM();
|
KeyFSM* keyFSM = createKeyFSM();
|
||||||
|
|
||||||
for (int i = 0; i < NUM; i++)
|
for (int i = 0; i < NUM; i++)
|
||||||
{
|
{
|
||||||
printf("第%d次: ",i+1);
|
printf("第%d次: ",i+1);
|
||||||
const KeyFSMData* data = _getData((FSM *)keyFSM);
|
|
||||||
|
|
||||||
keystat = testin[i];
|
keystat = testin[i];
|
||||||
|
|
||||||
Step(keyFSM);
|
Step(keyFSM);
|
||||||
|
|
||||||
if(data->internal.out){
|
KeyOut out = readKeyFSMOut(keyFSM);
|
||||||
printf("\t\t\t\t%d", data->internal.out);
|
if(out != Idle){
|
||||||
|
printf("\t\t\t\t%d", out);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
#include "FSM_public.h"
|
#include "FSM_public.h"
|
||||||
|
@ -28,8 +29,11 @@ int main(){
|
||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printf("%d, " ,i);
|
printf("%d, " ,i);
|
||||||
|
|
||||||
|
printf("\t\t %s", CurState2ASCII(pFSM));
|
||||||
|
|
||||||
Step(pFSM);
|
Step(pFSM);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,11 @@
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
#include "templateFSM_private.h"
|
#include "templateFSM_private.h"
|
||||||
|
|
||||||
|
|
||||||
|
const char * curState2ASCII(TemplateFSM *pFSM){
|
||||||
|
return stateStr[getFSMCurState((FSM *)pFSM)];
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 纯虚函数,允许调用privateVars */
|
/* 纯虚函数,允许调用privateVars */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -92,6 +97,7 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
*/
|
*/
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
addSelectNextStateFcn(Idle);
|
||||||
addSelectNextStateFcn(D);
|
addSelectNextStateFcn(D);
|
||||||
addSelectNextStateFcn(E);
|
addSelectNextStateFcn(E);
|
||||||
|
|
||||||
|
@ -142,10 +148,11 @@ static void step(TemplateFSM* pFSM){
|
||||||
*/
|
*/
|
||||||
TemplateFSM *createTemplateFSM(){
|
TemplateFSM *createTemplateFSM(){
|
||||||
TemplateFSM *pFSM;
|
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.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.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||||
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
|
|
|
@ -54,8 +54,6 @@ typedef struct TemplateFSMInnerData
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下面的改个名字就行了 */
|
/* 下面的改个名字就行了 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM)) /**< @deprecated 暂时弃用 */
|
|
||||||
|
|
||||||
typedef struct TemplateFSMData
|
typedef struct TemplateFSMData
|
||||||
{
|
{
|
||||||
TemplateFSMExternalData external;
|
TemplateFSMExternalData external;
|
||||||
|
@ -64,6 +62,7 @@ typedef struct TemplateFSMData
|
||||||
|
|
||||||
typedef struct TemplateFSM TemplateFSM;
|
typedef struct TemplateFSM TemplateFSM;
|
||||||
TemplateFSM *createTemplateFSM();
|
TemplateFSM *createTemplateFSM();
|
||||||
|
const char * curState2ASCII_TemplateFSM(TemplateFSM *pFSM);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "FSM_protected.h"
|
#include "FSM_protected.h"
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
|
#include "templateFSM_state.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -34,28 +35,17 @@ typedef struct TemplateFSM
|
||||||
FSM base;
|
FSM base;
|
||||||
}TemplateFSM;
|
}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){
|
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
|
||||||
if(getSignal(signals, Signal_A)){
|
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");
|
FSM_LOG("general");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
116
父子状态机测试.plecs
116
父子状态机测试.plecs
|
@ -1,5 +1,5 @@
|
||||||
Plecs {
|
Plecs {
|
||||||
Name base64 "54q25oCB5py65rWL6K+V"
|
Name base64 "54i25a2Q54q25oCB5py65rWL6K+V"
|
||||||
Version "4.7"
|
Version "4.7"
|
||||||
CircuitModel "ContStateSpace"
|
CircuitModel "ContStateSpace"
|
||||||
StartTime "0.0"
|
StartTime "0.0"
|
||||||
|
@ -47,7 +47,7 @@ Plecs {
|
||||||
ScriptsDialogGeometry ""
|
ScriptsDialogGeometry ""
|
||||||
ScriptsDialogSplitterPos "0"
|
ScriptsDialogSplitterPos "0"
|
||||||
Schematic {
|
Schematic {
|
||||||
Location [1734, 301; 2376, 730]
|
Location [306, 311; 948, 731]
|
||||||
ZoomFactor 1.71498
|
ZoomFactor 1.71498
|
||||||
SliderPosition [0, 0]
|
SliderPosition [0, 0]
|
||||||
ShowBrowser off
|
ShowBrowser off
|
||||||
|
@ -139,9 +139,9 @@ Plecs {
|
||||||
Show off
|
Show off
|
||||||
}
|
}
|
||||||
FSM {
|
FSM {
|
||||||
Location [-1, -8; 2559, 1309]
|
Location [190, 122; 1746, 914]
|
||||||
ZoomFactor 1.14437
|
ZoomFactor 0.76361
|
||||||
SliderPosition [0, 0]
|
SliderPosition [0, 47]
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "A"
|
Name "A"
|
||||||
Position [360, 480]
|
Position [360, 480]
|
||||||
|
@ -161,8 +161,8 @@ Plecs {
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "B"
|
Name "B"
|
||||||
Position [1110, 430]
|
Position [1210, 400]
|
||||||
Frame [-420, -270; 420, 270]
|
Frame [-520, -240; 520, 240]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
Value "printf(\" enterB \");"
|
Value "printf(\" enterB \");"
|
||||||
|
@ -177,7 +177,7 @@ Plecs {
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "D"
|
Name "D"
|
||||||
Position [-240, -10]
|
Position [-340, 20]
|
||||||
Frame [-100, -90; 100, 90]
|
Frame [-100, -90; 100, 90]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
|
@ -192,10 +192,18 @@ Plecs {
|
||||||
Value "printf(\" exitD \");"
|
Value "printf(\" exitD \");"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
FsmState {
|
||||||
|
Name ".Junction"
|
||||||
|
Position [-190, -130]
|
||||||
|
}
|
||||||
|
FsmState {
|
||||||
|
Name ".PointState"
|
||||||
|
Position [-190, -170]
|
||||||
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "E"
|
Name "E"
|
||||||
Position [210, -10]
|
Position [240, 20]
|
||||||
Frame [-100, -90; 100, 90]
|
Frame [-230, -90; 230, 90]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
Value "printf(\" enterE \");"
|
Value "printf(\" enterE \");"
|
||||||
|
@ -209,19 +217,11 @@ Plecs {
|
||||||
Value "printf(\" exitE \");"
|
Value "printf(\" exitE \");"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FsmState {
|
|
||||||
Name ".Junction"
|
|
||||||
Position [-90, -160]
|
|
||||||
}
|
|
||||||
FsmState {
|
|
||||||
Name ".PointState"
|
|
||||||
Position [-90, -200]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
FsmState {
|
FsmState {
|
||||||
Name "C"
|
Name "C"
|
||||||
Position [650, 1050]
|
Position [850, 1050]
|
||||||
Frame [-100, -90; 100, 90]
|
Frame [-300, -90; 300, 90]
|
||||||
Parameter {
|
Parameter {
|
||||||
Name "EnterAction"
|
Name "EnterAction"
|
||||||
Value "printf(\" enterC \");"
|
Value "printf(\" enterC \");"
|
||||||
|
@ -367,6 +367,38 @@ Plecs {
|
||||||
Value "1"
|
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 {
|
FsmTransition {
|
||||||
FsmSrcInfo {
|
FsmSrcInfo {
|
||||||
StatePath "B/D"
|
StatePath "B/D"
|
||||||
|
@ -527,38 +559,6 @@ Plecs {
|
||||||
Value "2"
|
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 {
|
Component {
|
||||||
|
@ -571,7 +571,7 @@ Plecs {
|
||||||
LabelPosition south
|
LabelPosition south
|
||||||
Parameter {
|
Parameter {
|
||||||
Variable "DialogGeometry"
|
Variable "DialogGeometry"
|
||||||
Value "[1296 663 655 313]"
|
Value "[947 556 655 313]"
|
||||||
Show off
|
Show off
|
||||||
}
|
}
|
||||||
Parameter {
|
Parameter {
|
||||||
|
@ -683,17 +683,17 @@ Plecs {
|
||||||
Direction up
|
Direction up
|
||||||
Flipped off
|
Flipped off
|
||||||
LabelPosition south
|
LabelPosition south
|
||||||
Location [811, 582; 1161, 825]
|
Location [974, 426; 1324, 693]
|
||||||
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
|
State "AAAA/wAAAAD9AAAAAgAAAAEAAAAAAAAAAPwCAAAAA/sAAAAQAFoAbwBvA"
|
||||||
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
|
"G0AQQByAGUAYQAAAAAA/////wAAADQA////+wAAABQAUwBhAHYAZQBkAFYAaQBlAHcAcwAAAAAA//"
|
||||||
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
|
"///wAAAGYA////+wAAAAwAVAByAGEAYwBlAHMAAAAAAP////8AAABmAP///wAAAAMAAAAAAAAAAPw"
|
||||||
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADYAAAA"
|
"BAAAAAfsAAAAUAEQAYQB0AGEAVwBpAGQAZwBlAHQAAAAAAP////8AAABQAP///wAAAV4AAADwAAAA"
|
||||||
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
|
"BAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAFQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAA"
|
||||||
"AAAAA=="
|
"AAAAA=="
|
||||||
SavedViews "AAAAAgAAAAA="
|
SavedViews "AAAAAgAAAAA="
|
||||||
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA"
|
HeaderState "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAL/gMAAAAJAAAAA"
|
||||||
"wAAAGQAAAACAAAAZAAAAAkAAABkAAAACAAAAGQAAAAFAAAAZAAAAAQAAABkAAAABwAAAGQAAAAGAA"
|
"gAAAGQAAAAJAAAAZAAAAAgAAABkAAAABQAAAGQAAAAEAAAAZAAAAAcAAABkAAAABgAAAGQAAAABAA"
|
||||||
"AAZAAAAAEAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
|
"AAZAAAAAMAAABkAAAAiwAAAAsBAAABAAAAAAAAAAAAAAAAZP////8AAACBAAAAAAAAAAsAAABzAAA"
|
||||||
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
|
"AAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA"
|
||||||
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
|
"AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAA"
|
||||||
"AAYAAAAAQAAAAAAAAPoAAAAABg="
|
"AAYAAAAAQAAAAAAAAPoAAAAABg="
|
||||||
|
@ -781,4 +781,4 @@ Plecs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DemoSignature "C/ZrxOQHJ0OXW30du/vTiFYFVRZZzc0r6Uyc2MRNbyo="
|
DemoSignature "jw8KDReJrMPoo1lAaPtOZeufBUfPGFLDXzJKLXRaW0c="
|
||||||
|
|
|
@ -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="
|
Loading…
Reference in New Issue