Merge branch 'release/2.0'

This commit is contained in:
godcreator02 2024-04-23 19:39:03 +08:00
commit d4a77e9ae9
19 changed files with 664 additions and 667 deletions

View File

@ -15,8 +15,8 @@
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.C2000.Debug.1844093621" name="CPU1_RAM" parent="com.ti.ccstudio.buildDefinitions.C2000.Debug"> <configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.C2000.Debug.1844093621" name="CPU1_RAM" parent="com.ti.ccstudio.buildDefinitions.C2000.Debug">
<folderInfo id="com.ti.ccstudio.buildDefinitions.C2000.Debug.1844093621." name="/" resourcePath=""> <folderInfo id="com.ti.ccstudio.buildDefinitions.C2000.Debug.1844093621." name="/" resourcePath="">
<toolChain id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.DebugToolchain.1805321654" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.linkerDebug.590139635"> <toolChain id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.DebugToolchain.249788100" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.linkerDebug.592017555">
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.805138293" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.404513923" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=TMS320C28XX.TMS320F28377D"/> <listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=TMS320C28XX.TMS320F28377D"/>
<listOptionValue builtIn="false" value="DEVICE_CORE_ID="/> <listOptionValue builtIn="false" value="DEVICE_CORE_ID="/>
<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/> <listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
@ -28,21 +28,21 @@
<listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={}"/> <listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={}"/>
<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/> <listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
</option> </option>
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.513451712" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="22.6.0.LTS" valueType="string"/> <option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.305402828" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="22.6.1.LTS" valueType="string"/>
<targetPlatform id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.targetPlatformDebug.1537686623" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.targetPlatformDebug"/> <targetPlatform id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.targetPlatformDebug.991038051" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.targetPlatformDebug"/>
<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.builderDebug.1308301813" keepEnvironmentInBuildfile="false" name="GNU Make" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.builderDebug"/> <builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.builderDebug.1390233029" keepEnvironmentInBuildfile="false" name="GNU Make" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.builderDebug"/>
<tool id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.compilerDebug.169024832" name="C2000 Compiler" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.compilerDebug"> <tool id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.compilerDebug.584474634" name="C2000 Compiler" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.compilerDebug">
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.LARGE_MEMORY_MODEL.1852737827" name="Option deprecated, set by default (--large_memory_model, -ml)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.LARGE_MEMORY_MODEL" value="true" valueType="boolean"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.LARGE_MEMORY_MODEL.879609465" name="Option deprecated, set by default (--large_memory_model, -ml)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.LARGE_MEMORY_MODEL" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.UNIFIED_MEMORY.436949653" name="Unified memory (--unified_memory, -mt)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.UNIFIED_MEMORY" value="true" valueType="boolean"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.UNIFIED_MEMORY.479773730" name="Unified memory (--unified_memory, -mt)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.UNIFIED_MEMORY" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION.1206458229" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION.28" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION.1636612494" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION.28" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.1243236335" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.1698350652" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.CLA_SUPPORT.862922409" name="Specify CLA support (--cla_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.CLA_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.CLA_SUPPORT.cla1" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.CLA_SUPPORT.499775360" name="Specify CLA support (--cla_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.CLA_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.CLA_SUPPORT.cla1" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.VCU_SUPPORT.789583918" name="Specify VCU support (--vcu_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.VCU_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.VCU_SUPPORT.vcu2" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.VCU_SUPPORT.2139851081" name="Specify VCU support (--vcu_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.VCU_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.VCU_SUPPORT.vcu2" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.TMU_SUPPORT.1809245799" name="Specify TMU support (--tmu_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.TMU_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.TMU_SUPPORT.tmu0" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.TMU_SUPPORT.1467835285" name="Specify TMU support (--tmu_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.TMU_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.TMU_SUPPORT.tmu0" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.1580760795" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.2" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.1828469393" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.3" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.2114718752" name="Speed vs. size trade-offs (--opt_for_speed, -mf)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.2" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.1025940074" name="Speed vs. size trade-offs (--opt_for_speed, -mf)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.4" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FP_MODE.536412730" 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.980621474" 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/baseFSM"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/usr"/> <listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/usr"/>
@ -58,36 +58,36 @@
<listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/baseFSM"/> <listOptionValue builtIn="false" value="${PROJECT_LOC}/../vscode/FSM_OOP/baseFSM"/>
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/> <listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
</option> </option>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.ADVICE__PERFORMANCE.605523803" 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.963154982" 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="NDEBUG"/>
<listOptionValue builtIn="false" value="DSP28377"/> <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.1154586089" 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"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.C_DIALECT.58637704" name="C Dialect" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.C_DIALECT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.C_DIALECT.C99" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.C_DIALECT.1353315307" name="C Dialect" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.C_DIALECT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.C_DIALECT.C99" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WARNING.1770442652" name="Treat diagnostic &lt;id&gt; as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WARNING" valueType="stringList"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WARNING.57396888" name="Treat diagnostic &lt;id&gt; as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WARNING" valueType="stringList">
<listOptionValue builtIn="false" value="225"/> <listOptionValue builtIn="false" value="225"/>
</option> </option>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIAG_WRAP.170185464" name="Wrap diagnostic messages (--diag_wrap)" 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.239663357" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" 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.1177630758" 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"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__C_SRCS.1948358722" 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.1137813289" 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.1884647892" 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"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__ASM2_SRCS.496724480" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__ASM2_SRCS"/> <inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__ASM2_SRCS.1332829672" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compiler.inputType__ASM2_SRCS"/>
</tool> </tool>
<tool id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.linkerDebug.590139635" name="C2000 Linker" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.linkerDebug"> <tool id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.linkerDebug.592017555" name="C2000 Linker" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.exe.linkerDebug">
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.STACK_SIZE.1169278019" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.STACK_SIZE" value="0x200" valueType="string"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.STACK_SIZE.1845372756" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.STACK_SIZE" value="0x200" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.MAP_FILE.1652857044" name="Link information (map) listed into &lt;file&gt; (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.MAP_FILE" value="${ProjName}.map" valueType="string"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.MAP_FILE.290679978" name="Link information (map) listed into &lt;file&gt; (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.MAP_FILE" value="${ProjName}.map" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.OUTPUT_FILE.1982263147" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.OUTPUT_FILE" value="${ProjName}.out" valueType="string"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.OUTPUT_FILE.540534179" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.OUTPUT_FILE" value="${ProjName}.out" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.HEAP_SIZE.2068288548" name="Heap size for C/C++ dynamic memory allocation (--heap_size, -heap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.HEAP_SIZE" value="0x600" valueType="string"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.HEAP_SIZE.1350598154" name="Heap size for C/C++ dynamic memory allocation (--heap_size, -heap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.HEAP_SIZE" value="0x600" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.LIBRARY.1218574796" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.LIBRARY" valueType="libs"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.LIBRARY.1474212421" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.LIBRARY" valueType="libs">
<listOptionValue builtIn="false" value="rts2800_fpu32_eabi.lib"/> <listOptionValue builtIn="false" value="rts2800_fpu32_eabi.lib"/>
<listOptionValue builtIn="false" value="libc.a"/> <listOptionValue builtIn="false" value="libc.a"/>
</option> </option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.SEARCH_PATH.665425120" name="Add &lt;dir&gt; to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.SEARCH_PATH" valueType="libPaths"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.SEARCH_PATH.324541294" name="Add &lt;dir&gt; to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.SEARCH_PATH" valueType="libPaths">
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/> <listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/> <listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/source"/> <listOptionValue builtIn="false" value="${PROJECT_ROOT}/source"/>
@ -95,21 +95,21 @@
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/usr"/> <listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/usr"/>
<listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/baseFSM"/> <listOptionValue builtIn="false" value="${PROJECT_ROOT}/FSM_OOP/baseFSM"/>
</option> </option>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_WRAP.227102602" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_WRAP.off" valueType="enumerated"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_WRAP.1617640026" name="Wrap diagnostic messages (--diag_wrap) [deprecated]" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DISPLAY_ERROR_NUMBER.1170568807" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DISPLAY_ERROR_NUMBER.1484093209" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.XML_LINK_INFO.253422497" name="Detailed link information data-base into &lt;file&gt; (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.XML_LINK_INFO" value="${ProjName}_linkInfo.xml" valueType="string"/> <option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.XML_LINK_INFO.1208865168" name="Detailed link information data-base into &lt;file&gt; (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.XML_LINK_INFO" value="${ProjName}_linkInfo.xml" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.linkerID.ENTRY_POINT.267642096" 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.1389010089" 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.1191787507" 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"/>
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_22.6.exeLinker.inputType__CMD_SRCS.386045799" 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.996301977" 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.212546431" 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"/>
</tool> </tool>
<tool id="com.ti.ccstudio.buildDefinitions.C2000_22.6.hex.622693696" name="C2000 Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.hex"/> <tool id="com.ti.ccstudio.buildDefinitions.C2000_22.6.hex.1432236849" name="C2000 Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.hex"/>
</toolChain> </toolChain>
</folderInfo> </folderInfo>
<sourceEntries> <sourceEntries>
<entry excluding="2837x_FLASH_lnk_cpu1.cmd|source/F2837xD_SWPrioritizedPieVect.c|2837xD_FLASH_lnk_cpu1.cmd" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> <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=""/>
</sourceEntries> </sourceEntries>
</configuration> </configuration>
</storageModule> </storageModule>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -30,33 +30,33 @@ int isDown = 0;
ChildFSM *cFSM; //ChildFSM *cFSM;
ParentFSM *pFSM; //ParentFSM *pFSM;
void childTest(){ //void childTest(){
//
cFSM = createChildFSM(); // cFSM = createChildFSM();
pFSM = createParentFSM(); // pFSM = createParentFSM();
//
setChildNum((pFSM), 1); // setChildNum((pFSM), 1);
registerChildFSM((pFSM), (cFSM), 0); // registerChildFSM((pFSM), (cFSM), 0);
//
for (int i = 0; i < 15; i++) // for (int i = 0; i < 15; i++)
{ // {
ParentFSM_Input(pFSM)->arrindex = i; // ParentFSM_Input(pFSM)->arrindex = i;
SetPreloaderReady(pFSM); // SetPreloaderReady(pFSM);
//
ChildFSM_Input(cFSM)->arrindex = i; // ChildFSM_Input(cFSM)->arrindex = i;
SetPreloaderReady(cFSM); // SetPreloaderReady(cFSM);
//
ChildFSMData* data = getData((FSM *)(cFSM)); // ChildFSMData* data = getData((FSM *)(cFSM));
printf(" %d ", data->arrindex); // printf(" %d ", data->arrindex);
//
tic(); // tic();
_vptrFSM((FSM *)pFSM)->step((FSM *)pFSM); // _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM);
toc(index++); // toc(index++);
printf("\n"); // printf("\n");
} // }
} //}
@ -67,24 +67,25 @@ KeyFSMData* data;
void keyFSMTest(){ void keyFSMTest(){
keyFSM = createKeyFSM(); keyFSM = createKeyFSM();
data = getData((FSM *)keyFSM); data = _getData((FSM *)keyFSM);
printf("hello 28377\n"); printf("hello 28377\n");
while(1){ while(1){
*KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO); *KeyFSM_Input(keyFSM) = !GPIO_ReadPin(INPUT_GPIO);
SetPreloaderReady(keyFSM); PreloaderGetReady(keyFSM);
tic(); tic();
Step(keyFSM); Step(keyFSM);
toc(index++);
if(data->out != Idle){ if(data->out != Idle){
toc(++index);
printf("%s\n", keyStr[data->out]); printf("%s\n", keyStr[data->out]);
} }
else{ else{
toc(0); index--;
} }
DELAY_US(20*1000); DELAY_US(20*1000);
@ -125,8 +126,8 @@ void main(void)
GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP); GPIO_SetupPinOptions(INPUT_GPIO, GPIO_INPUT, GPIO_PULLUP);
childTest(); // childTest();
// keyFSMTest(); keyFSMTest();
// funptrTest(); // funptrTest();
} }

View File

@ -1,62 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configurations XML_version="1.2" id="configurations_0"> <configurations XML_version="1.2" id="configurations_0">
<configuration XML_version="1.2" id="configuration_0"> <configuration XML_version="1.2" id="configuration_0">
<instance XML_version="1.2" desc="Texas Instruments XDS100v3 USB Debug Probe" href="connections/TIXDS100v3_Dot7_Connection.xml" id="Texas Instruments XDS100v3 USB Debug Probe" xml="TIXDS100v3_Dot7_Connection.xml" xmlpath="connections"/> <instance XML_version="1.2" desc="Texas Instruments XDS100v3 USB Debug Probe" href="connections/TIXDS100v3_Dot7_Connection.xml" id="Texas Instruments XDS100v3 USB Debug Probe" xml="TIXDS100v3_Dot7_Connection.xml" xmlpath="connections"/>
<connection XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe"> <connection XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe">
<instance XML_version="1.2" href="drivers/tixds100v2icepick_c.xml" id="drivers" xml="tixds100v2icepick_c.xml" xmlpath="drivers"/> <instance XML_version="1.2" href="drivers/tixds100v2icepick_c.xml" id="drivers" xml="tixds100v2icepick_c.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2c28x.xml" id="drivers" xml="tixds100v2c28x.xml" xmlpath="drivers"/> <instance XML_version="1.2" href="drivers/tixds100v2c28x.xml" id="drivers" xml="tixds100v2c28x.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cla1.xml" id="drivers" xml="tixds100v2cla1.xml" xmlpath="drivers"/> <instance XML_version="1.2" href="drivers/tixds100v2cla1.xml" id="drivers" xml="tixds100v2cla1.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cs_child.xml" id="drivers" xml="tixds100v2cs_child.xml" xmlpath="drivers"/> <instance XML_version="1.2" href="drivers/tixds100v2cs_child.xml" id="drivers" xml="tixds100v2cs_child.xml" xmlpath="drivers"/>
<platform XML_version="1.2" id="platform_0"> <platform XML_version="1.2" id="platform_0">
<instance XML_version="1.2" desc="TMS320F28377D" href="devices/tms320f28377d.xml" id="TMS320F28377D" xml="tms320f28377d.xml" xmlpath="devices"/> <instance XML_version="1.2" desc="TMS320F28377D" href="devices/tms320f28377d.xml" id="TMS320F28377D" xml="tms320f28377d.xml" xmlpath="devices"/>
<device HW_revision="1" XML_version="1.2" description="" id="TMS320F28377D" partnum="TMS320F28377D">
<device HW_revision="1" XML_version="1.2" description="" id="TMS320F28377D" partnum="TMS320F28377D" simulation="no">
<router HW_revision="1.0" XML_version="1.2" description="ICEPick_C router" id="IcePick_C_0" isa="ICEPICK_C"> <router HW_revision="1.0" XML_version="1.2" description="ICEPick_C router" id="IcePick_C_0" isa="ICEPICK_C">
<subpath id="Subpath_1"> <subpath id="Subpath_1">
<property Type="numericfield" Value="0x11" desc="Port Number_0" id="Port Number"/> <property Type="numericfield" Value="0x11" desc="Port Number_0" id="Port Number"/>
</subpath> </subpath>
</router> </router>
</device> </device>
</platform> </platform>
</connection> </connection>
</configuration> </configuration>
</configurations> </configurations>

View File

@ -1,11 +1,46 @@
{ {
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"icon": "terminal-powershell",
"args": ["-NoExit","chcp 65001"]
},
"Command Prompt": {
"path": [
"${env:windir}\\Sysnative\\cmd.exe",
"${env:windir}\\System32\\cmd.exe"
],
"args": ["/K","chcp 65001"],
"icon": "terminal-cmd"
},
"Git Bash": {
"source": "Git Bash"
}
},
"files.associations": { "files.associations": {
"filter.h": "c", "filter.h": "c",
"fsm_protected.h": "c", "fsm_protected.h": "c",
"keyfsm.h": "c", "keyfsm.h": "c",
"fsm_public.h": "c", "fsm_public.h": "c",
"stdio.h": "c", "stdio.h": "c",
"assert.h": "c" "assert.h": "c",
"climits": "c",
"cmath": "c",
"cstdarg": "c",
"cstdint": "c",
"cstdio": "c",
"cstdlib": "c",
"type_traits": "c",
"limits": "c",
"*.tcc": "c",
"typeinfo": "c",
"templatefsm.h": "c"
}, },
"files.encoding": "utf8"
"files.encoding": "utf8",
} }

View File

@ -6,7 +6,7 @@ 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)

View File

@ -7,148 +7,108 @@
#include "FSM_protected.h" #include "FSM_protected.h"
#include "FSM_public.h" #include "FSM_public.h"
/* /* -------------------------------------------------------------------------- */
protected /* private函数 */
*/ /* -------------------------------------------------------------------------- */
static inline void setNextState(FSM* pFSM){
void resetBaseFSM(FSM *pFSM) int curState = pFSM->privateVars.curState;
{ if(curState != 0){
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->data, pFSM->privateVars.childFSM);
pFSM->privateVars.curState = 0;
} }
static inline void setEvent(FSM* pFSM){ if(0 == pFSM->privateVars.numChild)
assert(pFSM->vtbl.selectEvent);
pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data, pFSM->signals);
if(0 == pFSM->privateVars.numChild){
return; return;
}
for (int i = 0; i < pFSM->privateVars.numChild; i++) for (int i = 0; i < pFSM->privateVars.numChild; i++)
{ {
FSM *cFSM = pFSM->privateVars.childFSM[i]; FSM *cFSM = pFSM->privateVars.childFSM[i];
setEvent(cFSM); setNextState(cFSM);
} }
} }
static inline void preload(FSM* pFSM){ static inline void preload(FSM* pFSM){
if(pFSM->privateVars.preloader.isReady){ if(pFSM->privateVars.preloader.isReady){
memcpy(pFSM->data, pFSM->privateVars.preloader.in, pFSM->privateVars.preloader.preloadSize); memcpy(pFSM->data, pFSM->privateVars.preloader.shadowData, pFSM->privateVars.preloader.size);
pFSM->privateVars.preloader.isReady = 0; pFSM->privateVars.preloader.isReady = 0;
} }
} }
static inline void resetSignals(FSM *pFSM){
memset(pFSM->signals, 0, pFSM->signalSize);
}
/* -------------------------------------------------------------------------- */
/* protected */
/* -------------------------------------------------------------------------- */
void stepBaseFSM(FSM *pFSM) void stepBaseFSM(FSM *pFSM)
{ {
preload(pFSM); preload(pFSM);
setEvent(pFSM); setNextState(pFSM);
pFSM->vtbl.resetSignals(pFSM); resetSignals(pFSM);
FSMHandler *fcns = &pFSM->privateVars.fcns; FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState; int curState = pFSM->privateVars.curState;
void *data = pFSM->data; void *data = pFSM->data;
FSM **childFSM = pFSM->privateVars.childFSM; FSM **childFSM = pFSM->privateVars.childFSM;
int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent; int index = pFSM->privateVars.index;
int nextState; int nextState = pFSM->privateVars.nextState;
if(fcns->delayedEvent){
fcns->transitionDelayTable[fcns->delayedEvent](data);
fcns->delayedEvent = 0;
}
if (fcns->transitionTable[index] != NULL) if(nextState && curState != nextState){ // 状态切换
if (fcns->transitionTable[index] != NULL) // 有特定的状态转移函数
{ {
if (fcns->exitActionTable[curState] != NULL) if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM); fcns->exitActionTable[curState](data, childFSM);
nextState = (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent); (*fcns->transitionTable[index])(data);
if (fcns->enterActionTable[nextState] != NULL) if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM); fcns->enterActionTable[nextState](data, childFSM);
}
if(fcns->transitionGeneralAction != NULL)
fcns->transitionGeneralAction(data); // 通用状态转移函数
pFSM->privateVars.curState = nextState; pFSM->privateVars.curState = nextState;
} }
else if(curState == 0){ else if(curState == 0){ // 处理刚运行进入的默认状态
nextState = pFSM->privateVars.defaultState; nextState = pFSM->privateVars.defaultState;
if (fcns->enterActionTable[nextState] != NULL) if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM); fcns->enterActionTable[nextState](data, childFSM);
pFSM->privateVars.curState = nextState; pFSM->privateVars.curState = nextState;
} }
else else // 状态机没动
{ {
if (fcns->duringActionTable[curState] != NULL) if (fcns->duringActionTable[curState] != NULL)
fcns->duringActionTable[curState](data, childFSM); fcns->duringActionTable[curState](data, childFSM);
} }
} }
FSM* newBaseFSM(int numState, int numEvent, int defaultState){
typedef void (*StateFuncPtr)(void *data);
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
typedef int (*TransitionFuncPtr)(void *data, int currentState);
FSM *pFSM = calloc(1, sizeof(FSM)); /* -------------------------------------------------------------------------- */
pFSM->privateVars.curEvent = 0; /* 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; pFSM->privateVars.curState = 0;
pFSM->privateVars.numEvent = numEvent; }
pFSM->privateVars.defaultState = defaultState;
pFSM->privateVars.numChild = 0;
pFSM->privateVars.preloader.isReady = 0; void _stepFSM(FSM *pFSM){
pFSM->step(pFSM);
pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr));
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numEvent, sizeof(ChildFSMStepFuncPtr));
pFSM->privateVars.fcns.transitionDelayTable = calloc(numEvent, sizeof(StateFuncPtr));
FSMVtbl vtbl = {
.reset = resetBaseFSM,
.step = stepBaseFSM,
.selectEvent = NULL,
.setupHandler = NULL,
.initData = NULL,
.initDataLoader = NULL,
.initSignals = NULL,
};
pFSM->vtbl = vtbl;
return pFSM;
} }
void constructFSM(FSM* pFSM){
assert(pFSM->vtbl.setupHandler);
assert(pFSM->vtbl.initData);
assert(pFSM->vtbl.initDataLoader);
assert(pFSM->vtbl.initSignals);
pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns);
pFSM->vtbl.initData(pFSM);
pFSM->vtbl.initDataLoader(pFSM);
pFSM->vtbl.initSignals(pFSM);
}
/*
public
*/
int getFSMCurState(FSM *pFSM){ int getFSMCurState(FSM *pFSM){
return pFSM->privateVars.curState; return pFSM->privateVars.curState;
} }
int getFSMCurEvent(FSM *pFSM){ int getFSMNextState(FSM *pFSM){
return pFSM->privateVars.curEvent; return pFSM->privateVars.nextState;
} }
void setChildNum(FSM *pFSM, int num){ void setChildNum(FSM *pFSM, int num){
pFSM->privateVars.numChild = num; pFSM->privateVars.numChild = num;
pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *)); pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *));
@ -168,7 +128,7 @@ void *_getSignals(FSM* pFSM){
void *_preloadIn(FSM *pFSM){ void *_preloadIn(FSM *pFSM){
return pFSM->privateVars.preloader.in; return pFSM->privateVars.preloader.shadowData;
} }
void _preloaderGetReady(FSM *pFSM){ void _preloaderGetReady(FSM *pFSM){
@ -187,6 +147,70 @@ void _clearPreloaderOverFlag(FSM *pFSM){
} }
FSMVtbl *_vptrFSM(FSM* pFSM){
return &pFSM->vtbl;
/* -------------------------------------------------------------------------- */
/* 构造函数,分两段,先新建再赋值 */
/* -------------------------------------------------------------------------- */
FSM* newBaseFSM(int numState, int defaultState){
typedef void (*StateFuncPtr)(void *);
typedef void (*ChildFSMStepFuncPtr)(FSM **);
typedef int (*TransitionFuncPtr)(void *, int *);
typedef int (*SelectNextStateFcnPtr)(void *, void *);
FSM *pFSM = calloc(1, sizeof(FSM));
pFSM->privateVars.numState = numState;
pFSM->privateVars.defaultState = defaultState;
pFSM->privateVars.curState = 0;
pFSM->privateVars.nextState = 0;
pFSM->privateVars.numChild = 0;
pFSM->privateVars.preloader.isReady = 0;
pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
FSMPureVtbl pureVtbl = {
.setupHandler = NULL,
.initData = NULL,
.initDataLoader = NULL,
.initSignals = NULL,
};
pFSM->pureVtbl = pureVtbl;
pFSM->step = stepBaseFSM;
pFSM->reset = resetBaseFSM;
return pFSM;
} }
void constructFSM(FSM* pFSM){
assert(pFSM->pureVtbl.setupHandler);
assert(pFSM->pureVtbl.initData);
assert(pFSM->pureVtbl.initDataLoader);
assert(pFSM->pureVtbl.initSignals);
pFSM->pureVtbl.setupHandler(&pFSM->privateVars.fcns);
pFSM->pureVtbl.initData(pFSM);
pFSM->pureVtbl.initDataLoader(pFSM);
pFSM->pureVtbl.initSignals(pFSM);
/* ---------------------------------- 检查状态表 --------------------------------- */
for (int i = 1; i < pFSM->privateVars.numState; i++) // 跳过Idle状态Idle状态只能跳转到默认状态
{
if(!pFSM->privateVars.fcns.selectNextState[i]){
FSM_LOG("每个状态都要有一个状态选择函数!\n");
assert(0); // 强制退出
}
}
}

View File

@ -17,93 +17,118 @@
#define FSM_LOG(...) ((void)0) #define FSM_LOG(...) ((void)0)
#endif #endif
#define delay delay
#define during during #define during during
#define enter enter #define enter enter
#define exit exit #define exit exit
#define transitionHandler(event) event##Handler #define selectNextStateFcn(curstate) curstate##_##selectNextState
#define delayHanlder(event) event##DelayHandler #define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler
#define actionFcn(action, state) state##_##action##Action #define actionFcn(action, curstate) curstate##_##action##Action
#define index(state, event) (state*Count_Event + event) #define index(curstate, nextstate) (curstate*Count_State + nextstate)
#define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate)
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate)
typedef struct _FSMHandler FSMHandler; typedef struct _FSMHandler FSMHandler;
typedef struct _FSM FSM;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data); typedef void (*Avoid_WARNING_General_Handlers)(void *data);
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *); 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 int (*Avoid_WARNING_SelectEvent)(void *data, void *signals); typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state) /* -------------------------------------------------------------------------- */
#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event) /* private数据类型但是不能声明到private.h里 */
#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event) /* -------------------------------------------------------------------------- */
typedef struct _FSM FSM;
typedef struct _FSMHandler{ typedef struct _FSMHandler{
int (**transitionTable)(void *data, int currentState, int *); int (**selectNextState)(void *data, void *signals);
void (**transitionTable)(void *data);
void (*transitionGeneralAction)(void *data);
void (**enterActionTable)(void *data, FSM **cFSM); void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM); void (**exitActionTable)(void *data, FSM **cFSM);
int delayedEvent;
void (**transitionDelayTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM); void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler; }FSMHandler;
typedef struct _FSMDataLoader typedef struct _FSMDataLoader
{ {
void *in; void *shadowData;
int isReady; int isReady;
int isOverflow; int isOverflow;
size_t preloadSize; size_t size;
}FSMDataLoader; }FSMDataLoader;
typedef struct _FSMPrivateVars typedef struct _FSMPrivateVars
{ {
int curState; int numState;
int defaultState; // Idle状态不能停留必须指定一个初始状态 int defaultState; // Idle状态不能停留必须指定一个初始状态
int curEvent; int curState;
int numEvent; int nextState;
int index;
FSMDataLoader preloader;
FSMHandler fcns; FSMHandler fcns;
int numChild; int numChild;
FSM **childFSM; FSM **childFSM;
FSMDataLoader preloader;
}FMSPrivateVars; }FMSPrivateVars;
// 类似于纯虚类, vptr中的函数必须继承后重新实现
/* -------------------------------------------------------------------------- */
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
/* -------------------------------------------------------------------------- */
typedef struct _FSMPureVtbl {
// 状态机控制
void (*initData)(FSM *pFSM); // =0子类必须重新实现
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
}FSMPureVtbl;
/* -------------------------------------------------------------------------- */
/* 基类定义,纯虚类 */
/* -------------------------------------------------------------------------- */
typedef struct _FSM typedef struct _FSM
{ {
// public functions // public functions
FSMVtbl vtbl; void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
// private
FMSPrivateVars privateVars;
// protected // protected
FSMPureVtbl pureVtbl;
void *data; void *data;
void *signals; void *signals;
int signalSize;
// private
FMSPrivateVars privateVars;
} FSM; } FSM;
// protected, 子类能用, 外界用不了 /* -------------------------------------------------------------------------- */
void constructFSM(FSM* pFSM); /* protected函数子类能用外界用不了 */
/* -------------------------------------------------------------------------- */
// 继承的函数
FSM *newBaseFSM(int numState, int numEvent, int defaultState);
void stepBaseFSM(FSM *pFSM); void stepBaseFSM(FSM *pFSM);
void constructFSM(FSM* pFSM);
FSM* newBaseFSM(int numState, int defaultState);
void resetBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM);

View File

@ -1,3 +1,11 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 18:52:14
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 19:34:34
* @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#ifndef __FSM_PUBLIC_H_ #ifndef __FSM_PUBLIC_H_
#define __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_
@ -6,30 +14,17 @@
typedef struct _FSM FSM; typedef struct _FSM FSM;
#define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) #define Step(pFSM) _stepFSM((FSM *)pFSM)
#define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); #define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM);
#define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) #define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM)
#define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) #define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM)
#define GetData(pFSM) _getData((FSM*)pFSM) #define GetData(pFSM) _getData((FSM*)pFSM)
typedef struct _FSMHandler FSMHandler; void _stepFSM(FSM *pFSM);
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
typedef struct _FSMVtbl {
// 状态机控制
int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*initData)(FSM *pFSM); // 子类必须重新实现
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
}FSMVtbl;
/* --------------------------------- 状态机信息获取 -------------------------------- */ /* --------------------------------- 状态机信息获取 -------------------------------- */
int getFSMCurState(FSM *pFSM); int getFSMCurState(FSM *pFSM);
int getFSMCurEvent(FSM *pFSM); int getFSMNextState(FSM *pFSM);
void setChildNum(FSM *pFSM, int num); void setChildNum(FSM *pFSM, int num);
void registerChildFSM(FSM *parent, FSM *child, int index); void registerChildFSM(FSM *parent, FSM *child, int index);
@ -43,7 +38,6 @@ void _preloaderGetReady(FSM *pFSM);
int _getPreloaderOverFlag(FSM *pFSM); int _getPreloaderOverFlag(FSM *pFSM);
void _clearPreloaderOverFlag(FSM *pFSM); void _clearPreloaderOverFlag(FSM *pFSM);
FSMVtbl *_vptrFSM(FSM* pFSM);
#endif #endif

View File

@ -88,17 +88,17 @@ void B_enterAction(void *data, FSM **childFSM){
FSM_LOG(" enterB "); FSM_LOG(" enterB ");
FSM *cFSM = childFSM[0]; FSM *cFSM = childFSM[0];
cFSM->vtbl.step(cFSM); cFSM->pureVtbl.step(cFSM);
} }
void B_duringAction(void *data, FSM **childFSM){ void B_duringAction(void *data, FSM **childFSM){
FSM_LOG(" duringB "); FSM_LOG(" duringB ");
FSM *cFSM = childFSM[0]; FSM *cFSM = childFSM[0];
cFSM->vtbl.step(cFSM); cFSM->pureVtbl.step(cFSM);
} }
void B_exitAction(void *data, FSM **childFSM){ void B_exitAction(void *data, FSM **childFSM){
FSM *cFSM = childFSM[0]; FSM *cFSM = childFSM[0];
cFSM->vtbl.reset(cFSM); cFSM->pureVtbl.reset(cFSM);
FSM_LOG(" exitB "); FSM_LOG(" exitB ");
} }
@ -171,7 +171,7 @@ static void printFSM(ParentFSM* pFSM){
static void step(ParentFSM* pFSM){ static void step(ParentFSM* pFSM){
printFSM(pFSM); printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM)); _stepFSM(BASE_FSM(pFSM));
} }
static void reset(ParentFSM* pFSM){ static void reset(ParentFSM* pFSM){
@ -197,11 +197,11 @@ ParentFSM *createParentFSM(){
ParentFSM *pFSM; ParentFSM *pFSM;
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = step; pFSM->base.pureVtbl.step = step;
pFSM->base.vtbl.selectEvent = selectEvent; pFSM->base.pureVtbl.selectNextState = selectEvent;
pFSM->base.vtbl.initData = initData; pFSM->base.pureVtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler; pFSM->base.pureVtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader; pFSM->base.pureVtbl.initDataLoader = initDataLoader;
constructFSM((FSM *)pFSM); constructFSM((FSM *)pFSM);
return pFSM; return pFSM;

View File

@ -29,7 +29,7 @@ static Event selectEvent(ChildFSMData *data){ // 必须重新实现
static void step(ChildFSM* pFSM){ static void step(ChildFSM* pFSM){
printFSM(pFSM); printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM)); _stepFSM(BASE_FSM(pFSM));
} }
static void initData(ChildFSM *pFSM){ // 必须重新实现 static void initData(ChildFSM *pFSM){ // 必须重新实现
@ -70,11 +70,11 @@ ChildFSM *createChildFSM(){
ChildFSM *pFSM; ChildFSM *pFSM;
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = step; pFSM->base.pureVtbl.step = step;
pFSM->base.vtbl.selectEvent = selectEvent; pFSM->base.pureVtbl.selectNextState = selectEvent;
pFSM->base.vtbl.initData = initData; pFSM->base.pureVtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler; pFSM->base.pureVtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader; pFSM->base.pureVtbl.initDataLoader = initDataLoader;
constructFSM((FSM *)pFSM); constructFSM((FSM *)pFSM);

View File

@ -1,39 +1,22 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 19:02:11
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 19:37:03
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "FSM_protected.h" #include "FSM_protected.h"
#include "keyFSM.h" #include "keyFSM.h"
#include "keyFSM_private.h" #include "keyFSM_private.h"
/* /* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
*/ /* -------------------------------------------------------------------------- */
static Event selectEvent(KeyFSMData *data){ // 必须重新实现
if(data->countDelay == 10){
return HoldCount4;
}
else if(data->countDelay == 5){
return DelayCount3;
}
else if(data->in == Up){
return PhsicalUp;
}
else{
return PhsicalDown;
}
}
static void step(KeyFSM* pFSM){
printFSM(pFSM);
stepBaseFSM((FSM *)pFSM);
KeyFSMData * data = pFSM->base.data;
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
}
static void initData(KeyFSM *pFSM){ // 必须重新实现 static void initData(KeyFSM *pFSM){ // 必须重新实现
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
data->countDelay = 0; data->countDelay = 0;
@ -42,14 +25,34 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
data->out = Idle; data->out = Idle;
pFSM->base.data = data; pFSM->base.data = data;
pFSM->base.signals = &data->out;
} }
static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn)); pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn));
pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn); pFSM->base.privateVars.preloader.size = sizeof(KeyIn);
} }
static void initSignals(KeyFSM *pFSM){ // 必须重新实现
pFSM->base.signalSize = sizeof(KeyOutSignal);
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Waiting);
addSelectNextStateFcn(DownDebouncing);
addSelectNextStateFcn(Downing);
addSelectNextStateFcn(Holding);
addSelectNextStateFcn(HoldUpDebouncing);
addSelectNextStateFcn(UpDebouncing);
addSelectNextStateFcn(MultiDownWaiting);
addSelectNextStateFcn(MultiDowning);
addSelectNextStateFcn(MultiDownDebouncing);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(enter, Waiting); addStateActionFcn(enter, Waiting);
addStateActionFcn(during, DownDebouncing); addStateActionFcn(during, DownDebouncing);
addStateActionFcn(during, Downing); addStateActionFcn(during, Downing);
@ -61,25 +64,31 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, MultiDownDebouncing); addStateActionFcn(during, MultiDownDebouncing);
addTransitionHandler(Waiting, PhsicalDown); /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(DownDebouncing, PhsicalUp); addTransitionHandler(DownDebouncing, Downing);
addTransitionHandler(DownDebouncing, DelayCount3); addTransitionHandler(UpDebouncing, MultiDownWaiting);
addTransitionHandler(Downing, PhsicalUp); addTransitionHandler(MultiDownDebouncing, MultiDowning);
addTransitionHandler(Downing, HoldCount4); addTransitionHandler(Downing, Holding);
addTransitionHandler(UpDebouncing, PhsicalDown); addTransitionHandler(MultiDownWaiting, Waiting);
addTransitionHandler(UpDebouncing, DelayCount3);
addTransitionHandler(Holding, PhsicalUp);
addTransitionHandler(MultiDownWaiting, PhsicalDown);
addTransitionHandler(MultiDownWaiting, DelayCount3);
addTransitionHandler(MultiDowning, PhsicalUp);
addTransitionHandler(HoldUpDebouncing, PhsicalDown);
addTransitionHandler(HoldUpDebouncing, DelayCount3);
addTransitionHandler(MultiDownDebouncing, DelayCount3);
addTransitionHandler(MultiDownDebouncing, PhsicalUp);
addDelayHandler(DelayCount3);
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
} }
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
static void step(KeyFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
KeyFSMData * data = pFSM->base.data;
FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay);
}
/* /*
*/ */
@ -87,16 +96,15 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
KeyFSM *createKeyFSM(){ KeyFSM *createKeyFSM(){
KeyFSM *pFSM; KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
#ifndef DSP28377 #ifndef DSP28377
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
#endif #endif
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
constructFSM((FSM *)pFSM); constructFSM((FSM *)pFSM);

View File

@ -10,7 +10,7 @@ typedef enum _keyIn{
}KeyIn; }KeyIn;
typedef enum _keyOutSignal{ typedef enum _keyOutSignals{
Idle, Idle,
Down, Down,
Hold, Hold,

View File

@ -26,19 +26,119 @@ typedef enum _State
DownDebouncing, DownDebouncing,
Downing, Downing,
Holding, Holding,
HoldUpDebouncing,
UpDebouncing, UpDebouncing,
MultiDownWaiting, MultiDownWaiting,
MultiDowning, MultiDowning,
HoldUpDebouncing,
MultiDownDebouncing, MultiDownDebouncing,
Count_State, Count_State,
} State; } State;
#define DEFAULT_STATE Waiting #define DEFAULT_STATE Waiting
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
return DownDebouncing;
}
return Idle_State;
}
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return Waiting;
}
else if(data->countDelay == 5){
return Downing;
}
return Idle_State;
}
static State selectNextStateFcn(Downing)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return UpDebouncing;
}
else if(data->countDelay == 10){
return Holding;
}
return Idle_State;
}
static State selectNextStateFcn(Holding)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return HoldUpDebouncing;
}
return Idle_State;
}
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
return Holding;
}
else if(data->countDelay == 5){
return Waiting;
}
return Idle_State;
}
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
if(data->countMultiDown){
return MultiDowning;
}
else{
return Downing;
}
}
else if(data->countDelay == 5){
return MultiDownWaiting;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
if(data->in == Down){
FSM_LOG(" 物理按键按下 ");
return MultiDownDebouncing;
}
else if(data->countDelay == 5){
return Waiting;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return UpDebouncing;
}
return Idle_State;
}
static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
if(data->in == Up){
FSM_LOG(" 物理按键松开 ");
return MultiDownWaiting;
}
else if(data->countDelay == 5){
return MultiDowning;
}
return Idle_State;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, Waiting)(KeyFSMData* data){ static void actionFcn(enter, Waiting)(KeyFSMData* data){
data->out = Idle; data->out = Idle;
data->countDelay = 0; data->countDelay = 0;
data->countMultiDown = 0; data->countMultiDown = 0;
@ -101,111 +201,24 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
} }
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* /* -------------------------------------------------------------------------- */
void transitionGeneralAction(KeyFSMData *data){
*/
typedef enum _Event{
Idle_Event,
PhsicalDown,
PhsicalUp,
DelayCount3,
HoldCount4,
Count_Event,
}Event;
static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted)
{
FSM_LOG(" 物理按键按下 ");
data->countDelay = 0; data->countDelay = 0;
switch (curState)
{
case Waiting:
return DownDebouncing;
case UpDebouncing:
if(data->countMultiDown)
return MultiDowning;
else
return Downing;
case HoldUpDebouncing:
return Holding;
case MultiDownWaiting:
return MultiDownDebouncing;
default:
FSM_LOG("检查状态转移表设计,不应该到这里");
assert(0);
}
} }
static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, Event *delayedEvent) static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data){
{
FSM_LOG(" 物理按键松开 ");
data->countDelay = 0;
switch (curState)
{
case DownDebouncing:
if(data->countMultiDown){
return MultiDownWaiting;
}
return Waiting;
case Downing:
return UpDebouncing;
case Holding:
return HoldUpDebouncing;
case MultiDowning:
return UpDebouncing;
default:
FSM_LOG("检查状态转移表设计,不应该到这里");
assert(0);
}
}
static void delayHanlder(DelayCount3)(KeyFSMData* data){
data->out = Idle;
}
static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){
FSM_LOG(" 延迟计数到3 ");
data->countDelay = 0;
switch (curState)
{
case DownDebouncing:
data->out = Down; data->out = Down;
*delayedEvent = DelayCount3; }
FSM_LOG("按键按下");
return Downing;
case UpDebouncing: static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data){
data->out = Idle; data->out = Idle;
data->countMultiDown++; data->countMultiDown++;
}
FSM_LOG("按键松开"); static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data){
return MultiDownWaiting;
case MultiDownWaiting:
return Waiting;
case HoldUpDebouncing:
return Waiting;
case MultiDownDebouncing:
switch (data->countMultiDown + 1) switch (data->countMultiDown + 1)
{ {
case 2: case 2:
@ -220,24 +233,16 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Ev
break; break;
} }
FSM_LOG(" 多击%d ", data->countMultiDown+1); FSM_LOG(" 多击%d ", data->countMultiDown+1);
*delayedEvent = DelayCount3;
return MultiDowning;
default:
FSM_LOG("检查状态转移表设计,不应该到这里");
assert(0);
}
} }
static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){ static State transitionHandler(Downing, Holding)(KeyFSMData* data){
FSM_LOG(" 计数到2进入长按模式 ");
data->countDelay = 0;
data->out = Hold; data->out = Hold;
return Holding;
} }
static State transitionHandler(MultiDownWaiting, Waiting)(KeyFSMData* data){
data->countMultiDown = 0;
}
@ -250,23 +255,17 @@ const static char *stateStr[] = {
"DownDebouncing", "DownDebouncing",
"Downing", "Downing",
"Holding", "Holding",
"HoldUpDebouncing",
"UpDebouncing", "UpDebouncing",
"MultiDownWaiting", "MultiDownWaiting",
"MultiDowning", "MultiDowning",
"HoldUpDebouncing",
"MultiDownDebouncing", "MultiDownDebouncing",
}; };
const static char *eventStr[] = {
"Idle",
"PhsicalDown",
"PhsicalUp",
"DelayCount3",
"HoldCount4",
};
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->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]); FSM_LOG("%d, 当前状态:%s, \t上一个下次事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
} }

View File

@ -1,3 +1,11 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 18:52:14
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-20 20:26:40
* @FilePath: \vscode\FSM_OOP\template\main.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h> #include <stdio.h>
#include "templateFSM.h" #include "templateFSM.h"
@ -19,11 +27,11 @@ int main(){
int ovflag = GetPreloaderOverFlag(pFSM); int ovflag = GetPreloaderOverFlag(pFSM);
if(i == 10){ if(i == 3){
TemplateFSM_Signals(pFSM)->signalA = 1; TemplateFSM_Signals(pFSM)->signalA = 1;
} }
if(i == 11){ if(i == 4){
TemplateFSM_Signals(pFSM)->signalB = 1; TemplateFSM_Signals(pFSM)->signalA = 1;
} }
printf("%d, " ,i); printf("%d, " ,i);

View File

@ -1,3 +1,11 @@
/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 20:08:03
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-23 19:30:13
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -6,84 +14,45 @@
#include "templateFSM.h" #include "templateFSM.h"
#include "templateFSM_private.h" #include "templateFSM_private.h"
/* /* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
*/ /* -------------------------------------------------------------------------- */
static Event ceventArr[20] = {
Idle_Event,
Idle_Event,
Idle2D,
Idle_Event,
Idle_Event,
D2E,
E2D,
D2E,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
};
static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现
if(signals->signalA){
return E2D;
}
if(signals->signalB){
return D2E;
}
return ceventArr[data->in.arrindex];
}
static void step(TemplateFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
}
static void initData(TemplateFSM *pFSM){ // 必须重新实现 static void initData(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
TemplateFSMData tempData = { TemplateFSMData tempData = {
.in = { .external = {
.arrindex = 0, .arrindex = 0,
.x = 0, .x = 0,
}, },
.inner = {
.inner1 = 0, .inner1 = 0,
.y1 = 0, .y1 = 0,
},
}; };
*data = tempData; *data = tempData;
pFSM->base.data = data; pFSM->base.data = data;
} }
static void initSignals(TemplateFSM *pFSM){
TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals));
TemplateFSMSignals tempSignals = {
.signalA = 0,
.signalB = 0,
};
*signals = tempSignals;
pFSM->base.signals = signals;
}
static void resetSignals(TemplateFSM *pFSM){
memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals));
}
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn)); pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn); pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData);
} }
static void initSignals(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMSignals *signals = (TemplateFSMSignals *)calloc(1, sizeof(TemplateFSMSignals));
pFSM->base.signals = signals;
pFSM->base.signalSize = sizeof(TemplateFSMSignals);
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(D);
addSelectNextStateFcn(E);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(during, E); addStateActionFcn(during, E);
addStateActionFcn(during, D); addStateActionFcn(during, D);
addStateActionFcn(enter, E); addStateActionFcn(enter, E);
@ -91,31 +60,45 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(exit, E); addStateActionFcn(exit, E);
addStateActionFcn(exit, D); addStateActionFcn(exit, D);
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);
addDelayHandler(Idle2D); fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
} }
/*
*/
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
static void step(TemplateFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
}
/* -------------------------------------------------------------------------- */
/* 子类构造函数 */
/* -------------------------------------------------------------------------- */
TemplateFSM *createTemplateFSM(){ TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM; TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; // 重新实现的函数
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
// 调用父类构造函数
constructFSM((FSM *)pFSM); constructFSM((FSM *)pFSM);
return pFSM; return pFSM;

View File

@ -1,31 +1,44 @@
#ifndef __TEMPLATE_FSM_H_ #ifndef __TEMPLATE_FSM_H_
#define __TEMPLATE_FSM_H_ #define __TEMPLATE_FSM_H_
/* -------------------------------------------------------------------------- */
/* 提前做类型声明 */
/* -------------------------------------------------------------------------- */
#define TemplateFSM_Input(pFSM) ((TemplateFSMIn *)_preloadIn((FSM *)pFSM))
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
typedef struct _templateFSMIn
{
int arrindex;
int x;
}TemplateFSMIn;
/* -------------------------------------------------------------------------- */
/* 自定义数据和信号 */
/* -------------------------------------------------------------------------- */
typedef struct _templateFSMSignals typedef struct _templateFSMSignals
{ {
int signalA; int signalA;
int signalB; int signalB;
}TemplateFSMSignals; }TemplateFSMSignals;
typedef struct _templateFSMData typedef struct _templateFSMExternalData
{
int arrindex;
int x;
}TemplateFSMExternalData;
typedef struct _templateFSMInnerData
{ {
TemplateFSMIn in;
int y1; int y1;
int inner1; int inner1;
}TemplateFSMInnerData;
/* -------------------------------------------------------------------------- */
/* 下面的改个名字就行了 */
/* -------------------------------------------------------------------------- */
#define TemplateFSM_Input(pFSM) ((TemplateFSMExternalData *)_preloadIn((FSM *)pFSM))
#define TemplateFSM_Signals(pFSM) ((TemplateFSMSignals *)_getSignals((FSM *)pFSM))
typedef struct _templateFSMData
{
TemplateFSMExternalData external;
TemplateFSMInnerData inner;
}TemplateFSMData; }TemplateFSMData;
typedef struct _TemplateFSM TemplateFSM; typedef struct _TemplateFSM TemplateFSM;
TemplateFSM *createTemplateFSM(); TemplateFSM *createTemplateFSM();

View File

@ -6,19 +6,18 @@
#include <stdio.h> #include <stdio.h>
/*
/* -------------------------------------------------------------------------- */
*/ /* 继承基类 */
/* -------------------------------------------------------------------------- */
typedef struct _TemplateFSM typedef struct _TemplateFSM
{ {
// 继承父类
FSM base; FSM base;
}TemplateFSM; }TemplateFSM;
/* /* -------------------------------------------------------------------------- */
action, exit, during /* 状态定义 */
*/ /* -------------------------------------------------------------------------- */
typedef enum _State typedef enum _State
{ {
Idle, Idle,
@ -29,6 +28,28 @@ typedef enum _State
} State; } State;
#define DEFAULT_STATE E #define DEFAULT_STATE E
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
if(signals->signalA){
return E;
}
return Idle;
}
static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){
if(signals->signalA){
return D;
}
return Idle;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, D)() static void actionFcn(enter, D)()
{ {
FSM_LOG(" enterD "); FSM_LOG(" enterD ");
@ -55,70 +76,49 @@ static void actionFcn(exit, E)()
FSM_LOG(" exitE "); FSM_LOG(" exitE ");
} }
/*
*/
typedef enum _Event{
Idle_Event,
Idle2D,
Idle2E,
D2E,
E2D,
Count_Event,
}Event;
static State transitionHandler(Idle2D)() /* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
void transitionGeneralAction(TemplateFSMData *data){
FSM_LOG("general");
}
static void transitionHandler(Idle, D)()
{ {
FSM_LOG(" Idle2D "); FSM_LOG(" Idle2D ");
return D;
} }
static void delayHanlder(Idle2D)(TemplateFSMData *data){ static State transitionHandler(Idle, E)()
FSM_LOG(" DelayIdle2D");
}
static State transitionHandler(Idle2E)()
{ {
FSM_LOG(" Idle2E "); FSM_LOG(" Idle2E ");
return E;
} }
static State transitionHandler(D2E)() static State transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex)
{ {
*delayedIndex = index(D, E);
FSM_LOG(" D2E "); FSM_LOG(" D2E ");
return E;
} }
static State transitionHandler(E2D)() static State 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(TemplateFSM* pFSM){ static void printFSM(TemplateFSM* pFSM){
FSM_LOG(" \tTemplateFSM: "); FSM_LOG(" \tTemplateFSM: ");
FSM_LOG("上次事件:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", eventStr[getFSMCurEvent((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM)); FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]);
} }