Browse Source

Master mit Demo.

Rind 5 years ago
parent
commit
c0b9808845
43 changed files with 3043 additions and 168 deletions
  1. 15 0
      DemoMaster/.ccsproject
  2. 180 0
      DemoMaster/.cproject
  3. 14 0
      DemoMaster/.gitignore
  4. 14 0
      DemoMaster/.launches/DemoMaster.launch
  5. 27 0
      DemoMaster/.project
  6. 3 0
      DemoMaster/.settings/org.eclipse.cdt.codan.core.prefs
  7. 2 0
      DemoMaster/.settings/org.eclipse.cdt.debug.core.prefs
  8. 6 0
      DemoMaster/.settings/org.eclipse.core.resources.prefs
  9. 30 0
      DemoMaster/distribute.bat
  10. 4 0
      DemoMaster/distribute.excl
  11. 213 0
      DemoMaster/eav1v.h
  12. 67 0
      DemoMaster/main.c
  13. 424 0
      DemoMaster/mbmstapp.c
  14. 36 0
      DemoMaster/mbmstapp.h
  15. 213 0
      DemoMaster/ols1v.h
  16. 45 0
      DemoMaster/tm4c1231e6pz.cmd
  17. 300 0
      DemoMaster/tm4c1231e6pz_startup_ccs.c
  18. 1 3
      DemoSlave/.cproject
  19. 0 4
      DemoSlave/distribute.bat
  20. 1 1
      DemoSlave/mbslvapp.c
  21. 1 1
      DemoSlave/mbslvapp.h
  22. 1 0
      gfamodbusrtucom/.settings/org.eclipse.core.resources.prefs
  23. 20 0
      gfamodbusrtucom/buffer.c
  24. 31 0
      gfamodbusrtucom/gfambrtucom.h
  25. 82 85
      gfamodbusrtucom/mbuart.c
  26. 13 0
      gfamodbusrtumst/.ccsproject
  27. 140 0
      gfamodbusrtumst/.cproject
  28. 1 0
      gfamodbusrtumst/.gitignore
  29. 27 0
      gfamodbusrtumst/.project
  30. 3 0
      gfamodbusrtumst/.settings/org.eclipse.cdt.codan.core.prefs
  31. 2 0
      gfamodbusrtumst/.settings/org.eclipse.cdt.debug.core.prefs
  32. 6 0
      gfamodbusrtumst/.settings/org.eclipse.core.resources.prefs
  33. 32 0
      gfamodbusrtumst/distribute.cmd
  34. 164 0
      gfamodbusrtumst/gfambrtumst.h
  35. 640 0
      gfamodbusrtumst/mbrtumast.c
  36. 200 0
      gfamodbusrtumst/metronik.c
  37. 62 0
      gfamodbusrtumst/metronik.h
  38. 0 36
      gfamodbusrtuslv/defines.h
  39. 1 0
      gfamodbusrtuslv/distribute.cmd
  40. 16 16
      gfamodbusrtuslv/gfambrtuslv.h
  41. 0 2
      gfamodbusrtuslv/gfambrtuslv_priv.h
  42. 0 16
      gfamodbusrtuslv/mbreq.c
  43. 6 4
      gfamodbusrtuslv/mbrtuslv.c

+ 15 - 0
DemoMaster/.ccsproject

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<?ccsproject version="1.0"?>
+<projectOptions>
+	<ccsVersion value="8.3.0"/>
+	<deviceVariant value="Cortex M.TM4C1231E6PZ"/>
+	<deviceFamily value="TMS470"/>
+	<deviceEndianness value="little"/>
+	<codegenToolVersion value="18.1.6.LTS"/>
+	<isElfFormat value="true"/>
+	<linkerCommandFile value="tm4c1231e6pz.cmd"/>
+	<rts value="libc.a"/>
+	<createSlaveProjects value=""/>
+	<templateProperties value="id=com.ti.common.project.core.emptyProjectWithMainTemplate"/>
+	<filesToOpen value="main.c"/>
+</projectOptions>

+ 180 - 0
DemoMaster/.cproject

@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule configRelations="2" moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1034401341">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1034401341" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<macros>
+					<stringMacro name="TW_ROOT" type="VALUE_TEXT" value="C:\CCS\TivaWare_C_Series-2.1.4.178"/>
+				</macros>
+				<externalSettings/>
+				<extensions>
+					<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1034401341" name="Debug" parent="com.ti.ccstudio.buildDefinitions.TMS470.Debug" postbuildStep="@${PWD}\..\distribute.bat Debug">
+					<folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1034401341." name="/" resourcePath="">
+						<toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.DebugToolchain.1115606085" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug.1429630649">
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.265360656" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
+								<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.TM4C1231E6PZ"/>
+								<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
+								<listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
+								<listOptionValue builtIn="false" value="CCS_MBS_VERSION=6.1.3"/>
+								<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=tm4c1231e6pz.cmd"/>
+								<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
+								<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
+							</option>
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.252484942" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="18.1.6.LTS" valueType="string"/>
+							<targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformDebug.356384887" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformDebug"/>
+							<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderDebug.1491648392" keepEnvironmentInBuildfile="false" name="GNU Make" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderDebug"/>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerDebug.1829319177" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerDebug">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.1730565093" name="Target processor version (--silicon_version, -mv)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.7M4" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.657445448" name="Designate code state, 16-bit (thumb) or 32-bit (--code_state)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.668391134" name="Application binary interface. (--abi)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.eabi" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.1967125967" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.FPv4SPD16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC.117398864" name="Enable support for GCC extensions (DEPRECATED) (--gcc)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE.1774973346" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE" valueType="definedSymbols">
+									<listOptionValue builtIn="false" value="ccs=&quot;ccs&quot;"/>
+									<listOptionValue builtIn="false" value="PART_TM4C1231E6PZ"/>
+									<listOptionValue builtIn="false" value="__TI_TIME_USES_64=1"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.1033039679" name="Debugging model" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING.1175859555" name="Treat diagnostic &lt;id&gt; as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING" useByScannerDiscovery="false" valueType="stringList">
+									<listOptionValue builtIn="false" value="225"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER.1580738448" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.73667373" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH.2048618782" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH" valueType="includePath">
+									<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
+									<listOptionValue builtIn="false" value="${TW_ROOT}"/>
+									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\include"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN.1400032151" name="Little endian code [See 'General' page to edit] (--little_endian, -me)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS.1802549850" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS.152810114" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS.1135435819" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS.516069050" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS"/>
+							</tool>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug.1429630649" name="ARM Linker" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE.1847075139" name="Link information (map) listed into &lt;file&gt; (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE" useByScannerDiscovery="false" value="${ProjName}.map" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE.744028994" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE" useByScannerDiscovery="false" value="512" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE.1517774010" name="Heap size for C/C++ dynamic memory allocation (--heap_size, -heap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE" useByScannerDiscovery="false" value="0" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE.861555867" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE" useByScannerDiscovery="false" value="${ProjName}.out" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO.1544910008" name="Detailed link information data-base into &lt;file&gt; (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO" useByScannerDiscovery="false" value="${ProjName}_linkInfo.xml" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER.326706935" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.378249384" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH.599662110" name="Add &lt;dir&gt; to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH" valueType="libPaths">
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
+									<listOptionValue builtIn="false" value="${TW_ROOT}\driverlib\ccs\Debug"/>
+									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\lib"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY.1705159625" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY" useByScannerDiscovery="false" valueType="libs">
+									<listOptionValue builtIn="false" value="gfautils.lib"/>
+									<listOptionValue builtIn="false" value="gfambrtucom.lib"/>
+									<listOptionValue builtIn="false" value="gfambrtumst.lib"/>
+									<listOptionValue builtIn="false" value="driverlib.lib"/>
+									<listOptionValue builtIn="false" value="libc.a"/>
+								</option>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS.1833468335" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS.169708165" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS.1773234611" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS"/>
+							</tool>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.593397269" name="ARM Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex"/>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+		<cconfiguration id="com.ti.ccstudio.buildDefinitions.TMS470.Release.63306852">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.TMS470.Release.63306852" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<externalSettings/>
+				<extensions>
+					<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.TMS470.Release.63306852" name="Release" parent="com.ti.ccstudio.buildDefinitions.TMS470.Release">
+					<folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Release.63306852." name="/" resourcePath="">
+						<toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.ReleaseToolchain.1086356621" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.ReleaseToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerRelease.602890585">
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1382441538" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
+								<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.TM4C1231E6PZ"/>
+								<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
+								<listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
+								<listOptionValue builtIn="false" value="CCS_MBS_VERSION=6.1.3"/>
+								<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=tm4c1231e6pz.cmd"/>
+								<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
+								<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
+							</option>
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.242028024" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="18.1.6.LTS" valueType="string"/>
+							<targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformRelease.1182813422" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformRelease"/>
+							<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderRelease.97481414" name="GNU Make.Release" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderRelease"/>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerRelease.1305524262" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerRelease">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.1347293592" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.7M4" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.1939013731" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.646586041" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.eabi" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.735370200" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.FPv4SPD16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC.360362917" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE.1922906444" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE" valueType="definedSymbols">
+									<listOptionValue builtIn="false" value="ccs=&quot;ccs&quot;"/>
+									<listOptionValue builtIn="false" value="PART_TM4C1231E6PZ"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING.1092738663" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING" useByScannerDiscovery="false" valueType="stringList">
+									<listOptionValue builtIn="false" value="225"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER.1532080394" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.1211544161" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH.1272222490" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH" valueType="includePath">
+									<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN.266988797" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS.506088022" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS.1214720360" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS.800595803" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS.1516077026" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS"/>
+							</tool>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerRelease.602890585" name="ARM Linker" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerRelease">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE.933797907" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE" useByScannerDiscovery="false" value="${ProjName}.map" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE.807268048" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE" useByScannerDiscovery="false" value="512" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE.103427931" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE" useByScannerDiscovery="false" value="0" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE.368163938" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE" useByScannerDiscovery="false" value="${ProjName}.out" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO.1644066108" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO" useByScannerDiscovery="false" value="${ProjName}_linkInfo.xml" valueType="string"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER.1679995015" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.1155555093" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH.409684624" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH" valueType="libPaths">
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY.1232798539" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY" useByScannerDiscovery="false" valueType="libs">
+									<listOptionValue builtIn="false" value="libc.a"/>
+								</option>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS.1297357388" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS.941459213" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS.170619664" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS"/>
+							</tool>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.586917854" name="ARM Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex"/>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="DemoMaster.com.ti.ccstudio.buildDefinitions.TMS470.ProjectType.827914564" name="TMS470" projectType="com.ti.ccstudio.buildDefinitions.TMS470.ProjectType"/>
+	</storageModule>
+	<storageModule moduleId="scannerConfiguration"/>
+	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>

+ 14 - 0
DemoMaster/.gitignore

@@ -0,0 +1,14 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
+
+rtf/
+latex/
+html/
+*.bak
+*.tmp
+/Debug/
+/Release/

File diff suppressed because it is too large
+ 14 - 0
DemoMaster/.launches/DemoMaster.launch


+ 27 - 0
DemoMaster/.project

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>DemoMaster</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.ti.ccstudio.core.ccsNature</nature>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
DemoMaster/.settings/org.eclipse.cdt.codan.core.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+inEditor=false
+onBuild=false

+ 2 - 0
DemoMaster/.settings/org.eclipse.cdt.debug.core.prefs

@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker

+ 6 - 0
DemoMaster/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//Debug/makefile=UTF-8
+encoding//Debug/objects.mk=UTF-8
+encoding//Debug/sources.mk=UTF-8
+encoding//Debug/subdir_rules.mk=UTF-8
+encoding//Debug/subdir_vars.mk=UTF-8

+ 30 - 0
DemoMaster/distribute.bat

@@ -0,0 +1,30 @@
+@echo off
+set PRJDIR=%~dp0
+set CONFIG=%1
+set LIBMAJOR=1
+set LIBMINOR=0
+set LIBBASENAME=gfambrtumst
+set GFALIBS=%GfATivaLibsRoot%
+set LIBNAME=%LIBBASENAME%.%LIBMAJOR%.%LIBMINOR%
+
+set DSTDIR=%GFALIBS%\%LIBNAME%\demo
+set LIBDIR=%GFALIBS%\%LIBNAME%\lib\ccs\%CONFIG%
+set INCDIR=%GFALIBS%\include
+set SRCDIR=%GFALIBS%\%LIBNAME%\src
+set OUTDIR=%PRJDIR%%CONFIG%
+
+mkdir "%DSTDIR%" 1>nul 2>&1
+xcopy "%PRJDIR%*.*" "%DSTDIR%" /S /I /H /R /Y /Q /EXCLUDE:%PRJDIR%distribute.excl
+
+set PRJDIR=
+set CONFIG=
+set LIBMAJOR=
+set LIBMINOR=
+set LIBBASENAME=
+set LIBNAME=
+set GFALIBS=
+set INCDIR=
+set SRCDIR=
+set LIBDIR=
+set OUTDIR=
+set DSTDIR=

+ 4 - 0
DemoMaster/distribute.excl

@@ -0,0 +1,4 @@
+.bat
+\Debug\
+.gitignore
+distribute.excl

+ 213 - 0
DemoMaster/eav1v.h

@@ -0,0 +1,213 @@
+// eav1v.h :
+//
+
+#if !defined(AGD_PINS_H__9F94DC4E_A195_4754_9727_7DAF2FFB0DE2__INCLUDED_)
+#define AGD_PINS_H__9F94DC4E_A195_4754_9727_7DAF2FFB0DE2__INCLUDED_
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// pins.h - Declarations:
+
+//
+// GPIO PORTA is used for
+//
+#define PA0__RX_UART0		GPIO_PIN_0		// PA0	RX_UART0		(UART input)
+#define PA1__TX_UART0		GPIO_PIN_1		// PA1	TX_UART0		(UART output)
+#define PA2__LED3			GPIO_PIN_2		// PA2	LED3			(digital output)
+#define PA3__LED4			GPIO_PIN_3		// PA3	LED4			(digital output)
+#define PA4__LED5			GPIO_PIN_4		// PA4	LED5			(digital output)
+#define PA5__LED6			GPIO_PIN_5		// PA5	LED6			(digital output)
+#define PA6__5V_UART0		GPIO_PIN_6		// PA6	5V_UART0		(digital input)
+#define PA7__				GPIO_PIN_7		// PA7					(unused)
+
+//
+// GPIO PORTB is used for
+//
+#define PB0__RX_485_1		GPIO_PIN_0		// PB0	RX_485_1		(UART input)
+#define PB1__TX_485_1		GPIO_PIN_1		// PB1	TX_485_1		(UART output)
+#define PB2__I2C_WIFI_SCL	GPIO_PIN_2		// PB2	I2C_WIFI_SCL	(I2C interface)
+#define PB3__I2C_WIFI_SDA	GPIO_PIN_3		// PB3	I2C_WIFI_SDA	(I2C interface)
+#define PB4__DIGOUT1		GPIO_PIN_4		// PB4	DIGOUT1			(digital output)
+#define PB5__DIGOUT2		GPIO_PIN_5		// PB5	DIGOUT2			(digital output)
+
+#define PB0__LS_ON_ZI3		GPIO_PIN_0		// PB0	LS_ON_ZI3		(digital output)
+#define PB1__LS_ON_ZI2		GPIO_PIN_1		// PB1	LS_ON_ZI2		(digital output)
+#define PB2__Z_IN1_SCL3		GPIO_PIN_2		// PB2	Z_IN1_SCL3		(TIMER input, I2C interface)
+#define PB3__AN_CLK_SDA3	GPIO_PIN_3		// PB3	AN_CLK_SDA3		(TIMER input, I2C interface)
+#define PB4__ANIN1			GPIO_PIN_4		// PB4	ANIN1			(analog input)
+#define PB5__U_24V_IO		GPIO_PIN_5		// PB5	U_24V_IO		(analog input)
+
+//
+// GPIO PORTC is used for
+//
+#define PC0__				GPIO_PIN_0		// PC0					(JTAG TCK)
+#define PC1__				GPIO_PIN_1		// PC1					(JTAG TMS)
+#define PC2__				GPIO_PIN_2		// PC2					(JTAG TDI)
+#define PC3__				GPIO_PIN_3		// PC3					(JTAG TDO)
+#define PC4__				GPIO_PIN_4		// PC4					(unused)
+#define PC5__TASTE			GPIO_PIN_5		// PC5	TASTE			(digital input)
+#define PC6__VREF_ZIN_H		GPIO_PIN_6		// PC6	VREF_ZIN_H		(analog comparator reference)
+#define PC7__ZIN1			GPIO_PIN_7		// PC7	ZIN1			(analog comparator input)
+
+#define PC0__				GPIO_PIN_0		// PC0					(JTAG TCK)
+#define PC1__				GPIO_PIN_1		// PC1					(JTAG TMS)
+#define PC2__				GPIO_PIN_2		// PC2					(JTAG TDI)
+#define PC3__				GPIO_PIN_3		// PC3					(JTAG TDO)
+#define PC4__Z_IN2			GPIO_PIN_4		// PC4	Z_IN2			(analog comparator input)
+#define PC5__LED_BUS		GPIO_PIN_5		// PC5	LED_BUS			(digital output)
+#define PC6__VREF_ZIN_H		GPIO_PIN_6		// PC6	VREF_ZIN_H		(analog comparator reference)
+#define PC7__Z_IN3			GPIO_PIN_7		// PC7	Z_IN3			(analog comparator input)
+
+//
+// GPIO PORTD is used for
+//
+#define PD0__ANIN_OUT1		GPIO_PIN_0		// PD0	ANIN_OUT1		(analog input)
+#define PD1__ANIN4			GPIO_PIN_1		// PD1	ANIN4			(analog input)
+#define PD2__ANIN3			GPIO_PIN_2		// PD2	ANIN3			(analog input)
+#define PD3__ANIN0			GPIO_PIN_3		// PD3	ANIN0			(analog input)
+#define PD4__MP				GPIO_PIN_4		// PD4	MP				(UART input)
+#define PD5__MP				GPIO_PIN_5		// PD4	MP				(UART output)
+#define PD6__ACT_POS		GPIO_PIN_6		// PD4	ACT_POS			(analog input)
+#define PD7__RESTARTB		GPIO_PIN_7		// PD4	RESTARTB		(digital input)
+
+#define PD0__ANIN_OUT1		GPIO_PIN_0		// PD0	ANIN_OUT1		(analog input)
+#define PD1__ANIN_OUT2		GPIO_PIN_1		// PD1	ANIN_OUT2		(analog input)
+#define PD2__ANIN_OUT3		GPIO_PIN_2		// PD2	ANIN_OUT3		(analog input)
+#define PD3__ANIN_OUT4		GPIO_PIN_3		// PD3	ANIN_OUT4		(analog input)
+#define PD4__ANIN4			GPIO_PIN_4		// PD4	ANIN4			(analog input)
+#define PD5__ANIN5			GPIO_PIN_5		// PD4	ANIN5			(analog input)
+#define PD6__ANIN6			GPIO_PIN_6		// PD4	ANIN6			(analog input)
+#define PD7__ANIN0			GPIO_PIN_7		// PD4	ANIN0			(analog input)
+
+//
+// GPIO PORTE is used for
+//
+#define PE0__RX_WIFI2		GPIO_PIN_0		// PE0	RX_WIFI2		(UART input)
+#define PE1__TX_WIFI2		GPIO_PIN_1		// PE1	TX_WIFI2		(UART output)
+#define PE2__LS_ON_ZI1		GPIO_PIN_2		// PE2	LS_ON_ZI1		(digital output)
+#define PE3__				GPIO_PIN_3		// PE3					(unused)
+#define PE4__RX_485_2		GPIO_PIN_4		// PE4	RX_485_2		(UART input)
+#define PE5__TX_485_2		GPIO_PIN_5		// PE5	TX_485_2		(UART output)
+#define PE6__EN_485_2		GPIO_PIN_6		// PE6	EN_485_2		(digital output)
+#define PE7__EN_485_1		GPIO_PIN_7		// PE6	EN_485_1		(digital output)
+
+#define PE0__RX_485_1		GPIO_PIN_0		// PE0	RX_485_1		(UART input)
+#define PE1__TX_485_1		GPIO_PIN_1		// PE1	TX_485_1		(UART output)
+#define PE2__LED_ERR		GPIO_PIN_2		// PE2	LED_ERR			(digital output)
+#define PE3__Z_IN4			GPIO_PIN_3		// PE3	Z_IN4			(analog input)
+#define PE4__ANIN2			GPIO_PIN_4		// PE4	ANIN2			(analog input)
+#define PE5__ANIN3			GPIO_PIN_5		// PE5	ANIN3			(analog input)
+#define PE6__U_VERS			GPIO_PIN_6		// PE6	U_VERS			(analog input)
+#define PE7__U_V15V			GPIO_PIN_7		// PE6	U_V15V			(analog input)
+
+//
+// GPIO PORTF is used for
+//
+#define PF0__ANZ1_A			GPIO_PIN_0		// PF0	ANZ1_A			(digital output)
+#define PF1__ANZ1_B			GPIO_PIN_1		// PF1	ANZ1_B			(digital output)
+#define PF2__ANZ1_C			GPIO_PIN_2		// PF2	ANZ1_C			(digital output)
+#define PF3__ANZ1_D			GPIO_PIN_3		// PF3	ANZ1_D			(digital output)
+#define PF4__ANZ1_E			GPIO_PIN_4		// PF4	ANZ1_E			(digital output)
+#define PF5__ANZ1_F			GPIO_PIN_5		// PF5	ANZ1_F			(digital output)
+#define PF6__ANZ1_G			GPIO_PIN_6		// PF6	ANZ1_G			(digital output)
+#define PF7__ANZ1_DP		GPIO_PIN_7		// PF7	ANZ1_DP			(digital output)
+
+#define PF0__nCS_REL		GPIO_PIN_0		// PF0	nCS_REL			(digital input)
+#define PF1__nCS_DA1		GPIO_PIN_1		// PF1	nCS_DA1			(digital input)
+#define PF2__nCS_DA2		GPIO_PIN_2		// PF2	nCS_DA2			(digital input)
+#define PF3__PWM_CPU		GPIO_PIN_3		// PF3	PWM_CPU			(digital input)
+#define PF4__100Hz			GPIO_PIN_4		// PF4	100Hz			(TIMER output)
+#define PF5__nRES_PER		GPIO_PIN_5		// PF5	nRES_PER		(digital input)
+#define PF6__LED_BETR		GPIO_PIN_6		// PF6	LED_BETR		(digital output)
+#define PF7__LS_ON_ZI4		GPIO_PIN_7		// PF7	LS_ON_ZI3		(digital output)
+
+//
+// GPIO PORTG is used for
+//
+#define PG0__ANZ2_A			GPIO_PIN_0		// PG0	ANZ1_A			(digital output)
+#define PG1__ANZ2_B			GPIO_PIN_1		// PG1	ANZ1_B			(digital output)
+#define PG2__ANZ2_C			GPIO_PIN_2		// PG2	ANZ1_C			(digital output)
+#define PG3__ANZ2_D			GPIO_PIN_3		// PG3	ANZ1_D			(digital output)
+#define PG4__ANZ2_E			GPIO_PIN_4		// PG4	ANZ1_E			(digital output)
+#define PG5__ANZ2_F			GPIO_PIN_5		// PG5	ANZ1_F			(digital output)
+#define PG6__ANZ2_G			GPIO_PIN_6		// PG6	ANZ1_G			(digital output)
+#define PG7__ANZ2_DP		GPIO_PIN_7		// PG7	ANZ1_DP			(digital output)
+
+#define PG0__REL1			GPIO_PIN_0		// PG0	REL1			(digital output)
+#define PG1__REL2			GPIO_PIN_1		// PG1	REL2			(digital output)
+#define PG2__REL3			GPIO_PIN_2		// PG2	REL3			(digital output)
+#define PG3__REL4			GPIO_PIN_3		// PG3	REL4			(digital output)
+#define PG4__PWM_TRIAC		GPIO_PIN_4		// PG4	PWM_TRIAC		(PWM output)
+#define PG5__LS_ON_ZI1		GPIO_PIN_5		// PG5	LS_ON_ZI1		(digital output)
+#define PG6__NULLDURCH		GPIO_PIN_6		// PG6  NULLDURCH		(TIMER input)
+#define PG7__Z_IN1			GPIO_PIN_7		// PG7	Z_IN1			(analog comparator input)
+
+//
+// GPIO PORTH is used for
+//
+#define PH0__ANIN2			GPIO_PIN_0		// PH0	ANIN2			(analog input)
+#define PH1__ANIN1			GPIO_PIN_1		// PH1	ANIN1			(analog input)
+#define PH2__U_DIG_OUT2		GPIO_PIN_2		// PH2	U_DIG_OUT2		(analog input)
+#define PH3__U_VERS			GPIO_PIN_3		// PH3	U_VERS			(analog input)
+#define PH4__ST_DO1			GPIO_PIN_4		// PH4	ST_DO1			(digital input)
+#define PH5__ST_DO2			GPIO_PIN_5		// PH5	ST_DO2			(digital input)
+#define PH6__				GPIO_PIN_6		// PH6					(unused)
+#define PH7__PWM_AN1		GPIO_PIN_7		// PH7	PWM_AN1			(PWM output)
+
+#define PH0__LED_IN1		GPIO_PIN_0		// PH0	LED_IN1			(digital output)
+#define PH1__LED_IN2		GPIO_PIN_1		// PH1	LED_IN2			(digital output)
+#define PH2__LED_IN3		GPIO_PIN_2		// PH2	LED_IN3			(digital output)
+#define PH3__LED_IN4		GPIO_PIN_3		// PH3	LED_IN4			(digital output)
+#define PH4__PWM4			GPIO_PIN_4		// PG4	PWM4			(PWM output)
+#define PH5__PWM3			GPIO_PIN_5		// PG5	PWM3			(PWM output)
+#define PH6__PWM2			GPIO_PIN_6		// PG6	PWM2			(PWM output)
+#define PH7__PWM1			GPIO_PIN_7		// PG7	PWM1			(PWM output)
+
+//
+// GPIO PORTJ is used for
+//
+#define PJ0__RX_WIFI1		GPIO_PIN_0		// PJ0	RX_WIFI1		(UART input)
+#define PJ1__TX_WIFI1		GPIO_PIN_1		// PJ1	TX_WIFI1		(UART output)
+#define PJ2__EN_WIFI		GPIO_PIN_2		// PJ2	EN_WIFI			(digital output)
+
+#define PJ0__EN_V15V		GPIO_PIN_0		// PJ0	EN_V15V			(digital output)
+#define PJ1__EN_V24V_IO		GPIO_PIN_1		// PJ1	EN_V24V_IO		(digital output)
+#define PJ2__EN_485_1		GPIO_PIN_2		// PJ2	EN_485_1		(digital output)
+
+//
+// GPIO PORTK is used for
+//
+#define PK0__SPI_WIFI_CLK	GPIO_PIN_0		// PK0	SPI_WIFI_CLK	(SPI output)
+#define PK1__SPI_WIFI_CS	GPIO_PIN_1		// PK1	SPI_WIFI_CS		(SPI output)
+#define PK2__SPI_WIFI_MISO	GPIO_PIN_2		// PK2	SPI_WIFI_MISO	(SPI input)
+#define PK3__SPI_WIFI_MOSI	GPIO_PIN_3		// PK3	SPI_WIFI_MOSI	(SPI output)
+
+#define PK0__AN_A0			GPIO_PIN_0		// PK0	AN_A0			(digital input)
+#define PK1__AN_A1			GPIO_PIN_1		// PK1	AN_A1			(digital input)
+#define PK2__AN_A2			GPIO_PIN_2		// PK2	AN_A2			(digital input)
+#define PK3__nAB_DA			GPIO_PIN_3		// PK3	nA/B_DA			(digital input)
+
+/////////////////////////////////////////////////////////////////////////////
+// UART / RS485 / Timer
+
+#define UART_PORT_SYSCTL	SYSCTL_PERIPH_GPIOE
+#define UART_PORT			GPIO_PORTE_BASE
+#define UART_BASE_SYSCTL	SYSCTL_PERIPH_UART5
+#define UART_BASE			UART5_BASE
+#define UART_INT			INT_UART5
+#define UART_RX_PIN			PE4__RX_485_1
+#define UART_TX_PIN			PE5__TX_485_1
+#define UART_RX_PIN_MUX     GPIO_PE4_U5RX
+#define UART_TX_PIN_MUX     GPIO_PE5_U5TX
+#define EN_485_PORT_SYSCTL	SYSCTL_PERIPH_GPIOJ
+#define EN_485_PORT			GPIO_PORTJ_BASE
+#define EN_485_PIN			PJ2__EN_485_1
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_PINS_H__9F94DC4E_A195_4754_9727_7DAF2FFB0DE2__INCLUDED_)

+ 67 - 0
DemoMaster/main.c

@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <gfambrtumst.h>
+#include "mbmstapp.h"
+#include "driverlib/sysctl.h"
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// fake implementation for demo purposes
+// usually the date and time will be retrieved from a realtime clock
+
+static int32_t _GetRTCTDateTimeTZ(struct tm *ptm)
+{
+	if(!ptm)
+		return -1;
+
+	memset(ptm, 0, sizeof(struct tm));
+
+	ptm->tm_year	= 119;
+	ptm->tm_mon		= 8;
+	ptm->tm_mday	= 17;
+	ptm->tm_hour	= 17;
+	ptm->tm_min		= 40;
+
+	return 2; // return timezone
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int main(void)
+{
+	struct tm utc;
+	int32_t nTzIndex;
+
+    /////////////////////////////////////////////////////////////////////////
+	// System initialization
+
+	SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
+    GfaUtilsInit();
+
+    /////////////////////////////////////////////////////////////////////////
+    // set date, time and timezone
+
+    if((nTzIndex = _GetRTCTDateTimeTZ(&utc)) < 0)
+    	return 1;
+
+	if(!GfaTimeSetUTCDateTimeTimezone(&utc, nTzIndex))
+    	return 1;
+
+	/////////////////////////////////////////////////////////////////////////
+	// start the modbus slave
+
+	if(!GfaInitModbusMasterApp())
+    	return 1;
+
+    while(true)
+    {
+    	GfaDoModbusMasterApp();
+    }
+}

+ 424 - 0
DemoMaster/mbmstapp.c

@@ -0,0 +1,424 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <limits.h>
+#include <gfambrtumst.h>
+#include "mbmstapp.h"
+#include "inc/hw_memmap.h"
+#include "inc/hw_gpio.h"
+#include "inc/hw_uart.h"
+#include "inc/hw_ints.h"
+#include "driverlib/gpio.h"
+#include "driverlib/uart.h"
+#include "driverlib/sysctl.h"
+#include "driverlib/pin_map.h"
+
+#if HW_PLATFORM == HW_PLATFORM_OLS1V
+#include "ols1v.h"
+#elif HW_PLATFORM == HW_PLATFORM_EAV1V
+#include "eav1v.h"
+#else
+#error Unknown hardware platform!
+#endif	//	HW_PLATFORM
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _REQ_DELAY										10
+#define _METRONIK_SENSOR_SLAVE_ID						0x40
+#define _NEDAP_SLAVE_ID_1								1
+#define _NEDAP_SLAVE_ID_2								2
+
+#define TID_METRONIC_ILM_READ_UV						0x0101
+#define TID_METRONIC_ILM_READ_TEMP						0x0102
+#define TID_METRONIC_ILM_READ_SERIAL					0x0103
+#define TID_METRONIC_ILM_READ_RANGE						0x0104
+
+#define TID_NEDAP_CLEAR_CTRS_AND_DIAGNOSTIC_REG			0x0201
+#define TID_NEDAP_REPORT_SLAVE_ID						0x0202
+#define TID_NEDAP_PRESET_SINGLE_REGISTER_7				0x0203
+#define TID_NEDAP_WRITE_MULTIPLE_REGISTERS_7_2			0x0204
+#define TID_NEDAP_RETURN_BUS_EXCEPTION_ERROR_COUNT		0x0205
+#define TID_NEDAP_READ_REGISTERS_0_50					0x0206
+
+/////////////////////////////////////////////////////////////////////////////
+
+static HMBRTUMST	g_hMbMst							= NULL;
+static uint64_t		g_nSendTick							= 0;
+static bool			g_bCTS								= false;
+static uint16_t		g_nRegs[MODBUS_MAX_READ_REGISTERS]	= {0};
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnMasterStateChanged(GFA_MODBUS_RTU_MST_STATES newState, GFA_MODBUS_RTU_MST_STATES oldState)
+{
+	switch(newState)
+	{
+	case MB_RTU_MST_Idle:
+//		OlsClearLeds(OLS_LED_MASK);
+		break;
+
+	case MB_RTU_MST_TxStart:
+//		OlsSetLeds(OLS_LED_GREEN_RIGHT);
+		break;
+
+	case MB_RTU_MST_TxDone:
+//		OlsClearLeds(OLS_LED_GREEN_RIGHT);
+		break;
+
+	case MB_RTU_MST_RxSlvID:
+//		OlsSetLeds(OLS_LED_GREEN_LEFT);
+		break;
+
+	case MB_RTU_MST_RxError:
+//		OlsClearSetLeds(OLS_LED_MASK, OLS_LED_RED_TOP);
+		break;
+
+	case MB_RTU_MST_ReportError:
+//		OlsClearSetLeds(OLS_LED_MASK, OLS_LED_RED_BOTTOM);
+		break;
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _RetriggerRequestTimer(void)
+{
+	g_nSendTick = GfaSystickGetCount() + _REQ_DELAY;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static bool _RequestTimerElapsed(void)
+{
+	return g_nSendTick < GfaSystickGetCount();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _ReportError(uint16_t errcode)
+{
+	// Report error. See gfambrtumst.h for error codes
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _FinishRequest(void)
+{
+	_RetriggerRequestTimer();
+	g_bCTS = true;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnReadRegistersComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint16_t *pRegs, size_t nRegCount)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+
+		if(nTID == TID_NEDAP_READ_REGISTERS_0_50)
+		{
+			// ...
+		}
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnWriteRegistersComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nRegStart, uint16_t nRegsWritten)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnPresetRegisterComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnDiagnosisComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nSubFunc, uint16_t nData)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		switch(nSubFunc)
+		{
+		case MB_SUBFUNC_CLEAR_CTRS_AND_DIAGNOSTIC_REG:
+			// Success! Do whatever needs to be done ...
+			break;
+		case MB_SUBFUNC_RETURN_BUS_EXCEPTION_ERROR_COUNT:
+			// Success! Do whatever needs to be done ...
+			break;
+		}
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnReportSlaveIDComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, const void *pData, size_t nCbData)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnReadUVComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnReadTempComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnReadRangeComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnReadSerialComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint8_t *pVal, size_t nCbVal)
+{
+	if(err)
+	{
+		_ReportError(err);
+	}
+	else
+	{
+		// Success! Do whatever needs to be done ...
+	}
+
+	_FinishRequest();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static bool _DoMetronik(uint8_t nSlaveID)
+{
+	static uint32_t nState = 0;
+	bool bRet = false;
+
+	switch(nState++ % 4)
+	{
+	case 0:
+		bRet = GfaModbusRTUMstILMReadUV(g_hMbMst, TID_METRONIC_ILM_READ_UV, nSlaveID, _OnReadUVComplete);
+		break;
+	case 1:
+		bRet = GfaModbusRTUMstILMReadTemp(g_hMbMst, TID_METRONIC_ILM_READ_TEMP, nSlaveID, _OnReadTempComplete);
+		break;
+	case 2:
+		bRet = GfaModbusRTUMstILMReadSerial(g_hMbMst, TID_METRONIC_ILM_READ_SERIAL, nSlaveID, _OnReadSerialComplete);
+		break;
+	case 3:
+		bRet = GfaModbusRTUMstILMReadRange(g_hMbMst, TID_METRONIC_ILM_READ_RANGE, nSlaveID, _OnReadRangeComplete);
+		break;
+	}
+
+	return bRet;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static bool _DoNedap(uint8_t nSlaveID, uint32_t *pnState)
+{
+	bool bRet = false;
+
+	switch((*pnState)++)
+	{
+	case 0:
+		bRet = GfaModbusRTUMstDiagnosis(g_hMbMst, TID_NEDAP_CLEAR_CTRS_AND_DIAGNOSTIC_REG, nSlaveID, MB_SUBFUNC_CLEAR_CTRS_AND_DIAGNOSTIC_REG, 0, _OnDiagnosisComplete);
+		break;
+	case 1:
+		bRet = GfaModbusRTUMstReportSlaveID(g_hMbMst, TID_NEDAP_REPORT_SLAVE_ID, nSlaveID, 4, _OnReportSlaveIDComplete);
+		break;
+	case 10:
+		bRet = GfaModbusRTUMstPresetSingleRegister(g_hMbMst, TID_NEDAP_PRESET_SINGLE_REGISTER_7, nSlaveID, 7, 0x801E, _OnPresetRegisterComplete);
+		break;
+	case 50:
+		g_nRegs[0] = 0x801E;
+		g_nRegs[1] = 0x0015;
+		bRet = GfaModbusRTUMstWriteMultipleRegisters(g_hMbMst, TID_NEDAP_WRITE_MULTIPLE_REGISTERS_7_2, nSlaveID, 7, 2, g_nRegs, _OnWriteRegistersComplete);
+		break;
+	case 100:
+		bRet = GfaModbusRTUMstDiagnosis(g_hMbMst, TID_NEDAP_RETURN_BUS_EXCEPTION_ERROR_COUNT, nSlaveID, MB_SUBFUNC_RETURN_BUS_EXCEPTION_ERROR_COUNT, 0, _OnDiagnosisComplete);
+		*pnState = 1;
+		break;
+	default:
+		bRet = GfaModbusRTUMstReadHoldingRegisters(g_hMbMst, TID_NEDAP_READ_REGISTERS_0_50, nSlaveID, 0, 50, _OnReadRegistersComplete);
+		break;
+	}
+
+	return bRet;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _InitUARTConfig(LPGFA_UART_CONFIG puc)
+{
+	memset(puc, 0, sizeof(LPGFA_UART_CONFIG));
+
+	puc->P_UART_BASE		  = UART_BASE;
+	puc->P_UART_BASE_SYSCTL   = UART_BASE_SYSCTL;
+	puc->P_UART_PORT          = UART_PORT;
+	puc->P_UART_PORT_SYSCTL   = UART_PORT_SYSCTL;
+	puc->P_UART_RX_PIN        = UART_RX_PIN;
+	puc->P_UART_RX_PIN_MUX    = UART_RX_PIN_MUX;
+	puc->P_UART_TX_PIN        = UART_TX_PIN;
+	puc->P_UART_TX_PIN_MUX    = UART_TX_PIN_MUX;
+	puc->P_UART_INT           = UART_INT;
+	puc->P_UART_INT_PRIORITY  = MODBUS_RTU_UART_INT_PRIORITY;
+	puc->P_EN_485_PORT_SYSCTL = EN_485_PORT_SYSCTL;
+	puc->P_EN_485_PORT        = EN_485_PORT;
+	puc->P_EN_485_PIN         = EN_485_PIN;
+	puc->nBaud                = MODBUS_RTU_BAUDRATE;
+	puc->nDatabits            = MODBUS_RTU_DATABITS;
+	puc->nStopbits            = MODBUS_RTU_STOPBITS;
+	puc->parity               = MODBUS_RTU_PARITY;
+	puc->nFifoIndexRx         = 0;
+	puc->nFifoIndexTx         = 1;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaInitModbusMasterApp(void)
+{
+	GFA_UART_CONFIG uartParams;
+	g_hMbMst = NULL;
+	_InitUARTConfig(&uartParams);
+
+	if(GfaMbUartInit(&uartParams))
+	{
+		GFA_MODBUS_RTU_MASTER_PARAMETERS mstParams;
+		memset(&mstParams, 0, sizeof(mstParams));
+
+		mstParams.hFifoRX		= GfaMbUartGetRxFifo();
+		mstParams.hFifoTX		= GfaMbUartGetTxFifo();
+		mstParams.nRxTimeoutUs	= MODBUS_RTU_MASTER_RX_TIMEOUT_US;
+		GfaMbUartGetProtocolTimeouts(&mstParams.mpt);
+
+		mstParams.appItf.pfnStateChanged = _OnMasterStateChanged;
+
+		if(!(g_hMbMst = GfaModbusRTUMstCreate(&mstParams)))
+			GfaMbUartRelease();
+		else
+			g_bCTS = true;
+	}
+
+	return !!g_hMbMst;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaDoModbusMasterApp(void)
+{
+	static uint32_t nLoop = 0, nStateN1 = 0, nStateN2 = 0;
+	bool bRet = false;
+
+	if(g_bCTS && _RequestTimerElapsed())
+	{
+		g_bCTS = false;
+
+		switch(nLoop++ % 3)
+		{
+		case 0:
+			bRet = _DoMetronik(_METRONIK_SENSOR_SLAVE_ID);
+			break;
+		case 1:
+			bRet = _DoNedap(_NEDAP_SLAVE_ID_1, &nStateN1);
+			break;
+		case 2:
+			bRet = _DoNedap(_NEDAP_SLAVE_ID_2, &nStateN2);
+			break;
+		}
+
+		if(!bRet)
+		{
+			_ReportError(GFA_MB_MST_ERROR_UNEXPECTED);
+			_FinishRequest();
+		}
+	}
+
+	GfaModbusRTUMstStateMachine(g_hMbMst);
+}
+
+/////////////////////////////////////////////////////////////////////////////

+ 36 - 0
DemoMaster/mbmstapp.h

@@ -0,0 +1,36 @@
+// mbmstapp.h :
+//
+
+#if !defined(AGD_MBMSTAPP_H__DC9BAC0C_4500_4FB9_823E_B06F03EDB046__INCLUDED_)
+#define AGD_MBMSTAPP_H__DC9BAC0C_4500_4FB9_823E_B06F03EDB046__INCLUDED_
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// mbapp.h - Declarations:
+
+#define HW_PLATFORM_OLS1V									1
+#define HW_PLATFORM_EAV1V									2
+#define HW_PLATFORM											HW_PLATFORM_OLS1V
+
+#define MODBUS_RTU_UART_INT_PRIORITY						(1 << 5)
+#define MODBUS_RTU_BAUDRATE									19200
+#define MODBUS_RTU_DATABITS									8
+#define MODBUS_RTU_STOPBITS									1
+#define MODBUS_RTU_PARITY									P_Even
+#define MODBUS_RTU_MASTER_RX_TIMEOUT_US						500000	// slave to master response timeout in microseconds
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaInitModbusMasterApp(void);
+void GfaDoModbusMasterApp(void);
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_MBMSTAPP_H__DC9BAC0C_4500_4FB9_823E_B06F03EDB046__INCLUDED_)

+ 213 - 0
DemoMaster/ols1v.h

@@ -0,0 +1,213 @@
+// eav1v.h :
+//
+
+#if !defined(AGD_PINS_H__9F94DC4E_A195_4754_9727_7DAF2FFB0DE2__INCLUDED_)
+#define AGD_PINS_H__9F94DC4E_A195_4754_9727_7DAF2FFB0DE2__INCLUDED_
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// pins.h - Declarations:
+
+//
+// GPIO PORTA is used for
+//
+#define PA0__RX_UART0		GPIO_PIN_0		// PA0	RX_UART0		(UART input)
+#define PA1__TX_UART0		GPIO_PIN_1		// PA1	TX_UART0		(UART output)
+#define PA2__LED3			GPIO_PIN_2		// PA2	LED3			(digital output)
+#define PA3__LED4			GPIO_PIN_3		// PA3	LED4			(digital output)
+#define PA4__LED5			GPIO_PIN_4		// PA4	LED5			(digital output)
+#define PA5__LED6			GPIO_PIN_5		// PA5	LED6			(digital output)
+#define PA6__5V_UART0		GPIO_PIN_6		// PA6	5V_UART0		(digital input)
+#define PA7__				GPIO_PIN_7		// PA7					(unused)
+
+//
+// GPIO PORTB is used for
+//
+#define PB0__RX_485_1		GPIO_PIN_0		// PB0	RX_485_1		(UART input)
+#define PB1__TX_485_1		GPIO_PIN_1		// PB1	TX_485_1		(UART output)
+#define PB2__I2C_WIFI_SCL	GPIO_PIN_2		// PB2	I2C_WIFI_SCL	(I2C interface)
+#define PB3__I2C_WIFI_SDA	GPIO_PIN_3		// PB3	I2C_WIFI_SDA	(I2C interface)
+#define PB4__DIGOUT1		GPIO_PIN_4		// PB4	DIGOUT1			(digital output)
+#define PB5__DIGOUT2		GPIO_PIN_5		// PB5	DIGOUT2			(digital output)
+
+#define PB0__LS_ON_ZI3		GPIO_PIN_0		// PB0	LS_ON_ZI3		(digital output)
+#define PB1__LS_ON_ZI2		GPIO_PIN_1		// PB1	LS_ON_ZI2		(digital output)
+#define PB2__Z_IN1_SCL3		GPIO_PIN_2		// PB2	Z_IN1_SCL3		(TIMER input, I2C interface)
+#define PB3__AN_CLK_SDA3	GPIO_PIN_3		// PB3	AN_CLK_SDA3		(TIMER input, I2C interface)
+#define PB4__ANIN1			GPIO_PIN_4		// PB4	ANIN1			(analog input)
+#define PB5__U_24V_IO		GPIO_PIN_5		// PB5	U_24V_IO		(analog input)
+
+//
+// GPIO PORTC is used for
+//
+#define PC0__				GPIO_PIN_0		// PC0					(JTAG TCK)
+#define PC1__				GPIO_PIN_1		// PC1					(JTAG TMS)
+#define PC2__				GPIO_PIN_2		// PC2					(JTAG TDI)
+#define PC3__				GPIO_PIN_3		// PC3					(JTAG TDO)
+#define PC4__				GPIO_PIN_4		// PC4					(unused)
+#define PC5__TASTE			GPIO_PIN_5		// PC5	TASTE			(digital input)
+#define PC6__VREF_ZIN_H		GPIO_PIN_6		// PC6	VREF_ZIN_H		(analog comparator reference)
+#define PC7__ZIN1			GPIO_PIN_7		// PC7	ZIN1			(analog comparator input)
+
+#define PC0__				GPIO_PIN_0		// PC0					(JTAG TCK)
+#define PC1__				GPIO_PIN_1		// PC1					(JTAG TMS)
+#define PC2__				GPIO_PIN_2		// PC2					(JTAG TDI)
+#define PC3__				GPIO_PIN_3		// PC3					(JTAG TDO)
+#define PC4__Z_IN2			GPIO_PIN_4		// PC4	Z_IN2			(analog comparator input)
+#define PC5__LED_BUS		GPIO_PIN_5		// PC5	LED_BUS			(digital output)
+#define PC6__VREF_ZIN_H		GPIO_PIN_6		// PC6	VREF_ZIN_H		(analog comparator reference)
+#define PC7__Z_IN3			GPIO_PIN_7		// PC7	Z_IN3			(analog comparator input)
+
+//
+// GPIO PORTD is used for
+//
+#define PD0__ANIN_OUT1		GPIO_PIN_0		// PD0	ANIN_OUT1		(analog input)
+#define PD1__ANIN4			GPIO_PIN_1		// PD1	ANIN4			(analog input)
+#define PD2__ANIN3			GPIO_PIN_2		// PD2	ANIN3			(analog input)
+#define PD3__ANIN0			GPIO_PIN_3		// PD3	ANIN0			(analog input)
+#define PD4__MP				GPIO_PIN_4		// PD4	MP				(UART input)
+#define PD5__MP				GPIO_PIN_5		// PD4	MP				(UART output)
+#define PD6__ACT_POS		GPIO_PIN_6		// PD4	ACT_POS			(analog input)
+#define PD7__RESTARTB		GPIO_PIN_7		// PD4	RESTARTB		(digital input)
+
+#define PD0__ANIN_OUT1		GPIO_PIN_0		// PD0	ANIN_OUT1		(analog input)
+#define PD1__ANIN_OUT2		GPIO_PIN_1		// PD1	ANIN_OUT2		(analog input)
+#define PD2__ANIN_OUT3		GPIO_PIN_2		// PD2	ANIN_OUT3		(analog input)
+#define PD3__ANIN_OUT4		GPIO_PIN_3		// PD3	ANIN_OUT4		(analog input)
+#define PD4__ANIN4			GPIO_PIN_4		// PD4	ANIN4			(analog input)
+#define PD5__ANIN5			GPIO_PIN_5		// PD4	ANIN5			(analog input)
+#define PD6__ANIN6			GPIO_PIN_6		// PD4	ANIN6			(analog input)
+#define PD7__ANIN0			GPIO_PIN_7		// PD4	ANIN0			(analog input)
+
+//
+// GPIO PORTE is used for
+//
+#define PE0__RX_WIFI2		GPIO_PIN_0		// PE0	RX_WIFI2		(UART input)
+#define PE1__TX_WIFI2		GPIO_PIN_1		// PE1	TX_WIFI2		(UART output)
+#define PE2__LS_ON_ZI1		GPIO_PIN_2		// PE2	LS_ON_ZI1		(digital output)
+#define PE3__				GPIO_PIN_3		// PE3					(unused)
+#define PE4__RX_485_2		GPIO_PIN_4		// PE4	RX_485_2		(UART input)
+#define PE5__TX_485_2		GPIO_PIN_5		// PE5	TX_485_2		(UART output)
+#define PE6__EN_485_2		GPIO_PIN_6		// PE6	EN_485_2		(digital output)
+#define PE7__EN_485_1		GPIO_PIN_7		// PE6	EN_485_1		(digital output)
+
+#define PE0__RX_485_1		GPIO_PIN_0		// PE0	RX_485_1		(UART input)
+#define PE1__TX_485_1		GPIO_PIN_1		// PE1	TX_485_1		(UART output)
+#define PE2__LED_ERR		GPIO_PIN_2		// PE2	LED_ERR			(digital output)
+#define PE3__Z_IN4			GPIO_PIN_3		// PE3	Z_IN4			(analog input)
+#define PE4__ANIN2			GPIO_PIN_4		// PE4	ANIN2			(analog input)
+#define PE5__ANIN3			GPIO_PIN_5		// PE5	ANIN3			(analog input)
+#define PE6__U_VERS			GPIO_PIN_6		// PE6	U_VERS			(analog input)
+#define PE7__U_V15V			GPIO_PIN_7		// PE6	U_V15V			(analog input)
+
+//
+// GPIO PORTF is used for
+//
+#define PF0__ANZ1_A			GPIO_PIN_0		// PF0	ANZ1_A			(digital output)
+#define PF1__ANZ1_B			GPIO_PIN_1		// PF1	ANZ1_B			(digital output)
+#define PF2__ANZ1_C			GPIO_PIN_2		// PF2	ANZ1_C			(digital output)
+#define PF3__ANZ1_D			GPIO_PIN_3		// PF3	ANZ1_D			(digital output)
+#define PF4__ANZ1_E			GPIO_PIN_4		// PF4	ANZ1_E			(digital output)
+#define PF5__ANZ1_F			GPIO_PIN_5		// PF5	ANZ1_F			(digital output)
+#define PF6__ANZ1_G			GPIO_PIN_6		// PF6	ANZ1_G			(digital output)
+#define PF7__ANZ1_DP		GPIO_PIN_7		// PF7	ANZ1_DP			(digital output)
+
+#define PF0__nCS_REL		GPIO_PIN_0		// PF0	nCS_REL			(digital input)
+#define PF1__nCS_DA1		GPIO_PIN_1		// PF1	nCS_DA1			(digital input)
+#define PF2__nCS_DA2		GPIO_PIN_2		// PF2	nCS_DA2			(digital input)
+#define PF3__PWM_CPU		GPIO_PIN_3		// PF3	PWM_CPU			(digital input)
+#define PF4__100Hz			GPIO_PIN_4		// PF4	100Hz			(TIMER output)
+#define PF5__nRES_PER		GPIO_PIN_5		// PF5	nRES_PER		(digital input)
+#define PF6__LED_BETR		GPIO_PIN_6		// PF6	LED_BETR		(digital output)
+#define PF7__LS_ON_ZI4		GPIO_PIN_7		// PF7	LS_ON_ZI3		(digital output)
+
+//
+// GPIO PORTG is used for
+//
+#define PG0__ANZ2_A			GPIO_PIN_0		// PG0	ANZ1_A			(digital output)
+#define PG1__ANZ2_B			GPIO_PIN_1		// PG1	ANZ1_B			(digital output)
+#define PG2__ANZ2_C			GPIO_PIN_2		// PG2	ANZ1_C			(digital output)
+#define PG3__ANZ2_D			GPIO_PIN_3		// PG3	ANZ1_D			(digital output)
+#define PG4__ANZ2_E			GPIO_PIN_4		// PG4	ANZ1_E			(digital output)
+#define PG5__ANZ2_F			GPIO_PIN_5		// PG5	ANZ1_F			(digital output)
+#define PG6__ANZ2_G			GPIO_PIN_6		// PG6	ANZ1_G			(digital output)
+#define PG7__ANZ2_DP		GPIO_PIN_7		// PG7	ANZ1_DP			(digital output)
+
+#define PG0__REL1			GPIO_PIN_0		// PG0	REL1			(digital output)
+#define PG1__REL2			GPIO_PIN_1		// PG1	REL2			(digital output)
+#define PG2__REL3			GPIO_PIN_2		// PG2	REL3			(digital output)
+#define PG3__REL4			GPIO_PIN_3		// PG3	REL4			(digital output)
+#define PG4__PWM_TRIAC		GPIO_PIN_4		// PG4	PWM_TRIAC		(PWM output)
+#define PG5__LS_ON_ZI1		GPIO_PIN_5		// PG5	LS_ON_ZI1		(digital output)
+#define PG6__NULLDURCH		GPIO_PIN_6		// PG6  NULLDURCH		(TIMER input)
+#define PG7__Z_IN1			GPIO_PIN_7		// PG7	Z_IN1			(analog comparator input)
+
+//
+// GPIO PORTH is used for
+//
+#define PH0__ANIN2			GPIO_PIN_0		// PH0	ANIN2			(analog input)
+#define PH1__ANIN1			GPIO_PIN_1		// PH1	ANIN1			(analog input)
+#define PH2__U_DIG_OUT2		GPIO_PIN_2		// PH2	U_DIG_OUT2		(analog input)
+#define PH3__U_VERS			GPIO_PIN_3		// PH3	U_VERS			(analog input)
+#define PH4__ST_DO1			GPIO_PIN_4		// PH4	ST_DO1			(digital input)
+#define PH5__ST_DO2			GPIO_PIN_5		// PH5	ST_DO2			(digital input)
+#define PH6__				GPIO_PIN_6		// PH6					(unused)
+#define PH7__PWM_AN1		GPIO_PIN_7		// PH7	PWM_AN1			(PWM output)
+
+#define PH0__LED_IN1		GPIO_PIN_0		// PH0	LED_IN1			(digital output)
+#define PH1__LED_IN2		GPIO_PIN_1		// PH1	LED_IN2			(digital output)
+#define PH2__LED_IN3		GPIO_PIN_2		// PH2	LED_IN3			(digital output)
+#define PH3__LED_IN4		GPIO_PIN_3		// PH3	LED_IN4			(digital output)
+#define PH4__PWM4			GPIO_PIN_4		// PG4	PWM4			(PWM output)
+#define PH5__PWM3			GPIO_PIN_5		// PG5	PWM3			(PWM output)
+#define PH6__PWM2			GPIO_PIN_6		// PG6	PWM2			(PWM output)
+#define PH7__PWM1			GPIO_PIN_7		// PG7	PWM1			(PWM output)
+
+//
+// GPIO PORTJ is used for
+//
+#define PJ0__RX_WIFI1		GPIO_PIN_0		// PJ0	RX_WIFI1		(UART input)
+#define PJ1__TX_WIFI1		GPIO_PIN_1		// PJ1	TX_WIFI1		(UART output)
+#define PJ2__EN_WIFI		GPIO_PIN_2		// PJ2	EN_WIFI			(digital output)
+
+#define PJ0__EN_V15V		GPIO_PIN_0		// PJ0	EN_V15V			(digital output)
+#define PJ1__EN_V24V_IO		GPIO_PIN_1		// PJ1	EN_V24V_IO		(digital output)
+#define PJ2__EN_485_1		GPIO_PIN_2		// PJ2	EN_485_1		(digital output)
+
+//
+// GPIO PORTK is used for
+//
+#define PK0__SPI_WIFI_CLK	GPIO_PIN_0		// PK0	SPI_WIFI_CLK	(SPI output)
+#define PK1__SPI_WIFI_CS	GPIO_PIN_1		// PK1	SPI_WIFI_CS		(SPI output)
+#define PK2__SPI_WIFI_MISO	GPIO_PIN_2		// PK2	SPI_WIFI_MISO	(SPI input)
+#define PK3__SPI_WIFI_MOSI	GPIO_PIN_3		// PK3	SPI_WIFI_MOSI	(SPI output)
+
+#define PK0__AN_A0			GPIO_PIN_0		// PK0	AN_A0			(digital input)
+#define PK1__AN_A1			GPIO_PIN_1		// PK1	AN_A1			(digital input)
+#define PK2__AN_A2			GPIO_PIN_2		// PK2	AN_A2			(digital input)
+#define PK3__nAB_DA			GPIO_PIN_3		// PK3	nA/B_DA			(digital input)
+
+/////////////////////////////////////////////////////////////////////////////
+// UART / RS485 / Timer
+
+#define UART_PORT_SYSCTL	SYSCTL_PERIPH_GPIOB
+#define UART_PORT			GPIO_PORTB_BASE
+#define UART_BASE_SYSCTL	SYSCTL_PERIPH_UART1
+#define UART_BASE			UART1_BASE
+#define UART_INT			INT_UART1
+#define UART_RX_PIN         PB0__RX_485_1
+#define UART_TX_PIN         PB1__TX_485_1
+#define UART_RX_PIN_MUX     GPIO_PB0_U1RX
+#define UART_TX_PIN_MUX     GPIO_PB1_U1TX
+#define EN_485_PORT_SYSCTL	SYSCTL_PERIPH_GPIOE
+#define EN_485_PORT			GPIO_PORTE_BASE
+#define EN_485_PIN			PE7__EN_485_1
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_PINS_H__9F94DC4E_A195_4754_9727_7DAF2FFB0DE2__INCLUDED_)

+ 45 - 0
DemoMaster/tm4c1231e6pz.cmd

@@ -0,0 +1,45 @@
+/******************************************************************************
+ *
+ * Default Linker Command file for the Texas Instruments TM4C1231E6PZ
+ *
+ * This is derived from revision 15071 of the TivaWare Library.
+ *
+ *****************************************************************************/
+
+--retain=g_pfnVectors
+
+MEMORY
+{
+    FLASH (RX) : origin = 0x00000000, length = 0x00020000
+    SRAM (RWX) : origin = 0x20000000, length = 0x00008000
+}
+
+/* The following command line options are set as part of the CCS project.    */
+/* If you are building using the command line, or for some reason want to    */
+/* define them here, you can uncomment and modify these lines as needed.     */
+/* If you are using CCS for building, it is probably better to make any such */
+/* modifications in your CCS project and leave this file alone.              */
+/*                                                                           */
+/* --heap_size=0                                                             */
+/* --stack_size=256                                                          */
+/* --library=rtsv7M4_T_le_eabi.lib                                           */
+
+/* Section allocation in memory */
+
+SECTIONS
+{
+    .intvecs:   > 0x00000000
+    .text   :   > FLASH
+    .const  :   > FLASH
+    .cinit  :   > FLASH
+    .pinit  :   > FLASH
+    .init_array : > FLASH
+
+    .vtable :   > 0x20000000
+    .data   :   > SRAM
+    .bss    :   > SRAM
+    .sysmem :   > SRAM
+    .stack  :   > SRAM
+}
+
+__STACK_TOP = __stack + 512;

+ 300 - 0
DemoMaster/tm4c1231e6pz_startup_ccs.c

@@ -0,0 +1,300 @@
+//*****************************************************************************
+//
+// Startup code for use with TI's Code Composer Studio.
+//
+// Copyright (c) 2011-2014 Texas Instruments Incorporated.  All rights reserved.
+// Software License Agreement
+// 
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+
+//*****************************************************************************
+//
+// Forward declaration of the default fault handlers.
+//
+//*****************************************************************************
+void ResetISR(void);
+static void NmiSR(void);
+static void FaultISR(void);
+static void IntDefaultHandler(void);
+
+//*****************************************************************************
+//
+// External declaration for the reset handler that is to be called when the
+// processor is started
+//
+//*****************************************************************************
+extern void _c_int00(void);
+
+//*****************************************************************************
+//
+// Linker variable that marks the top of the stack.
+//
+//*****************************************************************************
+extern uint32_t __STACK_TOP;
+
+//*****************************************************************************
+//
+// External declarations for the interrupt handlers used by the application.
+//
+//*****************************************************************************
+// To be added by user
+
+//*****************************************************************************
+//
+// The vector table.  Note that the proper constructs must be placed on this to
+// ensure that it ends up at physical address 0x0000.0000 or at the start of
+// the program if located at a start address other than 0.
+//
+//*****************************************************************************
+#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
+void (* const g_pfnVectors[])(void) =
+{
+    (void (*)(void))((uint32_t)&__STACK_TOP),
+                                            // The initial stack pointer
+    ResetISR,                               // The reset handler
+    NmiSR,                                  // The NMI handler
+    FaultISR,                               // The hard fault handler
+    IntDefaultHandler,                      // The MPU fault handler
+    IntDefaultHandler,                      // The bus fault handler
+    IntDefaultHandler,                      // The usage fault handler
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // SVCall handler
+    IntDefaultHandler,                      // Debug monitor handler
+    0,                                      // Reserved
+    IntDefaultHandler,                      // The PendSV handler
+    IntDefaultHandler,                      // The SysTick handler
+    IntDefaultHandler,                      // GPIO Port A
+    IntDefaultHandler,                      // GPIO Port B
+    IntDefaultHandler,                      // GPIO Port C
+    IntDefaultHandler,                      // GPIO Port D
+    IntDefaultHandler,                      // GPIO Port E
+    IntDefaultHandler,                      // UART0 Rx and Tx
+    IntDefaultHandler,                      // UART1 Rx and Tx
+    IntDefaultHandler,                      // SSI0 Rx and Tx
+    IntDefaultHandler,                      // I2C0 Master and Slave
+    IntDefaultHandler,                      // PWM Fault
+    IntDefaultHandler,                      // PWM Generator 0
+    IntDefaultHandler,                      // PWM Generator 1
+    IntDefaultHandler,                      // PWM Generator 2
+    IntDefaultHandler,                      // Quadrature Encoder 0
+    IntDefaultHandler,                      // ADC Sequence 0
+    IntDefaultHandler,                      // ADC Sequence 1
+    IntDefaultHandler,                      // ADC Sequence 2
+    IntDefaultHandler,                      // ADC Sequence 3
+    IntDefaultHandler,                      // Watchdog timer
+    IntDefaultHandler,                      // Timer 0 subtimer A
+    IntDefaultHandler,                      // Timer 0 subtimer B
+    IntDefaultHandler,                      // Timer 1 subtimer A
+    IntDefaultHandler,                      // Timer 1 subtimer B
+    IntDefaultHandler,                      // Timer 2 subtimer A
+    IntDefaultHandler,                      // Timer 2 subtimer B
+    IntDefaultHandler,                      // Analog Comparator 0
+    IntDefaultHandler,                      // Analog Comparator 1
+    IntDefaultHandler,                      // Analog Comparator 2
+    IntDefaultHandler,                      // System Control (PLL, OSC, BO)
+    IntDefaultHandler,                      // FLASH Control
+    IntDefaultHandler,                      // GPIO Port F
+    IntDefaultHandler,                      // GPIO Port G
+    IntDefaultHandler,                      // GPIO Port H
+    IntDefaultHandler,                      // UART2 Rx and Tx
+    IntDefaultHandler,                      // SSI1 Rx and Tx
+    IntDefaultHandler,                      // Timer 3 subtimer A
+    IntDefaultHandler,                      // Timer 3 subtimer B
+    IntDefaultHandler,                      // I2C1 Master and Slave
+    IntDefaultHandler,                      // Quadrature Encoder 1
+    IntDefaultHandler,                      // CAN0
+    IntDefaultHandler,                      // CAN1
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // Hibernate
+    IntDefaultHandler,                      // USB0
+    IntDefaultHandler,                      // PWM Generator 3
+    IntDefaultHandler,                      // uDMA Software Transfer
+    IntDefaultHandler,                      // uDMA Error
+    IntDefaultHandler,                      // ADC1 Sequence 0
+    IntDefaultHandler,                      // ADC1 Sequence 1
+    IntDefaultHandler,                      // ADC1 Sequence 2
+    IntDefaultHandler,                      // ADC1 Sequence 3
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // GPIO Port J
+    IntDefaultHandler,                      // GPIO Port K
+    IntDefaultHandler,                      // GPIO Port L
+    IntDefaultHandler,                      // SSI2 Rx and Tx
+    IntDefaultHandler,                      // SSI3 Rx and Tx
+    IntDefaultHandler,                      // UART3 Rx and Tx
+    IntDefaultHandler,                      // UART4 Rx and Tx
+    IntDefaultHandler,                      // UART5 Rx and Tx
+    IntDefaultHandler,                      // UART6 Rx and Tx
+    IntDefaultHandler,                      // UART7 Rx and Tx
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // I2C2 Master and Slave
+    IntDefaultHandler,                      // I2C3 Master and Slave
+    IntDefaultHandler,                      // Timer 4 subtimer A
+    IntDefaultHandler,                      // Timer 4 subtimer B
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // Timer 5 subtimer A
+    IntDefaultHandler,                      // Timer 5 subtimer B
+    IntDefaultHandler,                      // Wide Timer 0 subtimer A
+    IntDefaultHandler,                      // Wide Timer 0 subtimer B
+    IntDefaultHandler,                      // Wide Timer 1 subtimer A
+    IntDefaultHandler,                      // Wide Timer 1 subtimer B
+    IntDefaultHandler,                      // Wide Timer 2 subtimer A
+    IntDefaultHandler,                      // Wide Timer 2 subtimer B
+    IntDefaultHandler,                      // Wide Timer 3 subtimer A
+    IntDefaultHandler,                      // Wide Timer 3 subtimer B
+    IntDefaultHandler,                      // Wide Timer 4 subtimer A
+    IntDefaultHandler,                      // Wide Timer 4 subtimer B
+    IntDefaultHandler,                      // Wide Timer 5 subtimer A
+    IntDefaultHandler,                      // Wide Timer 5 subtimer B
+    IntDefaultHandler,                      // FPU
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // I2C4 Master and Slave
+    IntDefaultHandler,                      // I2C5 Master and Slave
+    IntDefaultHandler,                      // GPIO Port M
+    IntDefaultHandler,                      // GPIO Port N
+    IntDefaultHandler,                      // Quadrature Encoder 2
+    0,                                      // Reserved
+    0,                                      // Reserved
+    IntDefaultHandler,                      // GPIO Port P (Summary or P0)
+    IntDefaultHandler,                      // GPIO Port P1
+    IntDefaultHandler,                      // GPIO Port P2
+    IntDefaultHandler,                      // GPIO Port P3
+    IntDefaultHandler,                      // GPIO Port P4
+    IntDefaultHandler,                      // GPIO Port P5
+    IntDefaultHandler,                      // GPIO Port P6
+    IntDefaultHandler,                      // GPIO Port P7
+    IntDefaultHandler,                      // GPIO Port Q (Summary or Q0)
+    IntDefaultHandler,                      // GPIO Port Q1
+    IntDefaultHandler,                      // GPIO Port Q2
+    IntDefaultHandler,                      // GPIO Port Q3
+    IntDefaultHandler,                      // GPIO Port Q4
+    IntDefaultHandler,                      // GPIO Port Q5
+    IntDefaultHandler,                      // GPIO Port Q6
+    IntDefaultHandler,                      // GPIO Port Q7
+    IntDefaultHandler,                      // GPIO Port R
+    IntDefaultHandler,                      // GPIO Port S
+    IntDefaultHandler,                      // PWM 1 Generator 0
+    IntDefaultHandler,                      // PWM 1 Generator 1
+    IntDefaultHandler,                      // PWM 1 Generator 2
+    IntDefaultHandler,                      // PWM 1 Generator 3
+    IntDefaultHandler                       // PWM 1 Fault
+};
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor first starts execution
+// following a reset event.  Only the absolutely necessary set is performed,
+// after which the application supplied entry() routine is called.  Any fancy
+// actions (such as making decisions based on the reset cause register, and
+// resetting the bits in that register) are left solely in the hands of the
+// application.
+//
+//*****************************************************************************
+void
+ResetISR(void)
+{
+    //
+    // Jump to the CCS C initialization routine.  This will enable the
+    // floating-point unit as well, so that does not need to be done here.
+    //
+    __asm("    .global _c_int00\n"
+          "    b.w     _c_int00");
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a NMI.  This
+// simply enters an infinite loop, preserving the system state for examination
+// by a debugger.
+//
+//*****************************************************************************
+static void
+NmiSR(void)
+{
+    //
+    // Enter an infinite loop.
+    //
+    while(1)
+    {
+    }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives a fault
+// interrupt.  This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+FaultISR(void)
+{
+    //
+    // Enter an infinite loop.
+    //
+    while(1)
+    {
+    }
+}
+
+//*****************************************************************************
+//
+// This is the code that gets called when the processor receives an unexpected
+// interrupt.  This simply enters an infinite loop, preserving the system state
+// for examination by a debugger.
+//
+//*****************************************************************************
+static void
+IntDefaultHandler(void)
+{
+    //
+    // Go into an infinite loop.
+    //
+    while(1)
+    {
+    }
+}

+ 1 - 3
DemoSlave/.cproject

@@ -72,9 +72,7 @@
 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
 									<listOptionValue builtIn="false" value="${TW_ROOT}\driverlib\ccs\Debug"/>
 									<listOptionValue builtIn="false" value="${TW_ROOT}\driverlib\ccs\Debug"/>
-									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\gfautils.1.0\lib\ccs\Debug"/>
-									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\gfambrtucom.1.0\lib\ccs\Debug"/>
-									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\gfambrtuslv.1.0\lib\ccs\Debug"/>
+									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\lib"/>
 								</option>
 								</option>
 								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY.1824240122" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY" useByScannerDiscovery="false" valueType="libs">
 								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY.1824240122" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY" useByScannerDiscovery="false" valueType="libs">
 									<listOptionValue builtIn="false" value="gfautils.lib"/>
 									<listOptionValue builtIn="false" value="gfautils.lib"/>

+ 0 - 4
DemoSlave/distribute.bat

@@ -16,10 +16,6 @@ set OUTDIR=%PRJDIR%%CONFIG%
 mkdir "%DSTDIR%" 1>nul 2>&1
 mkdir "%DSTDIR%" 1>nul 2>&1
 xcopy "%PRJDIR%*.*" "%DSTDIR%" /S /I /H /R /Y /Q /EXCLUDE:%PRJDIR%distribute.excl
 xcopy "%PRJDIR%*.*" "%DSTDIR%" /S /I /H /R /Y /Q /EXCLUDE:%PRJDIR%distribute.excl
 
 
-rem copy /Y "%OUTDIR%\%LIBBASENAME%.lib" "%LIBDIR%"
-rem copy /Y "%PRJDIR%%LIBBASENAME%.h" "%INCDIR%"
-rem copy /Y "%PRJDIR%*.c" "%SRCDIR%"
-
 set PRJDIR=
 set PRJDIR=
 set CONFIG=
 set CONFIG=
 set LIBMAJOR=
 set LIBMAJOR=

+ 1 - 1
DemoSlave/mbslvapp.c

@@ -5,7 +5,7 @@
 #include <stdbool.h>
 #include <stdbool.h>
 #include <limits.h>
 #include <limits.h>
 #include <gfambrtuslv.h>
 #include <gfambrtuslv.h>
-#include <mbslvapp.h>
+#include "mbslvapp.h"
 #include "inc/hw_memmap.h"
 #include "inc/hw_memmap.h"
 #include "inc/hw_gpio.h"
 #include "inc/hw_gpio.h"
 #include "inc/hw_uart.h"
 #include "inc/hw_uart.h"

+ 1 - 1
DemoSlave/mbslvapp.h

@@ -1,4 +1,4 @@
-// mbapp.h :
+// mbslvapp.h :
 //
 //
 
 
 #if !defined(AGD_MBAPP_H__45B5FF25_C1D8_4196_97EF_0101C487A999__INCLUDED_)
 #if !defined(AGD_MBAPP_H__45B5FF25_C1D8_4196_97EF_0101C487A999__INCLUDED_)

+ 1 - 0
gfamodbusrtucom/.settings/org.eclipse.core.resources.prefs

@@ -4,4 +4,5 @@ encoding//Debug/objects.mk=UTF-8
 encoding//Debug/sources.mk=UTF-8
 encoding//Debug/sources.mk=UTF-8
 encoding//Debug/subdir_rules.mk=UTF-8
 encoding//Debug/subdir_rules.mk=UTF-8
 encoding//Debug/subdir_vars.mk=UTF-8
 encoding//Debug/subdir_vars.mk=UTF-8
+encoding/gfambrtucom.h=UTF-8
 encoding/mbuart.c=UTF-8
 encoding/mbuart.c=UTF-8

+ 20 - 0
gfamodbusrtucom/buffer.c

@@ -1,4 +1,5 @@
 #include <gfambrtucom.h>
 #include <gfambrtucom.h>
+#include "driverlib/sw_crc.h"
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -152,6 +153,7 @@ double GfaBufGetUnaligned_double(const void *pData)
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
+
 void GfaBufSetUnaligned_double(void *pData, double fVal)
 void GfaBufSetUnaligned_double(void *pData, double fVal)
 {
 {
 	uint8_t *p1 = (uint8_t*)pData;
 	uint8_t *p1 = (uint8_t*)pData;
@@ -159,7 +161,25 @@ void GfaBufSetUnaligned_double(void *pData, double fVal)
 	memcpy(p1, p2, sizeof(double));
 	memcpy(p1, p2, sizeof(double));
 }
 }
 
 
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaBufVerifyCRC(const void *pData, size_t nCbData, const void *pCRC)
+{
+	uint16_t nCrc = Crc16(0xFFFF, (const uint8_t*)pData, nCbData);
+	const uint8_t *pCrc	= (const uint8_t*)pCRC;
+	return ((pCrc[0]	== (uint8_t)(nCrc &  0xff)) &&
+			(pCrc[1]	== (uint8_t)(nCrc >> 8)));
+}
 
 
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaBufSetCRC(const void *pData, size_t nCbData, void *pCRC)
+{
+	uint16_t nCrc = Crc16(0xFFFF, (const uint8_t*)pData, nCbData);
+	uint8_t *pCrc	= (uint8_t*)pCRC;
+	pCrc[0]			= (uint8_t)(nCrc &  0xff);
+	pCrc[1]			= (uint8_t)(nCrc >> 8);
+}
 
 
 
 
 
 

+ 31 - 0
gfamodbusrtucom/gfambrtucom.h

@@ -189,6 +189,34 @@ typedef enum _GfA_UART_Parity
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
+typedef struct _GFA_MODBUS_PROTOCOL_TIMEOUTS
+{
+	uint64_t nCharTimeoutUs;
+	uint64_t nFrameTimeoutUs;
+}GFA_MODBUS_PROTOCOL_TIMEOUTS, *LPGFA_MODBUS_PROTOCOL_TIMEOUTS;
+typedef const GFA_MODBUS_PROTOCOL_TIMEOUTS *LPCGFA_MODBUS_PROTOCOL_TIMEOUTS;
+
+/////////////////////////////////////////////////////////////////////////////
+
+inline bool GfaMbCalcProtocolTimeouts(uint32_t nBaud, LPGFA_MODBUS_PROTOCOL_TIMEOUTS pmpt) {
+	if(nBaud && pmpt) {
+		if(nBaud <= 19200) {
+			pmpt->nFrameTimeoutUs	= (350000000 / nBaud + 5) / 10;
+			pmpt->nCharTimeoutUs	= (150000000 / nBaud + 5) / 10;
+		}
+		else {
+			// For baud rates greater than 19200 the t1.5 and t3.5 timers are implemented
+			// using fixed values, for t1.5 that is 750μs, for t3.5 1.750ms
+			pmpt->nFrameTimeoutUs	= 1750;
+			pmpt->nCharTimeoutUs	= 750;
+		}
+		return true;
+	}
+	return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 typedef struct _GFA_UART_CONFIG
 typedef struct _GFA_UART_CONFIG
 {
 {
 	uint32_t	P_UART_BASE;
 	uint32_t	P_UART_BASE;
@@ -243,6 +271,7 @@ bool	GfaMbUartInit(LPCGFA_UART_CONFIG pCfg);
 void	GfaMbUartRelease(void);
 void	GfaMbUartRelease(void);
 HFIFO	GfaMbUartGetRxFifo(void);
 HFIFO	GfaMbUartGetRxFifo(void);
 HFIFO	GfaMbUartGetTxFifo(void);
 HFIFO	GfaMbUartGetTxFifo(void);
+void	GfaMbUartGetProtocolTimeouts(LPGFA_MODBUS_PROTOCOL_TIMEOUTS pmpt);
 void	GfaMbUartGetStatusCounters(LPGFA_UART_STATUS_COUNTERS pSc);
 void	GfaMbUartGetStatusCounters(LPGFA_UART_STATUS_COUNTERS pSc);
 void	GfaMbUartResetStatusCounters(void);
 void	GfaMbUartResetStatusCounters(void);
 
 
@@ -267,6 +296,8 @@ float		GfaBufGetUnaligned_float(const void *pData);
 void		GfaBufSetUnaligned_float(void *pData, float fVal);
 void		GfaBufSetUnaligned_float(void *pData, float fVal);
 double		GfaBufGetUnaligned_double(const void *pData);
 double		GfaBufGetUnaligned_double(const void *pData);
 void		GfaBufSetUnaligned_double(void *pData, double fVal);
 void		GfaBufSetUnaligned_double(void *pData, double fVal);
+bool		GfaBufVerifyCRC(const void *pData, size_t nCbData, const void *pCRC);
+void		GfaBufSetCRC(const void *pData, size_t nCbData, void *pCRC);
 
 
 
 
 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__

+ 82 - 85
gfamodbusrtucom/mbuart.c

@@ -12,35 +12,34 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
-static HFIFO					g_hFifoTX = NULL, g_hFifoRX = NULL;
-static volatile uint32_t		g_nTxEchoCount	= 0;
-static volatile uint64_t		g_nTimerTick	= 0;
-static GFA_UART_STATUS_COUNTERS	g_statCnt	= {0};
-static GFA_UART_CONFIG			g_uartCfg = {0};
-static uint64_t					g_MODBUS_RTU_FRAME_TIMEOUT_US = 0;
-static uint64_t					g_MODBUS_RTU_CHAR_TIMEOUT_US = 0;
+static HFIFO						g_hFifoTX = NULL, g_hFifoRX = NULL;
+static volatile uint32_t			g_nTxEchoCount	= 0;
+static volatile uint64_t			g_nTimerTick	= 0;
+static GFA_UART_STATUS_COUNTERS		g_statCnt	= {0};
+static GFA_UART_CONFIG				g_uartCfg = {0};
+static GFA_MODBUS_PROTOCOL_TIMEOUTS g_mpt = {0};
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
-#define UART_BASE							g_uartCfg.P_UART_BASE
-#define UART_BASE_SYSCTL					g_uartCfg.P_UART_BASE_SYSCTL
-#define UART_PORT							g_uartCfg.P_UART_PORT
-#define UART_PORT_SYSCTL					g_uartCfg.P_UART_PORT_SYSCTL
-#define UART_RX_PIN							g_uartCfg.P_UART_RX_PIN
-#define UART_RX_PIN_MUX						g_uartCfg.P_UART_RX_PIN_MUX
-#define UART_TX_PIN							g_uartCfg.P_UART_TX_PIN
-#define UART_TX_PIN_MUX						g_uartCfg.P_UART_TX_PIN_MUX
-#define UART_INT							g_uartCfg.P_UART_INT
-#define EN_485_PORT_SYSCTL					g_uartCfg.P_EN_485_PORT_SYSCTL
-#define EN_485_PORT							g_uartCfg.P_EN_485_PORT
-#define EN_485_PIN							g_uartCfg.P_EN_485_PIN
-#define MODBUS_RTU_UART_INT_PRIORITY		g_uartCfg.P_UART_INT_PRIORITY
-
-#define MODBUS_RTU_FRAME_TIMEOUT_US			g_MODBUS_RTU_FRAME_TIMEOUT_US;
-#define MODBUS_RTU_CHAR_TIMEOUT_US			g_MODBUS_RTU_CHAR_TIMEOUT_US;
-
-#define IS_INT_ENABLED(f)					!!(HWREG(UART_BASE + UART_O_IM) & (f))
-#define INT_MASK_REGISTER					HWREG(UART_BASE + UART_O_IM)
+#define GFA_UART_BASE				g_uartCfg.P_UART_BASE
+#define GFA_UART_BASE_SYSCTL		g_uartCfg.P_UART_BASE_SYSCTL
+#define GFA_UART_PORT				g_uartCfg.P_UART_PORT
+#define GFA_UART_PORT_SYSCTL		g_uartCfg.P_UART_PORT_SYSCTL
+#define GFA_UART_RX_PIN				g_uartCfg.P_UART_RX_PIN
+#define GFA_UART_RX_PIN_MUX			g_uartCfg.P_UART_RX_PIN_MUX
+#define GFA_UART_TX_PIN				g_uartCfg.P_UART_TX_PIN
+#define GFA_UART_TX_PIN_MUX			g_uartCfg.P_UART_TX_PIN_MUX
+#define GFA_UART_INT				g_uartCfg.P_UART_INT
+#define GFA_EN_485_PORT_SYSCTL		g_uartCfg.P_EN_485_PORT_SYSCTL
+#define GFA_EN_485_PORT				g_uartCfg.P_EN_485_PORT
+#define GFA_EN_485_PIN				g_uartCfg.P_EN_485_PIN
+#define GFA_UART_INT_PRIORITY		g_uartCfg.P_UART_INT_PRIORITY
+
+#define GFA_FRAME_TIMEOUT_US		g_mpt.nFrameTimeoutUs
+#define GFA_CHAR_TIMEOUT_US			g_mpt.nCharTimeoutUs
+
+#define IS_INT_ENABLED(f)			!!(HWREG(GFA_UART_BASE + UART_O_IM) & (f))
+#define INT_MASK_REGISTER			HWREG(GFA_UART_BASE + UART_O_IM)
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -55,7 +54,7 @@ static bool _TimerElapsed(void)
 static void _FrameTimerStart(void)
 static void _FrameTimerStart(void)
 {
 {
 	struct timeval tv;
 	struct timeval tv;
-	g_nTimerTick = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + MODBUS_RTU_FRAME_TIMEOUT_US;
+	g_nTimerTick = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + GFA_FRAME_TIMEOUT_US;
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -63,7 +62,7 @@ static void _FrameTimerStart(void)
 static void _CharTimerStart(void)
 static void _CharTimerStart(void)
 {
 {
 	struct timeval tv;
 	struct timeval tv;
-	g_nTimerTick = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + MODBUS_RTU_CHAR_TIMEOUT_US;
+	g_nTimerTick = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + GFA_CHAR_TIMEOUT_US;
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -87,13 +86,13 @@ static void _OnTxStart(void)
 {
 {
 	uint8_t b;
 	uint8_t b;
 
 
-	if(!UARTBusy(UART_BASE) && GfaMbFifoPop(g_hFifoTX, &b, false))
+	if(!UARTBusy(GFA_UART_BASE) && GfaMbFifoPop(g_hFifoTX, &b, false))
 	{
 	{
 		g_nTxEchoCount++;
 		g_nTxEchoCount++;
-		GPIOPinWrite(EN_485_PORT, EN_485_PIN, EN_485_PIN); // enable the bus
-		UARTIntEnable(UART_BASE, UART_INT_TX);
+		GPIOPinWrite(GFA_EN_485_PORT, GFA_EN_485_PIN, GFA_EN_485_PIN); // enable the bus
+		UARTIntEnable(GFA_UART_BASE, UART_INT_TX);
 		++g_statCnt.nCharsTransmitted;
 		++g_statCnt.nCharsTransmitted;
-		UARTCharPutNonBlocking(UART_BASE, b);
+		UARTCharPutNonBlocking(GFA_UART_BASE, b);
 	}
 	}
 }
 }
 
 
@@ -101,7 +100,7 @@ static void _OnTxStart(void)
 
 
 static bool _OnTxFinalize(void)
 static bool _OnTxFinalize(void)
 {
 {
-	return !UARTBusy(UART_BASE) && _TimerElapsed();
+	return !UARTBusy(GFA_UART_BASE) && _TimerElapsed();
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -112,7 +111,7 @@ static void _UART_RX_ISR(void)
 
 
 	if(g_nTxEchoCount)
 	if(g_nTxEchoCount)
 	{
 	{
-		UARTCharGetNonBlocking(UART_BASE);	// discard transmit echo chars
+		UARTCharGetNonBlocking(GFA_UART_BASE);	// discard transmit echo chars
 		--g_nTxEchoCount;
 		--g_nTxEchoCount;
 		_FrameTimerStart();
 		_FrameTimerStart();
 		return;
 		return;
@@ -132,18 +131,18 @@ static void _UART_RX_ISR(void)
 	}
 	}
 	else if(GfaMbFifoMatchFlags(g_hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, false))
 	else if(GfaMbFifoMatchFlags(g_hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, false))
 	{
 	{
-		UARTCharGetNonBlocking(UART_BASE);	// discard chars
+		UARTCharGetNonBlocking(GFA_UART_BASE);	// discard chars
 		_FrameTimerStart();
 		_FrameTimerStart();
 		return;
 		return;
 	}
 	}
 	else if(GfaMbFifoMatchFlags(g_hFifoTX, MB_RTU_FLAG_TRANSMIT_END, false))
 	else if(GfaMbFifoMatchFlags(g_hFifoTX, MB_RTU_FLAG_TRANSMIT_END, false))
 	{
 	{
-		UARTCharGetNonBlocking(UART_BASE);	// discard chars
+		UARTCharGetNonBlocking(GFA_UART_BASE);	// discard chars
 		GfaMbFifoReset(g_hFifoRX, false);
 		GfaMbFifoReset(g_hFifoRX, false);
 		return;
 		return;
 	}
 	}
 
 
-	b = (uint8_t)UARTCharGetNonBlocking(UART_BASE);
+	b = (uint8_t)UARTCharGetNonBlocking(GFA_UART_BASE);
 	GfaMbFifoPush(g_hFifoRX, b, false);
 	GfaMbFifoPush(g_hFifoRX, b, false);
 	_CharTimerStart();
 	_CharTimerStart();
 }
 }
@@ -157,13 +156,13 @@ static void _UART_TX_ISR(void)
 	if(GfaMbFifoPop(g_hFifoTX, &b, false))
 	if(GfaMbFifoPop(g_hFifoTX, &b, false))
 	{
 	{
 		++g_nTxEchoCount;
 		++g_nTxEchoCount;
-		UARTCharPutNonBlocking(UART_BASE, b);
+		UARTCharPutNonBlocking(GFA_UART_BASE, b);
 		++g_statCnt.nCharsTransmitted;
 		++g_statCnt.nCharsTransmitted;
 	}
 	}
 	else
 	else
 	{
 	{
-		UARTIntDisable(UART_BASE, UART_INT_TX);
-		GPIOPinWrite(EN_485_PORT, EN_485_PIN, 0); // disable the bus
+		UARTIntDisable(GFA_UART_BASE, UART_INT_TX);
+		GPIOPinWrite(GFA_EN_485_PORT, GFA_EN_485_PIN, 0); // disable the bus
 		GfaMbFifoClearFlags(g_hFifoTX, MB_RTU_FLAG_TRANSMIT_IN_PROGRESS, false);
 		GfaMbFifoClearFlags(g_hFifoTX, MB_RTU_FLAG_TRANSMIT_IN_PROGRESS, false);
 		GfaMbFifoSetFlags(g_hFifoTX, MB_RTU_FLAG_TRANSMIT_END, false);
 		GfaMbFifoSetFlags(g_hFifoTX, MB_RTU_FLAG_TRANSMIT_END, false);
 		_FrameTimerStart();
 		_FrameTimerStart();
@@ -200,8 +199,8 @@ static void _UART_FE_ISR(void)
 
 
 static void _UART_ISR(void)
 static void _UART_ISR(void)
 {
 {
-	uint32_t nStatus = UARTIntStatus(UART_BASE, true);	// Get the interrrupt status.
-    UARTIntClear(UART_BASE, nStatus);					// Clear the asserted interrupts.
+	uint32_t nStatus = UARTIntStatus(GFA_UART_BASE, true);	// Get the interrrupt status.
+    UARTIntClear(GFA_UART_BASE, nStatus);					// Clear the asserted interrupts.
 
 
     if(nStatus & UART_INT_TX)
     if(nStatus & UART_INT_TX)
     	_UART_TX_ISR();
     	_UART_TX_ISR();
@@ -223,9 +222,9 @@ static bool _EnableRxInt(bool bEnable)
 {
 {
 	bool bIsEnabled = IS_INT_ENABLED(UART_INT_RX);
 	bool bIsEnabled = IS_INT_ENABLED(UART_INT_RX);
 	if(bEnable && !bIsEnabled)
 	if(bEnable && !bIsEnabled)
-		UARTIntEnable(UART_BASE, UART_INT_RX);
+		UARTIntEnable(GFA_UART_BASE, UART_INT_RX);
 	else if(!bEnable && bIsEnabled)
 	else if(!bEnable && bIsEnabled)
-		UARTIntDisable(UART_BASE, UART_INT_RX);
+		UARTIntDisable(GFA_UART_BASE, UART_INT_RX);
 	return bIsEnabled;
 	return bIsEnabled;
 }
 }
 
 
@@ -235,9 +234,9 @@ static bool _EnableTxInt(bool bEnable)
 {
 {
 	bool bIsEnabled = IS_INT_ENABLED(UART_INT_TX);
 	bool bIsEnabled = IS_INT_ENABLED(UART_INT_TX);
 	if(bEnable && !bIsEnabled)
 	if(bEnable && !bIsEnabled)
-		UARTIntEnable(UART_BASE, UART_INT_TX);
+		UARTIntEnable(GFA_UART_BASE, UART_INT_TX);
 	else if(!bEnable && bIsEnabled)
 	else if(!bEnable && bIsEnabled)
-		UARTIntDisable(UART_BASE, UART_INT_TX);
+		UARTIntDisable(GFA_UART_BASE, UART_INT_TX);
 	return bIsEnabled;
 	return bIsEnabled;
 }
 }
 
 
@@ -352,56 +351,46 @@ bool GfaMbUartInit(LPCGFA_UART_CONFIG pCfg)
 	/////////////////////////////////////////////////////////////////////////
 	/////////////////////////////////////////////////////////////////////////
 	// UART
 	// UART
 
 
-	if(pCfg->nBaud <= 19200)
-	{
-		g_MODBUS_RTU_FRAME_TIMEOUT_US	= (350000000 / pCfg->nBaud + 5) / 10;
-		g_MODBUS_RTU_CHAR_TIMEOUT_US	= (150000000 / pCfg->nBaud + 5) / 10;
-	}
-	else
-	{
-		// For baud rates greater than 19200 the t1.5 and t3.5 timers are implemented
-		// using fixed values, for t1.5 that is 750μs, for t3.5 1.750ms
-		g_MODBUS_RTU_FRAME_TIMEOUT_US	= 1750;
-		g_MODBUS_RTU_CHAR_TIMEOUT_US	= 750;
-	}
+	if(!GfaMbCalcProtocolTimeouts(pCfg->nBaud, &g_mpt))
+		return false;
 
 
     // Enable and setup the PORT that is used for the UART
     // Enable and setup the PORT that is used for the UART
-    SysCtlPeripheralEnable(UART_PORT_SYSCTL);
-    while(!SysCtlPeripheralReady(UART_PORT_SYSCTL))
+    SysCtlPeripheralEnable(GFA_UART_PORT_SYSCTL);
+    while(!SysCtlPeripheralReady(GFA_UART_PORT_SYSCTL))
     	;
     	;
 
 
     // Enable and setup the PORT that is used for EN_485
     // Enable and setup the PORT that is used for EN_485
-    SysCtlPeripheralEnable(EN_485_PORT_SYSCTL);
-    while(!SysCtlPeripheralReady(EN_485_PORT_SYSCTL))
+    SysCtlPeripheralEnable(GFA_EN_485_PORT_SYSCTL);
+    while(!SysCtlPeripheralReady(GFA_EN_485_PORT_SYSCTL))
     	;
     	;
 
 
-    GPIOPinTypeGPIOOutput(EN_485_PORT, EN_485_PIN);
+    GPIOPinTypeGPIOOutput(GFA_EN_485_PORT, GFA_EN_485_PIN);
 
 
     // Enable the uart used for RS485 interface
     // Enable the uart used for RS485 interface
-	SysCtlPeripheralEnable(UART_BASE_SYSCTL);
-    while(!SysCtlPeripheralReady(UART_BASE_SYSCTL))
+	SysCtlPeripheralEnable(GFA_UART_BASE_SYSCTL);
+    while(!SysCtlPeripheralReady(GFA_UART_BASE_SYSCTL))
     	;
     	;
 
 
 	// Configure the UART pins
 	// Configure the UART pins
-	GPIOPinConfigure(UART_RX_PIN_MUX);
-	GPIOPinConfigure(UART_TX_PIN_MUX);
-	GPIOPinTypeUART(UART_PORT, UART_RX_PIN | UART_TX_PIN);
+	GPIOPinConfigure(GFA_UART_RX_PIN_MUX);
+	GPIOPinConfigure(GFA_UART_TX_PIN_MUX);
+	GPIOPinTypeUART(GFA_UART_PORT, GFA_UART_RX_PIN | GFA_UART_TX_PIN);
 
 
 	// Initialize the UART. Set the baud rate, number of data bits, turn off
 	// Initialize the UART. Set the baud rate, number of data bits, turn off
 	// parity, number of stop bits, and stick mode.
 	// parity, number of stop bits, and stick mode.
-	UARTConfigSetExpClk(UART_BASE, SysCtlClockGet(), pCfg->nBaud, nData | nStop | nPar);
+	UARTConfigSetExpClk(GFA_UART_BASE, SysCtlClockGet(), pCfg->nBaud, nData | nStop | nPar);
 
 
 	// transmit interrupt is asserted when the transmitter is completely idle
 	// transmit interrupt is asserted when the transmitter is completely idle
-	UARTTxIntModeSet(UART_BASE, UART_TXINT_MODE_EOT);
+	UARTTxIntModeSet(GFA_UART_BASE, UART_TXINT_MODE_EOT);
 
 
 	// Enable the UART interrupt.
 	// Enable the UART interrupt.
-	IntPrioritySet(UART_INT, MODBUS_RTU_UART_INT_PRIORITY); // priority must be lower than system tick
-	UARTIntRegister(UART_BASE, _UART_ISR);
-	UARTIntEnable(UART_BASE, (UART_INT_RX | UART_INT_OE | UART_INT_BE | UART_INT_PE | UART_INT_FE));
+	IntPrioritySet(GFA_UART_INT, GFA_UART_INT_PRIORITY); // priority must be lower than system tick
+	UARTIntRegister(GFA_UART_BASE, _UART_ISR);
+	UARTIntEnable(GFA_UART_BASE, (UART_INT_RX | UART_INT_OE | UART_INT_BE | UART_INT_PE | UART_INT_FE));
 
 
 	// Enable the UART.
 	// Enable the UART.
-	UARTEnable(UART_BASE);
-	UARTFIFODisable(UART_BASE);
+	UARTEnable(GFA_UART_BASE);
+	UARTFIFODisable(GFA_UART_BASE);
 
 
 	return true;
 	return true;
 }
 }
@@ -410,14 +399,14 @@ bool GfaMbUartInit(LPCGFA_UART_CONFIG pCfg)
 
 
 void GfaMbUartRelease(void)
 void GfaMbUartRelease(void)
 {
 {
-	UARTIntDisable(UART_BASE, UART_INT_RX | UART_INT_TX | UART_INT_OE | UART_INT_BE | UART_INT_PE | UART_INT_FE);
+	UARTIntDisable(GFA_UART_BASE, UART_INT_RX | UART_INT_TX | UART_INT_OE | UART_INT_BE | UART_INT_PE | UART_INT_FE);
 
 
-	UARTIntUnregister(UART_BASE);
-	UARTDisable(UART_BASE);
+	UARTIntUnregister(GFA_UART_BASE);
+	UARTDisable(GFA_UART_BASE);
 
 
-	SysCtlPeripheralDisable(UART_BASE_SYSCTL);
-	SysCtlPeripheralDisable(EN_485_PORT_SYSCTL);
-	SysCtlPeripheralDisable(UART_PORT_SYSCTL);
+	SysCtlPeripheralDisable(GFA_UART_BASE_SYSCTL);
+	SysCtlPeripheralDisable(GFA_EN_485_PORT_SYSCTL);
+	SysCtlPeripheralDisable(GFA_UART_PORT_SYSCTL);
 
 
 	if(g_hFifoRX)
 	if(g_hFifoRX)
 	{
 	{
@@ -448,14 +437,22 @@ HFIFO GfaMbUartGetTxFifo(void)
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
+void GfaMbUartGetProtocolTimeouts(LPGFA_MODBUS_PROTOCOL_TIMEOUTS pmpt)
+{
+	if(pmpt)
+		memcpy(pmpt, &g_mpt, sizeof(g_mpt));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 void GfaMbUartGetStatusCounters(LPGFA_UART_STATUS_COUNTERS pSc)
 void GfaMbUartGetStatusCounters(LPGFA_UART_STATUS_COUNTERS pSc)
 {
 {
 	if(pSc)
 	if(pSc)
 	{
 	{
 		uint32_t nIrMask = INT_MASK_REGISTER;
 		uint32_t nIrMask = INT_MASK_REGISTER;
-		UARTIntDisable(UART_BASE, nIrMask);
+		UARTIntDisable(GFA_UART_BASE, nIrMask);
 		memcpy(pSc, &g_statCnt, sizeof(g_statCnt));
 		memcpy(pSc, &g_statCnt, sizeof(g_statCnt));
-		UARTIntEnable(UART_BASE, nIrMask);
+		UARTIntEnable(GFA_UART_BASE, nIrMask);
 	}
 	}
 }
 }
 
 
@@ -464,9 +461,9 @@ void GfaMbUartGetStatusCounters(LPGFA_UART_STATUS_COUNTERS pSc)
 void GfaMbUartResetStatusCounters(void)
 void GfaMbUartResetStatusCounters(void)
 {
 {
 	uint32_t nIrMask = INT_MASK_REGISTER;
 	uint32_t nIrMask = INT_MASK_REGISTER;
-	UARTIntDisable(UART_BASE, nIrMask);
+	UARTIntDisable(GFA_UART_BASE, nIrMask);
 	memset(&g_statCnt, 0, sizeof(g_statCnt));
 	memset(&g_statCnt, 0, sizeof(g_statCnt));
-	UARTIntEnable(UART_BASE, nIrMask);
+	UARTIntEnable(GFA_UART_BASE, nIrMask);
 }
 }
 
 
 
 

+ 13 - 0
gfamodbusrtumst/.ccsproject

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<?ccsproject version="1.0"?>
+<projectOptions>
+	<ccsVersion value="8.3.0"/>
+	<deviceVariant value="Cortex M.TM4C1231E6PZ"/>
+	<deviceFamily value="TMS470"/>
+	<deviceEndianness value="little"/>
+	<codegenToolVersion value="18.1.6.LTS"/>
+	<isElfFormat value="true"/>
+	<createSlaveProjects value=""/>
+	<templateProperties value="id=com.ti.common.project.core.emptyProjectTemplate"/>
+	<filesToOpen value=""/>
+</projectOptions>

+ 140 - 0
gfamodbusrtumst/.cproject

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule configRelations="2" moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1933021088">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1933021088" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<macros>
+					<stringMacro name="TW_ROOT" type="VALUE_TEXT" value="C:\CCS\TivaWare_C_Series-2.1.4.178"/>
+				</macros>
+				<externalSettings/>
+				<extensions>
+					<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactExtension="lib" artifactName="gfambrtumst" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1933021088" name="Debug" parent="com.ti.ccstudio.buildDefinitions.TMS470.Debug" postbuildStep="@${PWD}\..\distribute.cmd Debug">
+					<folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Debug.1933021088." name="/" resourcePath="">
+						<toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.libraryDebugToolchain.331567958" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.libraryDebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.librarianDebug.1038042359">
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1894046541" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
+								<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.TM4C1231E6PZ"/>
+								<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
+								<listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
+								<listOptionValue builtIn="false" value="CCS_MBS_VERSION=6.1.3"/>
+								<listOptionValue builtIn="false" value="OUTPUT_TYPE=staticLibrary"/>
+							</option>
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1962630205" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="18.1.6.LTS" valueType="string"/>
+							<targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.targetPlatformDebug.1975740962" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.targetPlatformDebug"/>
+							<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.builderDebug.174692852" keepEnvironmentInBuildfile="false" name="GNU Make" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.builderDebug"/>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.compilerDebug.1965642179" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.compilerDebug">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.2042734988" name="Target processor version (--silicon_version, -mv)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.7M4" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.482449123" name="Designate code state, 16-bit (thumb) or 32-bit (--code_state)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.1625871443" name="Application binary interface. (--abi)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.eabi" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.442481879" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.FPv4SPD16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC.1804370778" name="Enable support for GCC extensions (DEPRECATED) (--gcc)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE.1684359491" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE" valueType="definedSymbols">
+									<listOptionValue builtIn="false" value="ccs=&quot;ccs&quot;"/>
+									<listOptionValue builtIn="false" value="PART_TM4C1231E6PZ"/>
+									<listOptionValue builtIn="false" value="__TI_TIME_USES_64=1"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.1722298596" name="Debugging model" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING.367610767" name="Treat diagnostic &lt;id&gt; as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING" useByScannerDiscovery="false" valueType="stringList">
+									<listOptionValue builtIn="false" value="225"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER.347105142" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.1288168864" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH.1873241501" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH" valueType="includePath">
+									<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
+									<listOptionValue builtIn="false" value="${TW_ROOT}"/>
+									<listOptionValue builtIn="false" value="${GfATivaLibsRoot}\include"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN.621832228" name="Little endian code [See 'General' page to edit] (--little_endian, -me)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS.1119505858" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS.482692335" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS.1862570647" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS.1516739744" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS"/>
+							</tool>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.librarianDebug.1038042359" name="ARM Archiver" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.librarianDebug">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.archiverID.OUTPUT_FILE.1785349873" name="Output file" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.archiverID.OUTPUT_FILE" useByScannerDiscovery="false" value="gfambrtumst.lib" valueType="string"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+		<cconfiguration id="com.ti.ccstudio.buildDefinitions.TMS470.Release.634484907">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.TMS470.Release.634484907" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<macros>
+					<stringMacro name="TW_ROOT" type="VALUE_TEXT" value="C:\CCS\TivaWare_C_Series-2.1.4.178"/>
+				</macros>
+				<externalSettings/>
+				<extensions>
+					<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactExtension="lib" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.TMS470.Release.634484907" name="Release" parent="com.ti.ccstudio.buildDefinitions.TMS470.Release">
+					<folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Release.634484907." name="/" resourcePath="">
+						<toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.ReleaseToolchain.843434354" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.ReleaseToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.librarianRelease.1209252877">
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1245564845" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
+								<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.TM4C1231E6PZ"/>
+								<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
+								<listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
+								<listOptionValue builtIn="false" value="CCS_MBS_VERSION=6.1.3"/>
+								<listOptionValue builtIn="false" value="OUTPUT_TYPE=staticLibrary"/>
+							</option>
+							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1913128287" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="18.1.6.LTS" valueType="string"/>
+							<targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.targetPlatformRelease.1430485699" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.targetPlatformRelease"/>
+							<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.builderRelease.752194306" keepEnvironmentInBuildfile="false" name="GNU Make" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.builderRelease"/>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.compilerRelease.315678278" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.compilerRelease">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.1643973749" name="Target processor version (--silicon_version, -mv)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.7M4" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.372562217" name="Designate code state, 16-bit (thumb) or 32-bit (--code_state)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.374660294" name="Application binary interface. (--abi)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.eabi" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.1107966966" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.FLOAT_SUPPORT.FPv4SPD16" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC.1277091045" name="Enable support for GCC extensions (DEPRECATED) (--gcc)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE.1318336041" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE" valueType="definedSymbols">
+									<listOptionValue builtIn="false" value="ccs=&quot;ccs&quot;"/>
+									<listOptionValue builtIn="false" value="PART_TM4C1231E6PZ"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING.130625409" name="Treat diagnostic &lt;id&gt; as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING" useByScannerDiscovery="false" valueType="stringList">
+									<listOptionValue builtIn="false" value="225"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER.2127738085" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.2062508640" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH.338482383" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH" valueType="includePath">
+									<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
+									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
+								</option>
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN.2020393681" name="Little endian code [See 'General' page to edit] (--little_endian, -me)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS.119143520" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS.1305270360" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS.1927344724" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS"/>
+								<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS.2144848075" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS"/>
+							</tool>
+							<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.librarianRelease.1209252877" name="ARM Archiver" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.library.librarianRelease">
+								<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.archiverID.OUTPUT_FILE.1813585418" name="Output file" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.archiverID.OUTPUT_FILE" useByScannerDiscovery="false" value="${ProjName}.lib" valueType="string"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="gfamodbusrtumst.com.ti.ccstudio.buildDefinitions.TMS470.ProjectType.548698569" name="TMS470" projectType="com.ti.ccstudio.buildDefinitions.TMS470.ProjectType"/>
+	</storageModule>
+	<storageModule moduleId="refreshScope"/>
+	<storageModule moduleId="scannerConfiguration"/>
+	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>

+ 1 - 0
gfamodbusrtumst/.gitignore

@@ -0,0 +1 @@
+/Debug/

+ 27 - 0
gfamodbusrtumst/.project

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>gfambtumaster</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.ti.ccstudio.core.ccsNature</nature>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 0
gfamodbusrtumst/.settings/org.eclipse.cdt.codan.core.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+inEditor=false
+onBuild=false

+ 2 - 0
gfamodbusrtumst/.settings/org.eclipse.cdt.debug.core.prefs

@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker

+ 6 - 0
gfamodbusrtumst/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//Debug/makefile=UTF-8
+encoding//Debug/objects.mk=UTF-8
+encoding//Debug/sources.mk=UTF-8
+encoding//Debug/subdir_rules.mk=UTF-8
+encoding//Debug/subdir_vars.mk=UTF-8

+ 32 - 0
gfamodbusrtumst/distribute.cmd

@@ -0,0 +1,32 @@
+@echo off
+set PRJDIR=%~dp0
+set CONFIG=%1
+set LIBMAJOR=1
+set LIBMINOR=0
+set LIBBASENAME=gfambrtumst
+set GFALIBS=%GfATivaLibsRoot%
+set LIBNAME=%LIBBASENAME%.%LIBMAJOR%.%LIBMINOR%
+set LIBDIR=%GFALIBS%\%LIBNAME%\lib\ccs\%CONFIG%
+set INCDIR=%GFALIBS%\include
+set SRCDIR=%GFALIBS%\%LIBNAME%\src
+set OUTDIR=%PRJDIR%%CONFIG%
+
+mkdir "%LIBDIR%" 1>nul 2>&1
+mkdir "%INCDIR%" 1>nul 2>&1
+mkdir "%SRCDIR%" 1>nul 2>&1
+
+copy /Y "%OUTDIR%\%LIBBASENAME%.lib" "%LIBDIR%"
+copy /Y "%PRJDIR%%LIBBASENAME%.h" "%INCDIR%"
+copy /Y "%PRJDIR%*.c" "%SRCDIR%"
+
+set PRJDIR=
+set CONFIG=
+set LIBMAJOR=
+set LIBMINOR=
+set LIBBASENAME=
+set LIBNAME=
+set GFALIBS=
+set INCDIR=
+set SRCDIR=
+set LIBDIR=
+set OUTDIR=

+ 164 - 0
gfamodbusrtumst/gfambrtumst.h

@@ -0,0 +1,164 @@
+// gfambrtumst.h :
+//
+
+#if !defined(AGD_GFAMBRTUMST_H__F97088DB_3E1B_4FC8_A313_476634890514__INCLUDED_)
+#define AGD_GFAMBRTUMST_H__F97088DB_3E1B_4FC8_A313_476634890514__INCLUDED_
+
+#include <gfautils.h>
+#include <gfambrtucom.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// mbrtumast.h - Declarations:
+
+typedef void											*HMBRTUMST;
+
+/////////////////////////////////////////////////////////////////////////////
+// error codes
+
+#define GFA_MB_MST_ERROR_INVALID_SLAVE_ID					0x0001
+#define GFA_MB_MST_ERROR_INVALID_FUNCTION					0x0002
+#define GFA_MB_MST_ERROR_SLAVE_ERROR						0x0003
+#define GFA_MB_MST_ERROR_SLAVE_RESPONSE_TIMEOUT				0x0004
+#define GFA_MB_MST_ERROR_SLAVE_CHAR_TIMEOUT					0x0005
+#define GFA_MB_MST_ERROR_SLAVE_INVALID_CRC					0x0006
+#define GFA_MB_MST_ERROR_SLAVE_INVALID_DATA					0x0007
+#define GFA_MB_MST_ERROR_UNEXPECTED							0xFFFF
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef enum _GFA_MODBUS_RTU_MST_STATES
+{
+	MB_RTU_MST_Void	= -1,
+	MB_RTU_MST_Idle,
+	MB_RTU_MST_TxStart,
+	MB_RTU_MST_TxWaitEnd,
+	MB_RTU_MST_TxDone,
+	MB_RTU_MST_WaitRxFifo,
+	MB_RTU_MST_RxSlvID,
+	MB_RTU_MST_RxFunc,
+	MB_RTU_MST_RxData,
+	MB_RTU_MST_RxError,
+	MB_RTU_MST_RxCRC,
+	MB_RTU_MST_RxFinalize,
+	MB_RTU_MST_ReportError
+}GFA_MODBUS_RTU_MST_STATES;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef void (*PFN_GFA_RAW_REQUEST_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam);
+typedef void (*PFN_GFA_READ_REGISTERS_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint16_t *pRegs, size_t nRegCount);
+typedef void (*PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE)	(uint32_t nTID, uint8_t nSlvID, uint16_t err);
+typedef void (*PFN_GFA_WRITE_REGISTERS_COMPLETE)		(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nRegStart, uint16_t nRegsWritten);
+typedef void (*PFN_GFA_DIAGNOSIS_COMPLETE)				(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nSubFunc, uint16_t nData);
+typedef void (*PFN_GFA_REPORT_SLAVE_ID_COMPLETE)		(uint32_t nTID, uint8_t nSlvID, uint16_t err, const void *pData, size_t nCbData);
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef void (*PFN_GFA_MASTER_STATE_CHANGED)			(GFA_MODBUS_RTU_MST_STATES newState, GFA_MODBUS_RTU_MST_STATES oldState);
+typedef void (*PFN_GFA_MASTER_PRE_TRANSMIT)				(uint32_t nTID, uint8_t nSlvID);
+typedef void (*PFN_GFA_MASTER_POST_TRANSMIT)			(uint32_t nTID, uint8_t nSlvID);
+typedef void (*PFN_GFA_MASTER_RECEIVE_START)			(uint32_t nTID);
+typedef void (*PFN_GFA_MASTER_RECEIVE_END)				(uint32_t nTID);
+
+typedef struct _GFA_MODBUS_MASTER_APP_INTERFACE
+{
+	PFN_GFA_MASTER_STATE_CHANGED	pfnStateChanged;
+	PFN_GFA_MASTER_PRE_TRANSMIT		pfnPreTx;
+	PFN_GFA_MASTER_POST_TRANSMIT	pfnPostTx;
+	PFN_GFA_MASTER_RECEIVE_START	pfnRxStart;
+	PFN_GFA_MASTER_RECEIVE_END		pfnRxEnd;
+}GFA_MODBUS_MASTER_APP_INTERFACE, *LPGFA_MODBUS_MASTER_APP_INTERFACE;
+typedef const GFA_MODBUS_MASTER_APP_INTERFACE *LPCGFA_MODBUS_MASTER_APP_INTERFACE;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct _GFA_MODBUS_RTU_MASTER_PARAMETERS
+{
+	HFIFO hFifoRX;
+	HFIFO hFifoTX;
+	uint64_t nRxTimeoutUs;
+	GFA_MODBUS_PROTOCOL_TIMEOUTS mpt;
+	GFA_MODBUS_MASTER_APP_INTERFACE appItf;
+}GFA_MODBUS_RTU_MASTER_PARAMETERS, *LPGFA_MODBUS_RTU_MASTER_PARAMETERS;
+typedef const GFA_MODBUS_RTU_MASTER_PARAMETERS *LPCGFA_MODBUS_RTU_MASTER_PARAMETERS;
+
+/////////////////////////////////////////////////////////////////////////////
+
+HMBRTUMST	GfaModbusRTUMstCreate(LPCGFA_MODBUS_RTU_MASTER_PARAMETERS pmap);
+void		GfaModbusRTUMstRelease(HMBRTUMST hMbMst);
+bool		GfaModbusRTUMstStateMachine(HMBRTUMST hMbMst);
+bool		GfaModbusRTUMstSendRawRequest(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nFunc, const void *pData, size_t nCbData, size_t nCbDataExpected, PFN_GFA_RAW_REQUEST_COMPLETE pfnRawReqComplete, void *pParam);
+bool		GfaModbusRTUMstReadHoldingRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete);
+bool		GfaModbusRTUMstReadInputRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete);
+bool		GfaModbusRTUMstWriteMultipleRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, const void *pRegData, PFN_GFA_WRITE_REGISTERS_COMPLETE pfnWriteRegsComplete);
+bool		GfaModbusRTUMstPresetSingleRegister(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegAddr, uint16_t nRegVal, PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE pfnPresetRegComplete);
+bool		GfaModbusRTUMstDiagnosis(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nSubFunc, uint16_t nData, PFN_GFA_DIAGNOSIS_COMPLETE pfnDiagComplete);
+bool		GfaModbusRTUMstReportSlaveID(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, size_t nCbDataExpected, PFN_GFA_REPORT_SLAVE_ID_COMPLETE pfnRepSlvIDComplete);
+
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Metronik support
+/*
+ *
+ *	ACHTUNG:
+ *	Befindet sich der Sensors am Bus mit anderen Teilnehmern führt ein Pollen der Slaves mit einem Frame-Delay < 10 ms zu Timeout-Problemen des Sensors!
+ *
+ */
+
+#define GFA_MB_ILM_FUNC_READ_UV							((uint8_t)0x41)
+#define GFA_MB_ILM_FUNC_READ_TEMP						((uint8_t)0x42)
+#define GFA_MB_ILM_FUNC_UNLOCK							((uint8_t)0x43)
+#define GFA_MB_ILM_FUNC_NEW_ADDR						((uint8_t)0x44)
+#define GFA_MB_ILM_FUNC_READ_RANGE						((uint8_t)0x45)
+#define GFA_MB_ILM_FUNC_READ_SERIAL						((uint8_t)0x46)
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef void (*PFN_GFA_ILM_READ_UV_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal);
+typedef void (*PFN_GFA_ILM_READ_TEMP_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal);
+typedef void (*PFN_GFA_ILM_READ_UNLOCK_COMPLETE)		(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal);
+typedef void (*PFN_GFA_ILM_NEW_ADDR_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal);
+typedef void (*PFN_GFA_ILM_READ_RANGE_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal);
+typedef void (*PFN_GFA_ILM_READ_SERIAL_COMPLETE)		(uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint8_t *pVal, size_t nCbVal);
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMReadUV(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete);
+bool GfaModbusRTUMstILMReadTemp(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete);
+bool GfaModbusRTUMstILMUnlock(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete);
+bool GfaModbusRTUMstILMReadRange(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete);
+bool GfaModbusRTUMstILMReadSerial(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete);
+
+/*
+ *	GfaModbusRTUMstILMNewAddr: Weist dem Sensor eine neue Slave-Adresse zu.
+ *	Achtung: Der Sensor antwortet bei Erfolg bereits mit der neuen Slave-Adresse im Antwort-Frame!!!
+ *	Der Master ruft im Anschluss die Completion-Funktion mit dem Fehlercode GFA_MB_MST_ERROR_INVALID_SLAVE_ID (1) auf!
+ *	Die neue Slave-Adresse wurde in diesem Fall aber erfolgreich im Slave gesetzt!
+ *
+ *	Achtung: Der Sensor akzeptiert die Broadcast-Adresse 0 als Slave-ID!!!! Diese sollte niemals gesetzt werden!
+ */
+bool GfaModbusRTUMstILMNewAddr(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nNewAddr, PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete);
+
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_GFAMBRTUMST_H__F97088DB_3E1B_4FC8_A313_476634890514__INCLUDED_)
+
+
+
+
+
+
+
+
+

+ 640 - 0
gfamodbusrtumst/mbrtumast.c

@@ -0,0 +1,640 @@
+#include <stdlib.h>
+#include <string.h>
+#include <gfambrtumst.h>
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define MODBUS_MASTER_RX_TIMEOUT_US							500000	// slave to master response timeout
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct _MODBUS_RTU_MASTER
+{
+	HFIFO hFifoRX;
+	HFIFO hFifoTX;
+	uint8_t curSlaveID;
+	uint8_t curFunc;
+	uint32_t nTID;
+	int nRxErr;
+	GFA_MODBUS_RTU_MST_STATES state;
+	GFA_MODBUS_RTU_MST_STATES oldstate;
+	MODBUS_RTU_ADU adu;
+	PFN_GFA_RAW_REQUEST_COMPLETE pfnRawReqComplete;
+	void *pParam;
+	size_t nCbDataExpected;
+	size_t nCbRx;
+	uint64_t nRxTimeoutUs;
+	uint64_t nTimerUs;
+	GFA_MODBUS_MASTER_APP_INTERFACE appItf;
+	GFA_MODBUS_PROTOCOL_TIMEOUTS mpt;
+}MODBUS_RTU_MASTER, *LPMODBUS_RTU_MASTER;
+typedef const MODBUS_RTU_MASTER *LPCMODBUS_RTU_MASTER;
+
+/////////////////////////////////////////////////////////////////////////////
+
+static MODBUS_RTU_MASTER		g_mbMast = {0};
+
+/////////////////////////////////////////////////////////////////////////////
+
+static bool _ValidateADU(LPMODBUS_RTU_MASTER pMst)
+{
+	if(pMst->nRxErr)
+	{
+		if(pMst->nRxErr != GFA_MB_MST_ERROR_SLAVE_ERROR)
+			return false;
+	}
+
+	if(!GfaBufVerifyCRC(&pMst->adu, pMst->nCbDataExpected + 2, &pMst->adu.pdu.b[pMst->nCbDataExpected]))
+	{
+		pMst->nRxErr = GFA_MB_MST_ERROR_SLAVE_INVALID_CRC;
+		return false;
+	}
+	return true;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static bool _TimerElapsed(LPMODBUS_RTU_MASTER pMst)
+{
+	struct timeval tv;
+	return pMst->nTimerUs < GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _RespTimerTrigger(LPMODBUS_RTU_MASTER pMst)
+{
+	struct timeval tv;
+	pMst->nTimerUs = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + pMst->nRxTimeoutUs;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _CharTimerTrigger(LPMODBUS_RTU_MASTER pMst)
+{
+	struct timeval tv;
+	pMst->nTimerUs = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + pMst->mpt.nCharTimeoutUs;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _FrameTimerTrigger(LPMODBUS_RTU_MASTER pMst)
+{
+	struct timeval tv;
+	pMst->nTimerUs = GfaSystickTimeval2Us(GfaSystickGetUsClock(&tv)) + pMst->mpt.nFrameTimeoutUs;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static bool _PeekStateChange(LPMODBUS_RTU_MASTER pMst)
+{
+	if(pMst->oldstate != pMst->state)
+	{
+		if(pMst->appItf.pfnStateChanged)
+			(*pMst->appItf.pfnStateChanged)(pMst->state, pMst->oldstate);
+		pMst->oldstate = pMst->state;
+		return true;
+	}
+	return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+HMBRTUMST GfaModbusRTUMstCreate(LPCGFA_MODBUS_RTU_MASTER_PARAMETERS pmap)
+{
+	if(!pmap || !pmap->hFifoRX || !pmap->hFifoTX)
+		return NULL;
+
+	LPMODBUS_RTU_MASTER pMst = &g_mbMast;
+	memset(pMst, 0, sizeof(MODBUS_RTU_MASTER));
+	memcpy(&pMst->mpt, &pmap->mpt, sizeof(GFA_MODBUS_PROTOCOL_TIMEOUTS));
+	memcpy(&pMst->appItf, &pmap->appItf, sizeof(GFA_MODBUS_MASTER_APP_INTERFACE));
+
+	pMst->oldstate		= MB_RTU_MST_Void;
+	pMst->hFifoRX		= pmap->hFifoRX;
+	pMst->hFifoTX		= pmap->hFifoTX;
+	pMst->nRxTimeoutUs	= pmap->nRxTimeoutUs;
+
+	return (HMBRTUMST)pMst;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaModbusRTUMstRelease(HMBRTUMST hMbMst)
+{
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstStateMachine(HMBRTUMST hMbMst)
+{
+	uint8_t b;
+	LPMODBUS_RTU_MASTER pMst = (LPMODBUS_RTU_MASTER)hMbMst;
+
+	switch(pMst->state)
+	{
+	case MB_RTU_MST_Idle:
+		_PeekStateChange(pMst);
+		break;
+
+	case MB_RTU_MST_TxStart:
+		_PeekStateChange(pMst);
+		if(	_TimerElapsed(pMst) &&
+			GfaMbFifoTxPrepare(pMst->hFifoTX, false))
+		{
+			if(pMst->appItf.pfnPreTx)
+				(*pMst->appItf.pfnPreTx)(pMst->nTID, pMst->curSlaveID);
+			GfaMbFifoClearFlags(pMst->hFifoRX, MB_RTU_FLAG_FRAME_GAP_DETECT, true);
+			GfaMbFifoSetFlags(pMst->hFifoTX, MB_RTU_FLAG_TRANSMIT_IN_PROGRESS, false);
+			GfaMbFifoTxStart(pMst->hFifoTX, true);
+			pMst->state = MB_RTU_MST_TxWaitEnd;
+			// fall through to next state
+		}
+		else
+			break;
+
+	case MB_RTU_MST_TxWaitEnd:
+		_PeekStateChange(pMst);
+		if(!GfaMbFifoMatchFlags(pMst->hFifoTX, MB_RTU_FLAG_TRANSMIT_IN_PROGRESS, true))
+		{
+			pMst->state = MB_RTU_MST_TxDone;
+			// fall through to next state
+		}
+		else
+			break;
+
+	case MB_RTU_MST_TxDone:
+		_PeekStateChange(pMst);
+		pMst->state = MB_RTU_MST_WaitRxFifo;
+		_RespTimerTrigger(pMst);
+		if(pMst->appItf.pfnPostTx)
+			(*pMst->appItf.pfnPostTx)(pMst->nTID, pMst->curSlaveID);
+		// fall through to next state
+
+	case MB_RTU_MST_WaitRxFifo:
+		_PeekStateChange(pMst);
+		if(GfaMbFifoPeek(pMst->hFifoRX, true))
+		{
+			GfaMbFifoClearFlags(pMst->hFifoRX, MB_RTU_FLAG_FRAME_GAP_DETECT, true);
+			pMst->state = MB_RTU_MST_RxSlvID;
+			if(pMst->appItf.pfnRxStart)
+				(*pMst->appItf.pfnRxStart)(pMst->nTID);
+			// fall through to next state
+		}
+		else
+		{
+			if(_TimerElapsed(pMst))
+			{
+				pMst->nRxErr	= GFA_MB_MST_ERROR_SLAVE_RESPONSE_TIMEOUT;
+				pMst->state 	= MB_RTU_MST_ReportError;
+			}
+			break;
+		}
+
+	case MB_RTU_MST_RxSlvID:
+		_PeekStateChange(pMst);
+		if(!GfaMbFifoPop(pMst->hFifoRX, &b, true))
+		{
+			pMst->nRxErr	= GFA_MB_MST_ERROR_SLAVE_RESPONSE_TIMEOUT;
+			pMst->state 	= MB_RTU_MST_ReportError;
+			break;
+		}
+		else if(pMst->curSlaveID != b)
+		{
+			GfaMbFifoSetFlags(pMst->hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, true);
+			GfaMbFifoReset(pMst->hFifoRX, true);
+			pMst->nRxErr	= GFA_MB_MST_ERROR_INVALID_SLAVE_ID;
+			pMst->state		= MB_RTU_MST_ReportError;
+			break;
+		}
+		pMst->adu.slaveID	= b;
+		pMst->state			= MB_RTU_MST_RxFunc;
+		_CharTimerTrigger(pMst);
+		// fall through to next state
+
+	case MB_RTU_MST_RxFunc:
+		_PeekStateChange(pMst);
+		if(!GfaMbFifoPop(pMst->hFifoRX, &b, true))
+		{
+			if(	GfaMbFifoMatchFlags(pMst->hFifoRX, MB_RTU_FLAG_FRAME_GAP_DETECT, true) ||
+				_TimerElapsed(pMst))
+			{
+				pMst->nRxErr	= GFA_MB_MST_ERROR_SLAVE_CHAR_TIMEOUT;
+				pMst->state		= MB_RTU_MST_ReportError;
+			}
+			break;
+		}
+		else if(b & MB_FUNC_ERROR_FLAG)
+		{
+			pMst->nRxErr		= GFA_MB_MST_ERROR_SLAVE_ERROR;
+			pMst->adu.pdu.func	= b;
+			pMst->state			= MB_RTU_MST_RxError;
+			break;
+		}
+		else if(b != pMst->curFunc)
+		{
+			pMst->nRxErr		= GFA_MB_MST_ERROR_INVALID_FUNCTION;
+			pMst->state			= MB_RTU_MST_ReportError;
+			break;
+		}
+		else
+		{
+			pMst->adu.pdu.func	= b;
+			pMst->nCbRx			= 0;
+			pMst->state			= MB_RTU_MST_RxData;
+			_CharTimerTrigger(pMst);
+			// fall through to next state
+		}
+
+	case MB_RTU_MST_RxData:
+		_PeekStateChange(pMst);
+		while(pMst->nCbRx < pMst->nCbDataExpected)
+		{
+			if(GfaMbFifoPop(pMst->hFifoRX, &b, true))
+			{
+				pMst->adu.pdu.b[pMst->nCbRx++] = b;
+				_CharTimerTrigger(pMst);
+			}
+			else
+			{
+				if(	GfaMbFifoMatchFlags(pMst->hFifoRX, MB_RTU_FLAG_FRAME_GAP_DETECT, true) ||
+					_TimerElapsed(pMst))
+				{
+					pMst->nRxErr	= GFA_MB_MST_ERROR_SLAVE_CHAR_TIMEOUT;
+					pMst->state		= MB_RTU_MST_ReportError;
+				}
+				break;
+			}
+		}
+
+		if(pMst->nCbRx == pMst->nCbDataExpected)
+		{
+			pMst->nCbRx = 0;
+			pMst->state = MB_RTU_MST_RxCRC;
+			_CharTimerTrigger(pMst);
+			// fall through to next state
+		}
+		else
+			break;
+
+	case MB_RTU_MST_RxCRC:
+		_PeekStateChange(pMst);
+		while(pMst->nCbRx < sizeof(uint16_t))
+		{
+			if(GfaMbFifoPop(pMst->hFifoRX, &b, true))
+			{
+				pMst->adu.pdu.b[pMst->nCbDataExpected + pMst->nCbRx++] = b;
+				_CharTimerTrigger(pMst);
+			}
+			else
+			{
+				if(	GfaMbFifoMatchFlags(pMst->hFifoRX, MB_RTU_FLAG_FRAME_GAP_DETECT, true) ||
+					_TimerElapsed(pMst))
+				{
+					pMst->nRxErr	= GFA_MB_MST_ERROR_SLAVE_CHAR_TIMEOUT;
+					pMst->state		= MB_RTU_MST_ReportError;
+				}
+				break;
+			}
+		}
+
+		if(pMst->nCbRx == sizeof(uint16_t))
+		{
+			pMst->nCbRx = 0;
+			pMst->state = MB_RTU_MST_RxFinalize;
+			// fall through to next state
+		}
+		else
+			break;
+
+	case MB_RTU_MST_RxFinalize:
+		_PeekStateChange(pMst);
+		_FrameTimerTrigger(pMst);
+		if(_ValidateADU(pMst))
+		{
+			if(pMst->appItf.pfnRxEnd)
+				(*pMst->appItf.pfnRxEnd)(pMst->nTID);
+			(*pMst->pfnRawReqComplete)(pMst->nTID, pMst->curSlaveID, pMst->nRxErr, &pMst->adu, pMst->nCbDataExpected, pMst->pParam);
+			pMst->state = MB_RTU_MST_Idle;
+			break;
+		}
+		pMst->state = MB_RTU_MST_ReportError;
+		break;
+
+	case MB_RTU_MST_RxError:
+		_PeekStateChange(pMst);
+		if(!GfaMbFifoPop(pMst->hFifoRX, &b, true))
+		{
+			if(	GfaMbFifoMatchFlags(pMst->hFifoRX, MB_RTU_FLAG_FRAME_GAP_DETECT, true) ||
+				_TimerElapsed(pMst))
+			{
+				pMst->nRxErr	= GFA_MB_MST_ERROR_SLAVE_CHAR_TIMEOUT;
+				pMst->state		= MB_RTU_MST_ReportError;
+			}
+			break;
+		}
+		pMst->adu.pdu.b[0]		= b;
+		pMst->nCbDataExpected	= 1;
+		pMst->state				= MB_RTU_MST_RxCRC;
+		_CharTimerTrigger(pMst);
+		break;
+
+	case MB_RTU_MST_ReportError:
+		_PeekStateChange(pMst);
+		_FrameTimerTrigger(pMst);
+		if(pMst->appItf.pfnRxEnd)
+			(*pMst->appItf.pfnRxEnd)(pMst->nTID);
+		(*pMst->pfnRawReqComplete)(pMst->nTID, pMst->curSlaveID, pMst->nRxErr, NULL, 0, pMst->pParam);
+		pMst->state = MB_RTU_MST_Idle;
+		break;
+	}
+
+	return true;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawReadRegistersComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	if(pParam)
+	{
+		PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete = (PFN_GFA_READ_REGISTERS_COMPLETE)pParam;
+		uint16_t regs[MODBUS_MAX_READ_REGISTERS];
+		const void *pRegs = NULL;
+		size_t nCntRegs = 0;
+
+		if(err)
+		{
+			if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+				err |= ((uint16_t)padu->pdu.b[0] << 8);
+		}
+		else
+		{
+			if((nCntRegs = (size_t)padu->pdu.b[0] / sizeof(uint16_t)) <= MODBUS_MAX_READ_REGISTERS)
+			{
+				GfaBufCpyUnaligned_uint16(regs, &padu->pdu.b[1], nCntRegs);
+				pRegs = regs;
+			}
+			else
+			{
+				pRegs = NULL;
+				nCntRegs = 0;
+				err = GFA_MB_MST_ERROR_SLAVE_INVALID_DATA;
+			}
+		}
+
+		(*pfnReadRegsComplete)(nTID, nSlvID, err, pRegs, nCntRegs);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawWriteRegistersComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	if(pParam)
+	{
+		PFN_GFA_WRITE_REGISTERS_COMPLETE pfnWriteRegsComplete = (PFN_GFA_WRITE_REGISTERS_COMPLETE)pParam;
+		uint16_t nStart = 0, nWritten = 0;
+
+		if(err)
+		{
+			if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+				err |= ((uint16_t)padu->pdu.b[0] << 8);
+		}
+		else
+		{
+			nStart		= GfaBufGetUnaligned_uint16(padu->pdu.b);
+			nWritten	= GfaBufGetUnaligned_uint16(&padu->pdu.b[2]);
+		}
+
+		(*pfnWriteRegsComplete)(nTID, nSlvID, err, nStart, nWritten);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawPresetSingleRegisterComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	if(pParam)
+	{
+		PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE pfnPresetRegComplete = (PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE)pParam;
+
+		if(err)
+		{
+			if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+				err |= ((uint16_t)padu->pdu.b[0] << 8);
+		}
+
+		(*pfnPresetRegComplete)(nTID, nSlvID, err);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawDiagnosisComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	if(pParam)
+	{
+		PFN_GFA_DIAGNOSIS_COMPLETE pfnDiagComplete = (PFN_GFA_DIAGNOSIS_COMPLETE)pParam;
+		uint16_t nSubFunc = 0, nData = 0;
+
+		if(err)
+		{
+			if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+				err |= ((uint16_t)padu->pdu.b[0] << 8);
+		}
+		else
+		{
+			nSubFunc	= GfaBufGetUnaligned_uint16(padu->pdu.b);
+			nData		= GfaBufGetUnaligned_uint16(&padu->pdu.b[2]);
+		}
+
+		(*pfnDiagComplete)(nTID, nSlvID, err, nSubFunc, nData);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawReportSlaveIDComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	if(pParam)
+	{
+		PFN_GFA_REPORT_SLAVE_ID_COMPLETE pfnRepSlvIDComplete = (PFN_GFA_REPORT_SLAVE_ID_COMPLETE)pParam;
+		const void *pData = NULL;
+		size_t nData = 0;
+
+		if(err)
+		{
+			if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+				err |= ((uint16_t)padu->pdu.b[0] << 8);
+		}
+		else
+		{
+			pData = &padu->pdu.b[1];
+			nData = padu->pdu.b[0];
+		}
+
+		(*pfnRepSlvIDComplete)(nTID, nSlvID, err, pData, nData);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static size_t _SubFunctionResponseLength(uint16_t nSubFunc)
+{
+	size_t nRet = 0;
+
+	switch(nSubFunc)
+	{
+	case MB_SUBFUNC_RETURN_QUERY_DATA:
+	case MB_SUBFUNC_RESTART_COMM_OPTION:
+	case MB_SUBFUNC_RETURN_DIAGNOSTIC_REGISTER:
+	case MB_SUBFUNC_CLEAR_CTRS_AND_DIAGNOSTIC_REG:
+	case MB_SUBFUNC_RETURN_BUS_MESSAGE_COUNT:
+	case MB_SUBFUNC_RETURN_BUS_COMM_ERROR_COUNT:
+	case MB_SUBFUNC_RETURN_BUS_EXCEPTION_ERROR_COUNT:
+	case MB_SUBFUNC_RETURN_SLAVE_MESSAGE_COUNT:
+	case MB_SUBFUNC_RETURN_SLAVE_NO_RESPONSE_COUNT:
+	case MB_SUBFUNC_RETURN_SLAVE_NAK_COUNT:
+	case MB_SUBFUNC_RETURN_SLAVE_BUSY_COUNT:
+	case MB_SUBFUNC_RETURN_BUS_CHAR_OVERRUN_COUNT:
+	case MB_SUBFUNC_RETURN_OVERRUN_ERROR_COUNT:
+	case MB_SUBFUNC_CLEAR_OVERRUN_COUNTER_AND_FLAG:
+		nRet = 4;
+		break;
+
+//	case MB_SUBFUNC_FORCE_LISTEN_ONLY_MODE:
+	default:
+		nRet = (size_t)-1;
+		break;
+	}
+
+	return nRet;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstSendRawRequest(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nFunc, const void *pData, size_t nCbData, size_t nCbDataExpected, PFN_GFA_RAW_REQUEST_COMPLETE pfnRawReqComplete, void *pParam)
+{
+	uint16_t nCRC;
+	LPMODBUS_RTU_MASTER pMst = (LPMODBUS_RTU_MASTER)hMbMst;
+
+	if(!pMst || nCbData > MODBUS_MAX_DATA_PAYLOAD || nCbDataExpected > MODBUS_MAX_DATA_PAYLOAD || !pfnRawReqComplete)
+		return false;
+
+	if(!nSlvID || nSlvID > MODBUS_MAX_SLAVE_ID)
+		return false;
+
+	if(pMst->state != MB_RTU_MST_Idle)
+		return false;
+
+	pMst->nTID				= nTID;
+	pMst->curSlaveID		= nSlvID;
+	pMst->curFunc			= nFunc;
+	pMst->nCbDataExpected	= nCbDataExpected;
+	pMst->pfnRawReqComplete	= pfnRawReqComplete;
+	pMst->pParam			= pParam;
+	pMst->nRxErr			= 0;
+
+	GfaMbFifoReset(pMst->hFifoTX, false);
+	GfaMbFifoReset(pMst->hFifoRX, false);
+
+	GfaMbFifoPush(pMst->hFifoTX, nSlvID, false);
+	GfaMbFifoPush(pMst->hFifoTX, nFunc, false);
+	if(pData && nCbData)
+		GfaMbFifoWrite(pMst->hFifoTX, pData, nCbData, false);
+	nCRC = GfaMbFifoCalcCRC(pMst->hFifoTX, false);
+	GfaMbFifoWrite(pMst->hFifoTX, &nCRC, sizeof(nCRC), false);
+
+	pMst->state = MB_RTU_MST_TxStart;
+	return true;
+}
+
+bool GfaModbusRTUMstReadHoldingRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete)
+{
+	uint8_t buf[4];
+	if(!pfnReadRegsComplete)
+		return false;
+	GfaBufSetUnaligned_uint16(buf, nRegStart);
+	GfaBufSetUnaligned_uint16(&buf[2], nRegCount);
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, MB_FUNC_READ_HOLDING_REGISTERS, buf, sizeof(buf), 1 + nRegCount * sizeof(uint16_t), _OnRawReadRegistersComplete, pfnReadRegsComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstReadInputRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete)
+{
+	uint8_t buf[4];
+	if(!pfnReadRegsComplete)
+		return false;
+	GfaBufSetUnaligned_uint16(buf, nRegStart);
+	GfaBufSetUnaligned_uint16(&buf[2], nRegCount);
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, MB_FUNC_READ_INPUT_REGISTERS, buf, sizeof(buf), 1 + nRegCount * sizeof(uint16_t), _OnRawReadRegistersComplete, pfnReadRegsComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstWriteMultipleRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, const void *pRegData, PFN_GFA_WRITE_REGISTERS_COMPLETE pfnWriteRegsComplete)
+{
+	uint8_t buf[MODBUS_MAX_WRITE_REGISTERS * sizeof(uint16_t)];
+	const uint8_t *pData = (const uint8_t*)pRegData;
+	size_t nCbData = 0;
+	if(!pfnWriteRegsComplete)
+		return false;
+	if(nRegCount > MODBUS_MAX_WRITE_REGISTERS)
+		return false;
+	GfaBufSetUnaligned_uint16(&buf[nCbData], nRegStart);
+	nCbData += 2;
+	GfaBufSetUnaligned_uint16(&buf[nCbData], nRegCount);
+	nCbData += 2;
+	buf[nCbData++] = (uint8_t)(nRegCount * sizeof(uint16_t));
+	GfaBufCpyUnaligned_uint16(&buf[nCbData], pData, nRegCount);
+	nCbData += nRegCount * sizeof(uint16_t);
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, MB_FUNC_WRITE_MULTIPLE_REGISTERS, buf, nCbData, 2 * sizeof(uint16_t), _OnRawWriteRegistersComplete, pfnWriteRegsComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstPresetSingleRegister(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegAddr, uint16_t nRegVal, PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE pfnPresetRegComplete)
+{
+	uint8_t buf[4];
+	if(!pfnPresetRegComplete)
+		return false;
+	GfaBufSetUnaligned_uint16(buf, nRegAddr);
+	GfaBufSetUnaligned_uint16(&buf[2], nRegVal);
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, MB_FUNC_PRESET_SINGLE_REGISTER, buf, sizeof(buf), 4, _OnRawPresetSingleRegisterComplete, pfnPresetRegComplete);
+}
+
+bool GfaModbusRTUMstDiagnosis(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nSubFunc, uint16_t nData, PFN_GFA_DIAGNOSIS_COMPLETE pfnDiagComplete)
+{
+	uint8_t buf[4];
+	if(!pfnDiagComplete)
+		return false;
+	GfaBufSetUnaligned_uint16(buf, nSubFunc);
+	GfaBufSetUnaligned_uint16(&buf[2], nData);
+	size_t nResponseLength = _SubFunctionResponseLength(nSubFunc);
+	if(nResponseLength == (size_t)-1)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, MB_FUNC_DIAGNOSTIC, buf, sizeof(buf), nResponseLength, _OnRawDiagnosisComplete, pfnDiagComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstReportSlaveID(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, size_t nCbDataExpected, PFN_GFA_REPORT_SLAVE_ID_COMPLETE pfnRepSlvIDComplete)
+{
+	if(!pfnRepSlvIDComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, MB_FUNC_REPORT_SLAVE_ID, NULL, 0, nCbDataExpected, _OnRawReportSlaveIDComplete, pfnRepSlvIDComplete);
+}
+
+
+
+
+
+

+ 200 - 0
gfamodbusrtumst/metronik.c

@@ -0,0 +1,200 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <limits.h>
+#include <gfambrtumst.h>
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawReadUvComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete = (PFN_GFA_ILM_READ_UV_COMPLETE)pParam;
+	uint16_t nData = 0;
+
+	if(err)
+	{
+		if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+			err |= ((uint16_t)padu->pdu.b[0] << 8);
+	}
+	else
+	{
+		nData = GfaBufGetUnaligned_uint16(padu->pdu.b);
+	}
+
+	(*pfnReadUvComplete)(nTID, nSlvID, err, nData);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawReadTempComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete = (PFN_GFA_ILM_READ_TEMP_COMPLETE)pParam;
+	uint8_t nData = 0;
+
+	if(err)
+	{
+		if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+			err |= ((uint16_t)padu->pdu.b[0] << 8);
+	}
+	else
+	{
+		nData = padu->pdu.b[0];
+	}
+
+	(*pfnReadTempComplete)(nTID, nSlvID, err, nData);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawUnlockComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete = (PFN_GFA_ILM_READ_UNLOCK_COMPLETE)pParam;
+	uint8_t nData = 0;
+
+	if(err)
+	{
+		if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+			err |= ((uint16_t)padu->pdu.b[0] << 8);
+	}
+	else
+	{
+		nData = padu->pdu.b[0];
+	}
+
+	(*pfnUnlockComplete)(nTID, nSlvID, err, nData);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawNewAddrComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete = (PFN_GFA_ILM_NEW_ADDR_COMPLETE)pParam;
+	uint8_t nData = 0;
+
+	if(err)
+	{
+		if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+			err |= ((uint16_t)padu->pdu.b[0] << 8);
+	}
+	else
+	{
+		nData = padu->pdu.b[0];
+	}
+
+	(*pfnNewAddrComplete)(nTID, nSlvID, err, nData);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawReadRangeComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete = (PFN_GFA_ILM_READ_RANGE_COMPLETE)pParam;
+	uint16_t nData = 0;
+
+	if(err)
+	{
+		if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+			err |= ((uint16_t)padu->pdu.b[0] << 8);
+	}
+	else
+	{
+		nData = GfaBufGetUnaligned_uint16(padu->pdu.b);
+	}
+
+	(*pfnReadRangeComplete)(nTID, nSlvID, err, nData);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static void _OnRawReadSerialComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
+{
+	PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete = (PFN_GFA_ILM_READ_SERIAL_COMPLETE)pParam;
+	const uint8_t *pData = NULL;
+	size_t nData = 0;
+
+	if(err)
+	{
+		if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
+			err |= ((uint16_t)padu->pdu.b[0] << 8);
+	}
+	else
+	{
+		pData = padu->pdu.b;
+		nData = nCbData;
+	}
+
+	(*pfnReadSerialComplete)(nTID, nSlvID, err, pData, nData);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMReadUV(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete)
+{
+	if(!pfnReadUvComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_UV, NULL, 0, sizeof(uint16_t), _OnRawReadUvComplete, pfnReadUvComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMReadTemp(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete)
+{
+	if(!pfnReadTempComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_TEMP, NULL, 0, sizeof(uint8_t), _OnRawReadTempComplete, pfnReadTempComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMUnlock(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete)
+{
+	uint8_t buf[] = {0x0C, 0x31};
+	if(!pfnUnlockComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_UNLOCK, buf, sizeof(buf), sizeof(uint8_t), _OnRawUnlockComplete, pfnUnlockComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMNewAddr(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nNewAddr, PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete)
+{
+	if(nNewAddr == MODBUS_BROADCAST_ADDRESS || nNewAddr > MODBUS_MAX_SLAVE_ID)
+		return false;
+	if(!pfnNewAddrComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_NEW_ADDR, &nNewAddr, sizeof(nNewAddr), sizeof(uint8_t), _OnRawNewAddrComplete, pfnNewAddrComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMReadRange(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete)
+{
+	if(!pfnReadRangeComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_RANGE, NULL, 0, sizeof(uint16_t), _OnRawReadRangeComplete, pfnReadRangeComplete);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool GfaModbusRTUMstILMReadSerial(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete)
+{
+	if(!pfnReadSerialComplete)
+		return false;
+	return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_SERIAL, NULL, 0, 5, _OnRawReadSerialComplete, pfnReadSerialComplete);
+}
+
+
+
+
+
+
+
+
+
+
+
+

+ 62 - 0
gfamodbusrtumst/metronik.h

@@ -0,0 +1,62 @@
+// metronik.h :
+//
+
+/*
+ *
+ *	ACHTUNG:
+ *	Befindet sich der Sensors am Bus mit anderen Teilnehmern führt ein Pollen der Slaves mit einem Frame-Delay < 10 ms zu Timeout-Problemen des Sensors!
+ *
+ */
+
+#if !defined(AGD_METRONIK_H__307066E3_A2D6_4104_A274_BC71B3798327__INCLUDED_)
+#define AGD_METRONIK_H__307066E3_A2D6_4104_A274_BC71B3798327__INCLUDED_
+
+#include <gfambrtumst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// metronik.h - Declarations:
+
+#define MB_ILM_FUNC_READ_UV							((uint8_t)0x41)
+#define MB_ILM_FUNC_READ_TEMP						((uint8_t)0x42)
+#define MB_ILM_FUNC_UNLOCK							((uint8_t)0x43)
+#define MB_ILM_FUNC_NEW_ADDR						((uint8_t)0x44)
+#define MB_ILM_FUNC_READ_RANGE						((uint8_t)0x45)
+#define MB_ILM_FUNC_READ_SERIAL						((uint8_t)0x46)
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef void (*PFN_READ_UV_COMPLETE)				(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal);
+typedef void (*PFN_READ_TEMP_COMPLETE)				(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal);
+typedef void (*PFN_READ_UNLOCK_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal);
+typedef void (*PFN_NEW_ADDR_COMPLETE)				(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal);
+typedef void (*PFN_READ_RANGE_COMPLETE)				(uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal);
+typedef void (*PFN_READ_SERIAL_COMPLETE)			(uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint8_t *pVal, size_t nCbVal);
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool ModbusRtuILMReadUV(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_READ_UV_COMPLETE pfnReadUvComplete);
+bool ModbusRtuILMReadTemp(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_READ_TEMP_COMPLETE pfnReadTempComplete);
+bool ModbusRtuILMUnlock(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_READ_UNLOCK_COMPLETE pfnUnlockComplete);
+bool ModbusRtuILMReadRange(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_READ_RANGE_COMPLETE pfnReadRangeComplete);
+bool ModbusRtuILMReadSerial(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_READ_SERIAL_COMPLETE pfnReadSerialComplete);
+
+/*
+ *	ModbusRtuILMNewAddr: Weist dem Sensor eine neue Slave-Adresse zu.
+ *	Achtung: Der Sensor antwortet bei Erfolg bereits mit der neuen Slave-Adresse im Antwort-Frame!!!
+ *	Der Master ruft im Anschluss die Completion-Funktion mit dem Fehlercode MB_MST_ERROR_INVALID_SLAVE_ID (1) auf!
+ *	Die neue Slave-Adresse wurde in diesem Fall aber erfolgreich im Slave gesetzt!
+ *
+ *	Achtung: Der Sensor akzeptiert die Broadcast-Adresse 0 als Slave-ID!!!! Diese sollte niemals gesetzt werden!
+ */
+bool ModbusRtuILMNewAddr(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nNewAddr, PFN_NEW_ADDR_COMPLETE pfnNewAddrComplete);
+
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_METRONIK_H__307066E3_A2D6_4104_A274_BC71B3798327__INCLUDED_)

+ 0 - 36
gfamodbusrtuslv/defines.h

@@ -1,36 +0,0 @@
-// defines.h :
-//
-
-#if !defined(AGD_DEFINES_H__696CD137_18F3_4D4B_BB90_9D540DD8DF8A__INCLUDED_)
-#define AGD_DEFINES_H__696CD137_18F3_4D4B_BB90_9D540DD8DF8A__INCLUDED_
-
-#ifdef __cplusplus
-extern "C" {
-#endif	//	__cplusplus
-
-/////////////////////////////////////////////////////////////////////////////
-// defines.h - Declarations:
-
-#ifndef __BYTE_ORDER__
-	#define __ORDER_LITTLE_ENDIAN__			1234
-	#define __ORDER_BIG_ENDIAN__			4321
-	#define __ORDER_PDP_ENDIAN__			3412
-
-	#if defined(__little_endian__)
-		#define __BYTE_ORDER__				__ORDER_LITTLE_ENDIAN__
-	#elif defined(__big_endian__)
-		#define __BYTE_ORDER__				__ORDER_BIG_ENDIAN__
-	#else
-		#error No endianess defined!
-	#endif	//	__LITTLE_ENDIAN__
-#endif	//	__BYTE_ORDER__
-
-/////////////////////////////////////////////////////////////////////////////
-
-#define _countof(a)							(sizeof(a) / sizeof(*a))
-
-/////////////////////////////////////////////////////////////////////////////
-#ifdef __cplusplus
-}
-#endif	//	__cplusplus
-#endif	//	!defined(AGD_DEFINES_H__696CD137_18F3_4D4B_BB90_9D540DD8DF8A__INCLUDED_)

+ 1 - 0
gfamodbusrtuslv/distribute.cmd

@@ -17,6 +17,7 @@ mkdir "%SRCDIR%" 1>nul 2>&1
 
 
 copy /Y "%OUTDIR%\%LIBBASENAME%.lib" "%LIBDIR%"
 copy /Y "%OUTDIR%\%LIBBASENAME%.lib" "%LIBDIR%"
 copy /Y "%PRJDIR%%LIBBASENAME%.h" "%INCDIR%"
 copy /Y "%PRJDIR%%LIBBASENAME%.h" "%INCDIR%"
+copy /Y "%PRJDIR%%LIBBASENAME%_priv.h" "%SRCDIR%"
 copy /Y "%PRJDIR%*.c" "%SRCDIR%"
 copy /Y "%PRJDIR%*.c" "%SRCDIR%"
 
 
 set PRJDIR=
 set PRJDIR=

+ 16 - 16
gfamodbusrtuslv/gfambrtuslv.h

@@ -37,14 +37,14 @@ typedef enum _GFA_MODBUS_RTU_SLV_STATES
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
-typedef void		(*PFN_PRE_READ_REGISTERS)	(uint8_t, uint16_t, uint16_t);
-typedef void		(*PFN_POST_READ_REGISTERS)	(uint8_t, uint16_t, uint16_t);
-typedef void		(*PFN_PRE_WRITE_REGISTERS)	(uint8_t, uint16_t, uint16_t);
-typedef void		(*PFN_POST_WRITE_REGISTERS)	(uint8_t, uint16_t, uint16_t);
-typedef void		(*PFN_PRE_TRANSMIT)			(LPMODBUS_RTU_ADU);
-typedef void		(*PFN_POST_TRANSMIT)		(LPMODBUS_RTU_ADU);
-typedef uint16_t	(*PFN_MAP_REG_ADDR)			(uint16_t);
-typedef void		(*PFN_SLAVE_STATE_CHANGED)	(GFA_MODBUS_RTU_SLV_STATES newState, GFA_MODBUS_RTU_SLV_STATES oldState);
+typedef void		(*PFN_GFA_SLAVE_PRE_READ_REGISTERS)		(uint8_t, uint16_t, uint16_t);
+typedef void		(*PFN_GFA_SLAVE_POST_READ_REGISTERS)	(uint8_t, uint16_t, uint16_t);
+typedef void		(*PFN_GFA_SLAVE_PRE_WRITE_REGISTERS)	(uint8_t, uint16_t, uint16_t);
+typedef void		(*PFN_POST_WRITE_REGISTERS)				(uint8_t, uint16_t, uint16_t);
+typedef void		(*PFN_GFA_SLAVE_PRE_TRANSMIT)			(LPMODBUS_RTU_ADU);
+typedef void		(*PFN_GFA_SLAVE_POST_TRANSMIT)			(LPMODBUS_RTU_ADU);
+typedef uint16_t	(*PFN_GFA_SLAVE_MAP_REG_ADDR)			(uint16_t);
+typedef void		(*PFN_GFA_SLAVE_STATE_CHANGED)			(GFA_MODBUS_RTU_SLV_STATES newState, GFA_MODBUS_RTU_SLV_STATES oldState);
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -59,14 +59,14 @@ typedef const GFA_MODBUS_REGISTER *LPCGFA_MODBUS_REGISTER;
 
 
 typedef struct _GFA_MODBUS_SLAVE_APP_INTERFACE
 typedef struct _GFA_MODBUS_SLAVE_APP_INTERFACE
 {
 {
-	PFN_MAP_REG_ADDR			pfnMapRegAddr;
-	PFN_PRE_READ_REGISTERS		pfnPreRead;
-	PFN_POST_READ_REGISTERS		pfnPostRead;
-	PFN_PRE_WRITE_REGISTERS		pfnPreWrite;
-	PFN_POST_WRITE_REGISTERS	pfnPostWrite;
-	PFN_PRE_TRANSMIT			pfnPreTransmit;
-	PFN_POST_TRANSMIT			pfnPostTransmit;
-	PFN_SLAVE_STATE_CHANGED		pfnStateChanged;
+	PFN_GFA_SLAVE_MAP_REG_ADDR			pfnMapRegAddr;
+	PFN_GFA_SLAVE_PRE_READ_REGISTERS	pfnPreRead;
+	PFN_GFA_SLAVE_POST_READ_REGISTERS	pfnPostRead;
+	PFN_GFA_SLAVE_PRE_WRITE_REGISTERS	pfnPreWrite;
+	PFN_POST_WRITE_REGISTERS			pfnPostWrite;
+	PFN_GFA_SLAVE_PRE_TRANSMIT			pfnPreTransmit;
+	PFN_GFA_SLAVE_POST_TRANSMIT			pfnPostTransmit;
+	PFN_GFA_SLAVE_STATE_CHANGED			pfnStateChanged;
 }GFA_MODBUS_SLAVE_APP_INTERFACE, *LPGFA_MODBUS_SLAVE_APP_INTERFACE;
 }GFA_MODBUS_SLAVE_APP_INTERFACE, *LPGFA_MODBUS_SLAVE_APP_INTERFACE;
 typedef const GFA_MODBUS_SLAVE_APP_INTERFACE *LPCGFA_MODBUS_SLAVE_APP_INTERFACE;
 typedef const GFA_MODBUS_SLAVE_APP_INTERFACE *LPCGFA_MODBUS_SLAVE_APP_INTERFACE;
 
 

+ 0 - 2
gfamodbusrtuslv/gfambrtuslv_priv.h

@@ -52,8 +52,6 @@ size_t		GfaModbusRequestGetDataInfoLength(LPCGFA_MODBUS_RTU_SLAVE pSlv);
 size_t		GfaModbusRequestGetDataPayloadLength(LPCGFA_MODBUS_RTU_SLAVE pSlv);
 size_t		GfaModbusRequestGetDataPayloadLength(LPCGFA_MODBUS_RTU_SLAVE pSlv);
 bool		GfaModbusRequestFunctionKnown(uint8_t func);
 bool		GfaModbusRequestFunctionKnown(uint8_t func);
 bool		GfaModbusRequestSubFunctionKnown(uint16_t subfunc);
 bool		GfaModbusRequestSubFunctionKnown(uint16_t subfunc);
-bool		GfaModbusRequestVerifyCRC(const void *pData, size_t nCbData, const void *pCRC);
-void		GfaModbusRequestSetCRC(const void *pData, size_t nCbData, void *pCRC);
 size_t		GfaModbusRequestReadRegisters(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten);
 size_t		GfaModbusRequestReadRegisters(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten);
 size_t		GfaModbusRequestWriteRegisters(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten);
 size_t		GfaModbusRequestWriteRegisters(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten);
 size_t		GfaModbusRequestWriteSingleRegister(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten);
 size_t		GfaModbusRequestWriteSingleRegister(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten);

+ 0 - 16
gfamodbusrtuslv/mbreq.c

@@ -106,22 +106,6 @@ bool GfaModbusRequestSubFunctionKnown(uint16_t subfunc)
 	}
 	}
 }
 }
 
 
-bool GfaModbusRequestVerifyCRC(const void *pData, size_t nCbData, const void *pCRC)
-{
-	uint16_t nCrc = Crc16(0xFFFF, (const uint8_t*)pData, nCbData);
-	const uint8_t *pCrc	= (const uint8_t*)pCRC;
-	return ((pCrc[0] == (uint8_t)(nCrc &  0xff)) &&
-			(pCrc[1] == (uint8_t)(nCrc >> 8)));
-}
-
-void GfaModbusRequestSetCRC(const void *pData, size_t nCbData, void *pCRC)
-{
-	uint16_t nCrc = Crc16(0xFFFF, (const uint8_t*)pData, nCbData);
-	uint8_t *pCrc	= (uint8_t*)pCRC;
-	pCrc[0]			= (uint8_t)(nCrc &  0xff);
-	pCrc[1]			= (uint8_t)(nCrc >> 8);
-}
-
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
 size_t GfaModbusRequestReadRegisters(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten)
 size_t GfaModbusRequestReadRegisters(uint8_t func, LPGFA_MODBUS_REGISTER pRegMap, LPGFA_MODBUS_SLAVE_APP_INTERFACE pAppItf, void *pBuf, uint8_t *pnCbWritten)

+ 6 - 4
gfamodbusrtuslv/mbrtuslv.c

@@ -23,6 +23,8 @@ static bool _PeekStateChange(LPGFA_MODBUS_RTU_SLAVE pSlv)
 	return false;
 	return false;
 }
 }
 
 
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
 HMBRTUSLV GfaModbusRTUSlvCreate(LPCGFA_MODBUS_RTU_SLAVE_PARAMETERS pslp)
 HMBRTUSLV GfaModbusRTUSlvCreate(LPCGFA_MODBUS_RTU_SLAVE_PARAMETERS pslp)
@@ -135,7 +137,7 @@ bool GfaModbusRTUSlvStateMachine(HMBRTUSLV hMbSlv)
 			GfaMbFifoSetFlags(pSlv->hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, true);
 			GfaMbFifoSetFlags(pSlv->hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, true);
 			GfaMbFifoReset(pSlv->hFifoRX, true);
 			GfaMbFifoReset(pSlv->hFifoRX, true);
 			GfaModbusRequestCreateExceptionResponse(&pSlv->adu.pdu, MB_ERROR_ILLEGAL_FUNCTION);
 			GfaModbusRequestCreateExceptionResponse(&pSlv->adu.pdu, MB_ERROR_ILLEGAL_FUNCTION);
-			GfaModbusRequestSetCRC(&pSlv->adu, 3, &pSlv->adu.pdu.b[1]);
+			GfaBufSetCRC(&pSlv->adu, 3, &pSlv->adu.pdu.b[1]);
 			pSlv->nCbToWrite = 5;
 			pSlv->nCbToWrite = 5;
 			pSlv->state	= MB_RTU_SLV_TxStart;
 			pSlv->state	= MB_RTU_SLV_TxStart;
 			++pSlv->diag.nExcErrCount;
 			++pSlv->diag.nExcErrCount;
@@ -174,7 +176,7 @@ bool GfaModbusRTUSlvStateMachine(HMBRTUSLV hMbSlv)
 					GfaMbFifoSetFlags(pSlv->hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, true);
 					GfaMbFifoSetFlags(pSlv->hFifoRX, MB_RTU_FLAG_IGNORE_FRAME, true);
 					GfaMbFifoReset(pSlv->hFifoRX, true);
 					GfaMbFifoReset(pSlv->hFifoRX, true);
 					GfaModbusRequestCreateExceptionResponse(&pSlv->adu.pdu, MB_ERROR_ILLEGAL_FUNCTION);
 					GfaModbusRequestCreateExceptionResponse(&pSlv->adu.pdu, MB_ERROR_ILLEGAL_FUNCTION);
-					GfaModbusRequestSetCRC(&pSlv->adu, 3, &pSlv->adu.pdu.b[1]);
+					GfaBufSetCRC(&pSlv->adu, 3, &pSlv->adu.pdu.b[1]);
 					pSlv->nCbToWrite = 5;
 					pSlv->nCbToWrite = 5;
 					pSlv->state	= MB_RTU_SLV_TxStart;
 					pSlv->state	= MB_RTU_SLV_TxStart;
 					++pSlv->diag.nExcErrCount;
 					++pSlv->diag.nExcErrCount;
@@ -227,7 +229,7 @@ bool GfaModbusRTUSlvStateMachine(HMBRTUSLV hMbSlv)
 			break;
 			break;
 		else
 		else
 		{
 		{
-			pSlv->bCRCOk	= GfaModbusRequestVerifyCRC(&pSlv->adu, pSlv->nDataPtr, &pSlv->adu.pdu.b[pSlv->nDataPtr - 2]);
+			pSlv->bCRCOk	= GfaBufVerifyCRC(&pSlv->adu, pSlv->nDataPtr, &pSlv->adu.pdu.b[pSlv->nDataPtr - 2]);
 			pSlv->state		= MB_RTU_SLV_RxComplete;
 			pSlv->state		= MB_RTU_SLV_RxComplete;
 			// fall through
 			// fall through
 		}
 		}
@@ -242,7 +244,7 @@ bool GfaModbusRTUSlvStateMachine(HMBRTUSLV hMbSlv)
 
 
 			if(GfaModbusRequestHandler(pSlv, &nCbData, &bIsExeption))
 			if(GfaModbusRequestHandler(pSlv, &nCbData, &bIsExeption))
 			{
 			{
-				GfaModbusRequestSetCRC(&pSlv->adu, nCbData + 2, &pSlv->adu.pdu.b[nCbData]);
+				GfaBufSetCRC(&pSlv->adu, nCbData + 2, &pSlv->adu.pdu.b[nCbData]);
 				pSlv->nCbToWrite	= nCbData + 4;
 				pSlv->nCbToWrite	= nCbData + 4;
 				pSlv->state			= MB_RTU_SLV_TxStart;
 				pSlv->state			= MB_RTU_SLV_TxStart;
 				if(bIsExeption)
 				if(bIsExeption)

Some files were not shown because too many files changed in this diff