Browse Source

init OpenV2G 0.6 public

sebastiankb 13 năm trước cách đây
mục cha
commit
07b4c11c9d
67 tập tin đã thay đổi với 31574 bổ sung108 xóa
  1. 105 105
      .cproject
  2. 1 1
      .project
  3. 4 2
      README.txt
  4. 332 0
      src/appHandshake/appHand_DataDeserialization.c
  5. 435 0
      src/appHandshake/appHand_DataSerialization.c
  6. 70 0
      src/appHandshake/appHand_dataTypes.c
  7. 130 0
      src/appHandshake/appHand_dataTypes.h
  8. 84 0
      src/appHandshake/appHand_service.h
  9. 579 0
      src/codec/AbstractDecoderChannel.c
  10. 436 0
      src/codec/AbstractEncoderChannel.c
  11. 73 0
      src/codec/BitDecoderChannel.c
  12. 88 0
      src/codec/BitEncoderChannel.c
  13. 110 0
      src/codec/BitInputStream.c
  14. 48 0
      src/codec/BitInputStream.h
  15. 118 0
      src/codec/BitOutputStream.c
  16. 52 0
      src/codec/BitOutputStream.h
  17. 93 0
      src/codec/ByteDecoderChannel.c
  18. 125 0
      src/codec/ByteEncoderChannel.c
  19. 79 0
      src/codec/ByteStream.c
  20. 48 0
      src/codec/ByteStream.h
  21. 48 0
      src/codec/CoderChannel.h
  22. 178 0
      src/codec/DecoderChannel.h
  23. 2025 0
      src/codec/EXICoder.c
  24. 65 0
      src/codec/EXICoder.h
  25. 569 0
      src/codec/EXIDecoder.c
  26. 93 0
      src/codec/EXIDecoder.h
  27. 500 0
      src/codec/EXIEncoder.c
  28. 79 0
      src/codec/EXIEncoder.h
  29. 59 0
      src/codec/EXIHeaderDecoder.c
  30. 46 0
      src/codec/EXIHeaderDecoder.h
  31. 44 0
      src/codec/EXIHeaderEncoder.c
  32. 46 0
      src/codec/EXIHeaderEncoder.h
  33. 447 0
      src/codec/EXITypes.h
  34. 180 0
      src/codec/EncoderChannel.h
  35. 106 0
      src/codec/MethodsBag.c
  36. 59 0
      src/codec/MethodsBag.h
  37. 64 0
      src/codec/NameTableEntries.c
  38. 41 0
      src/codec/NameTableEntries.h
  39. 249 0
      src/codec/StringTable.c
  40. 69 0
      src/codec/StringTable.h
  41. 66 0
      src/codec/UCSString.c
  42. 52 0
      src/codec/UCSString.h
  43. 1882 0
      src/codec/appHandCodec/appHand_EXIDecoder.c
  44. 93 0
      src/codec/appHandCodec/appHand_EXIDecoder.h
  45. 2021 0
      src/codec/appHandCodec/appHand_EXIEncoder.c
  46. 79 0
      src/codec/appHandCodec/appHand_EXIEncoder.h
  47. 60 0
      src/codec/appHandCodec/appHand_NameTableEntries.c
  48. 41 0
      src/codec/appHandCodec/appHand_NameTableEntries.h
  49. 80 0
      src/service/v2g_service.h
  50. 44 0
      src/service/v2g_serviceClientDataTransmitter.h
  51. 2665 0
      src/service/v2g_serviceClientStubs.c
  52. 268 0
      src/service/v2g_serviceClientStubs.h
  53. 7882 0
      src/service/v2g_serviceDataSerialization.c
  54. 851 0
      src/service/v2g_serviceDataTypes.c
  55. 1681 0
      src/service/v2g_serviceDataTypes.h
  56. 2551 0
      src/service/v2g_serviceDispatcher.c
  57. 43 0
      src/service/v2g_serviceDispatcher.h
  58. 87 0
      src/service/v2g_serviceMethods.h
  59. 185 0
      src/test/evse_server.c
  60. 33 0
      src/test/evse_server.h
  61. 647 0
      src/test/evse_serviceMethods.c
  62. 538 0
      src/test/main_codec.c
  63. 1504 0
      src/test/pev_service.c
  64. 49 0
      src/test/serviceClientDataTransmitter.c
  65. 44 0
      src/test/v2g_serviceClientDataTransmitter.h
  66. 97 0
      src/transport/v2gtp.c
  67. 54 0
      src/transport/v2gtp.h

+ 105 - 105
.cproject

@@ -5,59 +5,59 @@
 	<storageModule moduleId="org.eclipse.cdt.core.settings">
 		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907">
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907" moduleId="org.eclipse.cdt.core.settings" name="Debug">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
+<externalSettings/>
+<extensions>
+<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
+<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+</extensions>
+</storageModule>
 			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="OpenV2G" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.186426714" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
-							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.208578740" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
-							<builder buildPath="${workspace_loc:/OpenV2G/Debug}" id="org.eclipse.cdt.build.core.internal.builder.962624174" keepEnvironmentInBuildfile="false" name="CDT Internal Builder" superClass="org.eclipse.cdt.build.core.internal.builder"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.467817276" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1213164158" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.260408959" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.1208420490" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
-								<option id="gnu.cpp.compiler.option.optimization.level.650473997" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.debugging.level.2034188123" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.1511109002" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
-								<option id="gnu.c.compiler.option.include.paths.229245493" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/appHandshake}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec/appHandCodec}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/transport}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/service}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/test}&quot;"/>
-								</option>
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.1880660058" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.debugging.level.890071608" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.warnings.pedantic.1983095151" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="true" valueType="boolean"/>
-								<option id="gnu.c.compiler.option.misc.ansi.1916749690" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
-								<option id="gnu.c.compiler.option.warnings.toerrors.990186240" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors" value="false" valueType="boolean"/>
-								<option id="gnu.c.compiler.option.warnings.pedantic.error.145905553" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" value="true" valueType="boolean"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1904654876" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.1907160138" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base">
-								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1866282924" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.521623519" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
+<configuration artifactName="OpenV2G" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
+<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907." name="/" resourcePath="">
+<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.186426714" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
+<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.208578740" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
+<builder buildPath="${workspace_loc:/OpenV2G/Debug}" id="org.eclipse.cdt.build.core.internal.builder.135121082" keepEnvironmentInBuildfile="false" name="CDT Internal Builder" superClass="org.eclipse.cdt.build.core.internal.builder"/>
+<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.467817276" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
+<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1213164158" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.260408959" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
+<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.1208420490" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
+<option id="gnu.cpp.compiler.option.optimization.level.650473997" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+<option id="gnu.cpp.compiler.option.debugging.level.2034188123" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.1511109002" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
+<option id="gnu.c.compiler.option.include.paths.229245493" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/appHandshake}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec/appHandCodec}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/transport}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/service}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/test}&quot;"/>
+</option>
+<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.1880660058" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+<option id="gnu.c.compiler.option.debugging.level.890071608" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+<option id="gnu.c.compiler.option.warnings.pedantic.1983095151" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.misc.ansi.1916749690" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.warnings.toerrors.990186240" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors" value="false" valueType="boolean"/>
+<option id="gnu.c.compiler.option.warnings.pedantic.error.145905553" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" value="true" valueType="boolean"/>
+<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1904654876" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.1907160138" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base">
+<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1866282924" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+</inputType>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.521623519" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
+</toolChain>
+</folderInfo>
+<sourceEntries>
+<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+</sourceEntries>
+</configuration>
+</storageModule>
 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
 			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
 			<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
@@ -563,58 +563,58 @@
 		</cconfiguration>
 		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450">
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450" moduleId="org.eclipse.cdt.core.settings" name="Release">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
+<externalSettings/>
+<extensions>
+<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
+<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+</extensions>
+</storageModule>
 			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="OpenV2G" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.544862828" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
-							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.452289502" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
-							<builder buildPath="${workspace_loc:/OpenV2G/Release}" id="org.eclipse.cdt.build.core.internal.builder.1562717014" keepEnvironmentInBuildfile="false" name="CDT Internal Builder" superClass="org.eclipse.cdt.build.core.internal.builder"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.586100401" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1634756901" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.934860510" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.596457747" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
-								<option id="gnu.cpp.compiler.option.optimization.level.2131218410" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.debugging.level.1665313885" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.2107890734" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
-								<option id="gnu.c.compiler.option.include.paths.289860304" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/appHandshake}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/codec/appHandCodec}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/transport}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/service}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/test}&quot;"/>
-								</option>
-								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.899621054" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" value="gnu.c.optimization.level.most" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.debugging.level.1251127335" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.misc.ansi.496561434" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
-								<option id="gnu.c.compiler.option.warnings.pedantic.289278524" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="true" valueType="boolean"/>
-								<option id="gnu.c.compiler.option.warnings.pedantic.error.822372173" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" value="true" valueType="boolean"/>
-								<option id="gnu.c.compiler.option.optimization.flags.1051939537" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" value="-Os" valueType="string"/>
-								<option id="gnu.c.compiler.option.misc.other.1470884128" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.898314529" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.2082341498" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base">
-								<option id="gnu.c.link.option.other.71044722" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.153003457" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.557104889" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
-						</toolChain>
-					</folderInfo>
-				</configuration>
-			</storageModule>
+<configuration artifactName="OpenV2G" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
+<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450." name="/" resourcePath="">
+<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.544862828" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
+<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.452289502" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
+<builder buildPath="${workspace_loc:/OpenV2G/Release}" id="org.eclipse.cdt.build.core.internal.builder.360170814" keepEnvironmentInBuildfile="false" name="CDT Internal Builder" superClass="org.eclipse.cdt.build.core.internal.builder"/>
+<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.586100401" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
+<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1634756901" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.934860510" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
+<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.596457747" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
+<option id="gnu.cpp.compiler.option.optimization.level.2131218410" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+<option id="gnu.cpp.compiler.option.debugging.level.1665313885" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.2107890734" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
+<option id="gnu.c.compiler.option.include.paths.289860304" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/codec/appHandCodec}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/appHandshake}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/transport}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/service}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/test}&quot;"/>
+</option>
+<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.899621054" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" value="gnu.c.optimization.level.most" valueType="enumerated"/>
+<option id="gnu.c.compiler.option.debugging.level.1251127335" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+<option id="gnu.c.compiler.option.misc.ansi.496561434" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.warnings.pedantic.289278524" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.warnings.pedantic.error.822372173" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.optimization.flags.1051939537" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" value="-Os" valueType="string"/>
+<option id="gnu.c.compiler.option.misc.other.1470884128" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0" valueType="string"/>
+<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.898314529" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.2082341498" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base">
+<option id="gnu.c.link.option.other.71044722" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/>
+<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.153003457" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+</inputType>
+</tool>
+<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.557104889" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
+</toolChain>
+</folderInfo>
+</configuration>
+</storageModule>
 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
 			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
 			<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
@@ -1120,6 +1120,6 @@
 		</cconfiguration>
 	</storageModule>
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-		<project id="OpenV2G.cdt.managedbuild.target.gnu.mingw.exe.1420366407" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
-	</storageModule>
+<project id="OpenV2G.cdt.managedbuild.target.gnu.mingw.exe.1420366407" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
+</storageModule>
 </cproject>

+ 1 - 1
.project

@@ -27,7 +27,7 @@
 				</dictionary>
 				<dictionary>
 					<key>org.eclipse.cdt.make.core.buildLocation</key>
-					<value>${workspace_loc:/OpenV2G/Release}</value>
+					<value>${workspace_loc:/OpenV2G/Debug}</value>
 				</dictionary>
 				<dictionary>
 					<key>org.eclipse.cdt.make.core.contents</key>

+ 4 - 2
README.txt

@@ -1,6 +1,6 @@
 -------------------------------------------------------------------------
 OpenV2G - an open source project implementing the basic functionality of the ISO IEC 15118 vehicle to grid (V2G) communication interface 
-Version 0.6, released January 31, 2012
+Version 0.6, released April 2, 2012
 http://openv2g.sourceforge.net/
 
 Please report bugs via the SourceForge bug tracking system at http://sourceforge.net/tracker/?group_id=350113.
@@ -29,11 +29,13 @@ CHANGES from version 0.5:
 * adaption of V2G schema changes
 * application handshake protocol implementation 
 * asynchronised communication
+* reduced memory usage
+* changed V2GTP byte order from little endian to big endian
+* bug-fixes
 * updated AC demo interaction between EV and EVSE, and
 * updated DC demo interaction between EV and EVSE
 
 
-
 -------------------------------------------------------------------------
 CHANGES from version 0.4:
 -------------------------------------------------------------------------

+ 332 - 0
src/appHandshake/appHand_DataDeserialization.c

@@ -0,0 +1,332 @@
+
+
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+ 
+ #include "appHand_service.h"
+ #include "appHand_dataTypes.h"
+ #include "EXITypes.h"
+ #include "appHand_EXIDecoder.h"
+ #include "StringTable.h"
+ #include <string.h>
+ 
+
+static int _setUnsignedInt32Value(integer_t* iv, uint32_t* int32) {
+	int errn = 0;
+	switch(iv->type) {
+	/* Unsigned Integer */
+	case EXI_UNSIGNED_INTEGER_8:
+		*int32 = iv->val.uint8;
+		break;
+	case EXI_UNSIGNED_INTEGER_16:
+		*int32 = iv->val.uint16;
+		break;
+	case EXI_UNSIGNED_INTEGER_32:
+		if (iv->val.uint32 <= 2147483647) {
+			*int32 = iv->val.uint32;
+		} else {
+			errn = -1;
+		}
+		break;
+	case EXI_UNSIGNED_INTEGER_64:
+		errn = -1;
+		break;
+	/* (Signed) Integer */
+	case EXI_INTEGER_8:
+		*int32 = iv->val.int8;
+		break;
+	case EXI_INTEGER_16:
+		*int32 = iv->val.int16;
+		break;
+	case EXI_INTEGER_32:
+		*int32 = iv->val.int32;
+		break;
+	case EXI_INTEGER_64:
+		errn = -1;
+	}
+	return errn;
+}
+ 
+
+
+
+
+
+ /**
+ * Deserialize an element or attribute value of the EXI stream and assign it to the
+ * service data structure 
+ */
+static int deserializeElementAttributeCharacter(struct EXIDatabinder* service)
+{
+
+	switch(service->eqn.namespaceURI) {
+		case 0:
+			switch(service->eqn.localPart) {
+				case 2: /*ProtocolNamespace*/
+
+				if(service->val.type == EXI_DATATYPE_STRING)
+					{
+						memcpy(service->exiMsg.supportedAppProtocolReq->AppProtocol[service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol].ProtocolNamespace.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.supportedAppProtocolReq->AppProtocol[service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol].ProtocolNamespace.arraylen.data = service->val.string.len;
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+		
+
+				break;
+				case 5: /*VersionNumberMajor*/
+
+				if(service->val.type == EXI_DATATYPE_UNSIGNED_INTEGER)
+					{
+						_setUnsignedInt32Value( &(service->val.integer),&(service->exiMsg.supportedAppProtocolReq->AppProtocol[service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol].VersionNumberMajor));
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+		
+
+				break;
+				case 6: /*VersionNumberMinor*/
+
+				if(service->val.type == EXI_DATATYPE_UNSIGNED_INTEGER)
+					{
+						_setUnsignedInt32Value( &(service->val.integer),&(service->exiMsg.supportedAppProtocolReq->AppProtocol[service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol].VersionNumberMinor));
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+		
+
+				break;
+				case 4: /*SchemaID*/
+
+				if(service->val.type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER)
+					{
+						if( service->idPath.id[0] == 7)
+						{
+							service->exiMsg.supportedAppProtocolRes->SchemaID = service->val.integer.val.uint8;
+						service->exiMsg.supportedAppProtocolRes->isused.SchemaID=1;
+
+						} else if(service->idPath.id[0] == 6)
+						{
+							service->exiMsg.supportedAppProtocolReq->AppProtocol[service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol].SchemaID = service->val.integer.val.uint8;
+						}
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+		
+
+				break;
+				case 1: /*Priority*/
+
+				if(service->val.type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER)
+					{
+						service->exiMsg.supportedAppProtocolReq->AppProtocol[service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol].Priority = service->val.integer.val.uint8;
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+		
+
+				break;
+				case 3: /*ResponseCode*/
+
+				if(service->val.type == EXI_DATATYPE_ENUMERATION)
+					{
+						service->exiMsg.supportedAppProtocolRes->ResponseCode = service->val.enumeration;
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+		
+
+				break;	
+			} /* close switch(service->eqn.localPart) */	
+		break;
+	
+	} /* close switch(service->eqn.namespaceURI) */
+	return 0;
+}
+ 
+/**
+ * Deserialize an element of the EXI stream
+ * @return 0 = 0K; -1 = ERROR
+ */
+static int deserializeElement(struct EXIDatabinder* service)
+{
+	switch(service->eqn.namespaceURI) {
+		case 0:
+			switch(service->eqn.localPart) {
+				case 0:/* AppProtocol */	
+
+								service->exiMsg.supportedAppProtocolReq->arraylen.AppProtocol++;
+		  
+				break;	
+
+			}
+		break;
+		case 4:
+			switch(service->eqn.localPart) {
+				case 6:/* supportedAppProtocolReq */	
+
+								service->exiMsg.isused.supportedAppProtocolReq=1;
+		  
+				break;	
+				case 7:/* supportedAppProtocolRes */	
+
+								service->exiMsg.isused.supportedAppProtocolRes=1;
+		  
+				break;	
+
+			}
+		break;
+		
+
+	}
+	return 0;
+}
+
+
+ 
+ 
+/**
+* Deserialize the EXI stream
+* @return 0 = 0K; -1 = ERROR
+*/
+int deserialize_appHand(struct EXIDatabinder* service, uint8_t* inStream, uint16_t sizeInStream, struct EXIDocumentType_appHand* exiDoc)
+{
+ 	exi_name_table_runtime_t runtimeTableDecode;
+ 	uint32_t inPos;
+ 	int noEndOfDocument = 1; /* true */
+	int returnCode=0;
+	
+
+	/* assign inStream data to service EXI structure */
+	inPos = service->transportHeaderOffset;
+	service->inStream.data = inStream;
+	service->inStream.size = sizeInStream+inPos;
+	service->inStream.pos = &inPos;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+
+
+	service->exiMsg=*exiDoc;
+
+	exiInitNameTableRuntime(&runtimeTableDecode);
+	exiappHandInitDecoder(&(service->inStream), &(service->stateDecode), runtimeTableDecode);
+
+	do {
+		exiappHandDecodeNextEvent(&(service->inStream), &(service->stateDecode), &(service->event));
+			if (returnCode < 0) {
+				printf("[ERROR] %d \n", returnCode);
+				return returnCode;
+			}
+
+			switch (service->event) {
+			case EXI_EVENT_START_DOCUMENT:
+
+				returnCode = exiappHandDecodeStartDocument(&(service->inStream), &(service->stateDecode));
+
+				break;
+			case EXI_EVENT_END_DOCUMENT:
+
+				returnCode = exiappHandDecodeEndDocument(&(service->inStream), &(service->stateDecode));
+				noEndOfDocument = 0; /* false */
+				break;
+			case EXI_EVENT_START_ELEMENT:
+				returnCode = exiappHandDecodeStartElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				service->idPath.id[service->idPath.pos++]=service->eqn.localPart;
+				 
+				break;
+			case EXI_EVENT_END_ELEMENT:
+
+				returnCode = exiappHandDecodeEndElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				service->idPath.pos--;
+				 
+				returnCode = deserializeElement(service);
+				break;
+			case EXI_EVENT_CHARACTERS:
+				/* decode */
+				returnCode = exiappHandDecodeCharacters(&(service->inStream), &(service->stateDecode), &(service->val));
+				 
+				/* assign character data to the v2g message structure */
+				returnCode = deserializeElementAttributeCharacter(service);
+				break;
+			case EXI_EVENT_ATTRIBUTE:
+				/* decode */
+				returnCode = exiappHandDecodeAttribute(&(service->inStream), &(service->stateDecode), &(service->eqn), &(service->val));
+				returnCode = deserializeElementAttributeCharacter(service);
+				break;
+			default:
+				/* ERROR */
+				return -1;
+			}
+
+		} while (noEndOfDocument);
+
+	return 0;
+}
+ 
+ 
+ 
+/* Initialize the deserializer */
+int init_appHandDeserializer(struct EXIDatabinder* service, bytes_t bytes, string_ucs_t string, uint16_t transportHeaderOffset)
+{
+
+	/* init byte array */
+	 service->val.binary = bytes;
+
+	/* init string array */
+	 service->val.string = string;
+
+
+	 service->idPath.pos=0;
+
+	 /* init offset for transport protocol */
+	service->transportHeaderOffset=transportHeaderOffset;
+
+
+	return 0;
+}
+
+

+ 435 - 0
src/appHandshake/appHand_DataSerialization.c

@@ -0,0 +1,435 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+#include "appHand_service.h"
+#include "appHand_dataTypes.h"
+
+
+#include "appHand_dataTypes.h"
+#include "StringTable.h"
+#include "EXITypes.h"
+#include "appHand_EXIEncoder.h"
+#include <string.h>
+ 
+ 
+ 
+ 
+
+static int serialize_AppProtocolType(struct AppProtocolType* type, struct EXIDatabinder* service)
+{
+	
+			/* element ID assignment of ProtocolNamespace*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+
+			/* encode start element ProtocolNamespace */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ProtocolNamespace.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ProtocolNamespace.data,type->ProtocolNamespace.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ProtocolNamespace */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ProtocolNamespace */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of VersionNumberMajor*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=5;	
+
+
+			/* encode start element VersionNumberMajor */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->VersionNumberMajor;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  VersionNumberMajor */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of VersionNumberMajor */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of VersionNumberMinor*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=6;	
+
+
+			/* encode start element VersionNumberMinor */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->VersionNumberMinor;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  VersionNumberMinor */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of VersionNumberMinor */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of SchemaID*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=4;	
+
+
+			/* encode start element SchemaID */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.uint8=type->SchemaID;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_8;
+			
+			/* encode character  SchemaID */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SchemaID */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of Priority*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=1;	
+
+
+			/* encode start element Priority */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.uint8=type->Priority;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_8;
+			
+			/* encode character  Priority */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of Priority */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_AnonType_supportedAppProtocolReq(struct AnonType_supportedAppProtocolReq* type, struct EXIDatabinder* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.AppProtocol;i_loop++)
+		{
+			
+			/* element ID assignment of AppProtocol*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=0;	
+
+
+			/* encode start element AppProtocol */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			/* encode children of AppProtocol */
+			if(serialize_AppProtocolType(&(type->AppProtocol[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of AppProtocol */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_AnonType_supportedAppProtocolRes(struct AnonType_supportedAppProtocolRes* type, struct EXIDatabinder* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=3;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SchemaID)
+		{		
+					
+			/* element ID assignment of SchemaID*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=4;	
+
+
+			/* encode start element SchemaID */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.uint8=type->SchemaID;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_8;
+			
+			/* encode character  SchemaID */	
+			if (exiappHandEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SchemaID */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_EXIDocumentType(struct EXIDocumentType_appHand* type, struct EXIDatabinder* service)
+{
+
+	if(type->isused.supportedAppProtocolReq)
+		{		
+					
+			/* element ID assignment of supportedAppProtocolReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=6;	
+
+
+			/* encode start element supportedAppProtocolReq */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+						
+			/* encode children of supportedAppProtocolReq */
+			if(serialize_AnonType_supportedAppProtocolReq( (type->supportedAppProtocolReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of supportedAppProtocolReq */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+			return 0;
+
+		}
+				
+	if(type->isused.supportedAppProtocolRes)
+		{		
+					
+			/* element ID assignment of supportedAppProtocolRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;	
+
+
+			/* encode start element supportedAppProtocolRes */	
+			if (exiappHandEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+						
+			/* encode children of supportedAppProtocolRes */
+			if(serialize_AnonType_supportedAppProtocolRes( (type->supportedAppProtocolRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of supportedAppProtocolRes */
+			exiappHandEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+ 
+ 
+ 
+ 
+ 
+ /* marshal data to EXI stream */
+static int serialize_message(struct EXIDatabinder* service)
+ {
+	
+
+	/* encode start document */ 	
+	if (exiappHandEncodeStartDocument(&(service->outStream), &(service->stateEncode)) )
+	{
+	 
+		return -1;
+	}
+
+	/* encode root element of null */
+	if (serialize_EXIDocumentType(&(service->exiMsg), service)) 
+	{
+			 
+		return -1;
+	}
+
+
+	/* encode end document */
+	if (exiappHandEncodeEndDocument(&(service->outStream), &(service->stateEncode))) {
+	 
+	return -1;
+	}	
+ 	
+ 	return 0;
+ 	
+ }
+
+ 
+ 
+int serialize_appHand(struct EXIDatabinder* service, uint8_t* outStream, uint16_t* payloadLength, struct EXIDocumentType_appHand* exiDoc)
+{
+ 	exi_name_table_runtime_t runtimeTableEncode;
+	uint32_t outPos;
+ 
+	outPos=service->transportHeaderOffset;
+
+ 	/* assign outStream data to service EXI structure */
+	service->outStream.data = outStream;
+	service->outStream.pos = &outPos;
+	service->outStream.buffer=0;
+	service->outStream.capacity=8;
+ 
+  	service->exiMsg = *exiDoc;
+ 
+	/* init encoder (write header, set initial state) */
+	exiInitNameTableRuntime(&runtimeTableEncode);
+	exiappHandInitEncoder(&(service->outStream), &(service->stateEncode), runtimeTableEncode);
+
+	if(serialize_message(service))
+		return -1;
+
+	outPos -= service->transportHeaderOffset;
+	*payloadLength = outPos;
+
+ 	return 0;
+ }
+ 
+/* Initialize serializer */
+int init_appHandSerializer(struct EXIDatabinder* service, bytes_t bytes, string_ucs_t string, size_t max_outStream_size, uint16_t transportHeaderOffset)
+{
+
+	/* init byte array */
+	 service->val.binary = bytes;
+
+	/* init string array */
+	 service->val.string = string;
+
+	 /* init output stream */
+
+	 service->outStream.size=max_outStream_size;
+
+	 service->transportHeaderOffset=transportHeaderOffset;
+
+	return 0;
+}
+ 
+ 

+ 70 - 0
src/appHandshake/appHand_dataTypes.c

@@ -0,0 +1,70 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+#include "EXITypes.h"
+#include "appHand_dataTypes.h"
+
+
+static  void init_protocolNamespaceType(struct protocolNamespaceType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_AppProtocolType(struct AppProtocolType* type)
+{	
+	init_protocolNamespaceType(&(type->ProtocolNamespace));				
+
+}
+
+void init_AnonType_supportedAppProtocolReq(struct AnonType_supportedAppProtocolReq* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<20;i_loop++)
+	{
+		init_AppProtocolType(&(type->AppProtocol[i_loop]));
+	}
+	
+	type->arraylen.AppProtocol=0;
+
+}
+
+ void init_AnonType_supportedAppProtocolRes(struct AnonType_supportedAppProtocolRes* type)
+{			
+	type->isused.SchemaID=0;
+
+}
+
+void init_EXIDocumentType_appHand(struct EXIDocumentType_appHand* type)
+{		
+	type->isused.supportedAppProtocolReq=0;		
+	type->isused.supportedAppProtocolRes=0;
+
+}

+ 130 - 0
src/appHandshake/appHand_dataTypes.h

@@ -0,0 +1,130 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef APPHANDDATATYPES_H
+#define APPHANDDATATYPES_H
+
+#include "EXITypes.h"
+
+
+	
+
+enum responseCodeType_appHand
+{
+	OK_SuccessfulNegotiation_responseCodeType, 
+	OK_SuccessfulNegotiationWithMinorDeviation_responseCodeType, 
+	Failed_NoNegotiation_responseCodeType
+
+}; 
+
+
+
+
+struct arraylen_protocolNamespaceType
+{
+	size_t data;
+
+
+};
+
+struct protocolNamespaceType
+{
+	uint32_t data[100];
+	struct arraylen_protocolNamespaceType arraylen;
+
+};
+
+struct AppProtocolType
+{
+	struct protocolNamespaceType ProtocolNamespace;
+	uint32_t VersionNumberMajor;
+	uint32_t VersionNumberMinor;
+	uint8_t SchemaID;
+	uint8_t Priority;
+
+
+};
+
+struct arraylen_AnonType_supportedAppProtocolReq
+{
+	size_t AppProtocol;
+
+
+};
+
+struct AnonType_supportedAppProtocolReq
+{
+	struct AppProtocolType AppProtocol[20];
+	struct arraylen_AnonType_supportedAppProtocolReq arraylen;
+
+};
+
+struct selection_EXIDocumentType
+{
+	unsigned int supportedAppProtocolReq:1;
+	unsigned int supportedAppProtocolRes:1;
+
+
+};
+
+struct selection_AnonType_supportedAppProtocolRes
+{
+	unsigned int SchemaID:1;
+
+
+};
+
+struct AnonType_supportedAppProtocolRes
+{
+	enum responseCodeType_appHand ResponseCode;
+	uint8_t SchemaID;
+	struct selection_AnonType_supportedAppProtocolRes isused;
+
+};
+
+struct EXIDocumentType_appHand
+{
+	struct AnonType_supportedAppProtocolReq* supportedAppProtocolReq;
+	struct AnonType_supportedAppProtocolRes* supportedAppProtocolRes;
+	struct selection_EXIDocumentType isused;
+
+};
+
+void init_EXIDocumentType_appHand(struct EXIDocumentType_appHand* type);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 84 - 0
src/appHandshake/appHand_service.h

@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2007-2010 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI_DATABINDER_H_
+#define EXI_DATABINDER_H_
+
+#include "appHand_dataTypes.h"
+
+struct uniqueIDPath2
+{
+	int id[10];
+	size_t pos;
+};
+
+
+struct EXIDatabinder
+{
+	/* in-/ out-stream */
+	bitstream_t inStream;
+	bitstream_t outStream;
+
+	/* EXI */
+	exi_state_t stateDecode;
+	exi_state_t stateEncode;
+	exi_event_t event;
+	eqname_t eqn;
+	exi_value_t val;
+
+	/* main message data structure */
+	struct EXIDocumentType_appHand exiMsg;
+
+	/* unique id for ambiguous elements */
+	struct uniqueIDPath2 idPath;
+
+	uint16_t transportHeaderOffset;
+
+	/* error code */
+	uint8_t errorCode;
+};
+
+int serialize_appHand(struct EXIDatabinder* service, uint8_t* outStream, uint16_t* outPos, struct EXIDocumentType_appHand* exiDoc);
+int deserialize_appHand(struct EXIDatabinder* service, uint8_t* inStream, uint16_t sizeInStream, struct EXIDocumentType_appHand* exiDoc);
+int init_appHandSerializer(struct EXIDatabinder* service, bytes_t bytes, string_ucs_t string, size_t max_outStream_size, uint16_t transportHeaderOffset);
+int init_appHandDeserializer(struct EXIDatabinder* service, bytes_t bytes, string_ucs_t string, uint16_t transportHeaderOffset);
+
+
+
+/* define error codes (TODO: define precise error codes) */
+#define EXI_NON_VALID_MESSAGE 0x01
+#define EXI_SERIALIZATION_FAILED 0x02
+
+#define EXI_UNKNOWN_ERROR 0xFF
+
+#endif /* EXI_DATABINDER_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 579 - 0
src/codec/AbstractDecoderChannel.c

@@ -0,0 +1,579 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "DecoderChannel.h"
+#include "CoderChannel.h"
+#include "BitInputStream.h"
+#include "EXITypes.h"
+
+#ifndef ABSTRACT_DECODER_CHANNEL_C
+#define ABSTRACT_DECODER_CHANNEL_C
+
+/* unsigned long == 64 bits, 10 * 7bits = 70 bits */
+#define MAX_OCTETS_FOR_UNSIGNED_INTEGER_64 10
+/* unsigned int == 32 bits, 5 * 7bits = 35 bits */
+#define MAX_OCTETS_FOR_UNSIGNED_INTEGER_32 5
+
+/* buffer for reading (arbitrary) large integer values */
+static unsigned int maskedOctets[MAX_OCTETS_FOR_UNSIGNED_INTEGER_64];
+
+
+static int _decodeUnsignedInteger(bitstream_t* stream, integer_t* iv, int negative) {
+	int errn = 0;
+	int i, k;
+	uint8_t b;
+
+	for (i = 0; i < MAX_OCTETS_FOR_UNSIGNED_INTEGER_64; i++) {
+		/* Read the next octet */
+		errn = decode(stream, &b);
+		/* If the most significant bit of the octet was 1,
+		   another octet is going to come */
+		if (b < 128) {
+			/* no more octets */
+
+			/* For negative values, the Unsigned Integer holds the
+			 * magnitude of the value minus 1 */
+
+			switch(i) {
+			case 0: /* 7 bits */
+				if (negative) {
+					iv->val.int8 =  - ( b + 1);
+					iv->type = EXI_INTEGER_8;
+				} else {
+					iv->val.uint8 = b;
+					iv->type = EXI_UNSIGNED_INTEGER_8;
+				}
+				return 0;
+			case 1: /* 14 bits */
+				maskedOctets[i] = b;
+				iv->val.uint16 = 0;
+				for (k = i; k >= 0 ; k--) {
+					iv->val.uint16  = (iv->val.uint16 << 7) | maskedOctets[k];
+				}
+				if (negative) {
+					iv->val.int16 = - ( iv->val.uint16 + 1 );
+					iv->type = EXI_INTEGER_16;
+				} else {
+					iv->type = EXI_UNSIGNED_INTEGER_16;
+				}
+				return 0;
+			case 2: /* 21 bits */
+			case 3: /* 28 bits */
+				maskedOctets[i] = b;
+				iv->val.uint32 = 0;
+				for (k = i; k >= 0 ; k--) {
+					iv->val.uint32 = (iv->val.uint32 << 7) | maskedOctets[k];
+				}
+				if (negative) {
+					iv->val.int32 = - ( iv->val.uint32 + 1 );
+					if (iv->val.int32 <= INT16_MAX && iv->val.int32 >= INT16_MIN ) {
+						iv->type = EXI_INTEGER_16;
+					} else {
+						iv->type = EXI_INTEGER_32;
+					}
+				} else {
+					if (iv->val.uint32 <= UINT16_MAX) {
+						iv->type = EXI_UNSIGNED_INTEGER_16;
+					} else {
+						iv->type = EXI_UNSIGNED_INTEGER_32;
+					}
+				}
+				return 0;
+			case 4: /* 35 bits */
+			case 5: /* 42 bits */
+			case 6: /* 49 bits */
+			case 7: /* 56 bits */
+			case 8: /* 63 bits */
+			case 9: /* 70 bits */
+				maskedOctets[i] = b;
+				iv->val.uint64 = 0;
+				for (k = i; k >= 0 ; k--) {
+					iv->val.uint64  = (iv->val.uint64 << 7) | maskedOctets[k];
+				}
+				if (negative) {
+					if (i > 8) {
+						/* too large */
+						return EXI_UNSUPPORTED_INTEGER_VALUE;
+					}
+					iv->val.int64 = - ( iv->val.uint64 + 1 );
+					if (iv->val.int64 <= INT32_MAX && iv->val.int64 >= INT32_MIN ) {
+						iv->type = EXI_INTEGER_32;
+					} else {
+						iv->type = EXI_INTEGER_64;
+					}
+				} else {
+					if (iv->val.uint64 <= UINT32_MAX) {
+						iv->type = EXI_UNSIGNED_INTEGER_32;
+						/* iv->val.uint32 = iv->val.uint64;*/
+					} else {
+						iv->type = EXI_UNSIGNED_INTEGER_64;
+					}
+				}
+				return 0;
+			default:
+				return EXI_UNSUPPORTED_INTEGER_VALUE;
+			}
+		} else {
+			/* the 7 least significant bits hold the actual value */
+			maskedOctets[i] = (b & 127);
+		}
+	}
+
+
+	return EXI_UNSUPPORTED_INTEGER_VALUE;
+}
+
+int decodeUnsignedInteger(bitstream_t* stream, integer_t* iv) {
+	return _decodeUnsignedInteger(stream, iv, 0);
+}
+
+int decodeUnsignedInteger16(bitstream_t* stream, uint16_t* uint16) {
+	unsigned int mShift = 0;
+	int errn = 0;
+	uint8_t b;
+	*uint16 = 0;
+
+	do {
+		/* 1. Read the next octet */
+		errn = decode(stream, &b);
+		/* 2. Multiply the value of the unsigned number represented by the 7
+		 * least significant
+		 * bits of the octet by the current multiplier and add the result to
+		 * the current value */
+		*uint16 += (b & 127) << mShift;
+		/* 3. Multiply the multiplier by 128 */
+		mShift += 7;
+		/* 4. If the most significant bit of the octet was 1, go back to step 1 */
+	} while (errn >= 0 && (b >> 7) == 1);
+
+	return errn;
+}
+
+int decodeUnsignedInteger32(bitstream_t* stream, uint32_t* uint32) {
+	/* 0XXXXXXX ... 1XXXXXXX 1XXXXXXX */
+	unsigned int mShift = 0;
+	int errn = 0;
+	uint8_t b;
+	*uint32 = 0;
+
+	do {
+		/* 1. Read the next octet */
+		errn = decode(stream, &b);
+		/* 2. Multiply the value of the unsigned number represented by the 7
+		 * least significant
+		 * bits of the octet by the current multiplier and add the result to
+		 * the current value */
+		*uint32 += (b & 127) << mShift;
+		/* 3. Multiply the multiplier by 128 */
+		mShift += 7;
+		/* 4. If the most significant bit of the octet was 1, go back to step 1 */
+	} while (errn >= 0 && (b >> 7) == 1);
+
+	return errn;
+}
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedInteger64(bitstream_t* stream, uint64_t* uint64) {
+	unsigned int mShift = 0;
+	int errn = 0;
+	uint8_t b;
+	*uint64 = 0L;
+
+	do {
+		errn = decode(stream, &b);
+		*uint64 += ((uint64_t) (b & 127)) << mShift;
+		mShift += 7;
+	} while (errn >= 0 && (b >> 7) == 1);
+
+	return errn;
+}
+
+
+int decodeInteger(bitstream_t* stream, integer_t* iv) {
+	int b;
+	int errn = decodeBoolean(stream, &b);
+	if (errn < 0) {
+		return errn;
+	}
+
+	return _decodeUnsignedInteger(stream, iv, b);
+}
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeInteger32(bitstream_t* stream, int32_t* int32) {
+	int b;
+	uint32_t uint32;
+	int errn = decodeBoolean(stream, &b);
+
+	if (errn < 0) {
+		return errn;
+	}
+
+	if (b) {
+		/* For negative values, the Unsigned Integer holds the
+		 * magnitude of the value minus 1 */
+		errn = decodeUnsignedInteger32(stream, &uint32);
+		*int32 = -(uint32 + 1);
+	} else {
+		/* positive */
+		errn = decodeUnsignedInteger32(stream, &uint32);
+		*int32 = (int32_t)(uint32);
+	}
+
+	return errn;
+}
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeInteger64(bitstream_t* stream, int64_t* int64) {
+	int b;
+	uint64_t uint64;
+	int errn = decodeBoolean(stream, &b);
+
+	if (errn < 0) {
+		return errn;
+	}
+
+	if (b) {
+		/* For negative values, the Unsigned Integer holds the
+		 * magnitude of the value minus 1 */
+		errn = decodeUnsignedInteger64(stream, &uint64);
+		*int64 = -(uint64 + 1);
+	} else {
+		/* positive */
+		errn = decodeUnsignedInteger64(stream, &uint64);
+		*int64 = (int64_t)(uint64);
+	}
+
+	return errn;
+}
+
+/**
+ * Decode a Float datatype as two consecutive Integers.
+ * The first Integer represents the mantissa of the floating point
+ * number and the second Integer represents the base-10 exponent
+ * of the floating point number.
+ */
+int decodeFloat(bitstream_t* stream, float_me_t* f) {
+	int errn = decodeInteger64(stream, &f->mantissa);
+	if (errn < 0) {
+		return errn;
+	}
+	return decodeInteger32(stream, &f->exponent);
+}
+
+/**
+ * Decode a decimal represented as a Boolean sign followed by two Unsigned
+ * Integers. A sign value of zero (0) is used to represent positive Decimal
+ * values and a sign value of one (1) is used to represent negative Decimal
+ * values The first Integer represents the integral portion of the Decimal
+ * value. The second positive integer represents the fractional portion of
+ * the decimal with the digits in reverse order to preserve leading zeros.
+ */
+int decodeDecimal(bitstream_t* stream, decimal_t* d) {
+	int errn = decodeBoolean(stream, &d->negative);
+	if (errn < 0) {
+		return errn;
+	}
+	errn = decodeUnsignedInteger(stream, &d->integral);
+	if (errn < 0) {
+		return errn;
+	}
+	errn = decodeUnsignedInteger(stream, &d->reverseFraction);
+
+	return errn;
+}
+
+/**
+ * Decode a sequence of characters for a given length.
+ */
+int decodeStringOnly(bitstream_t* stream, uint16_t len, string_ucs_t* s) {
+	if (len > s->size) {
+		/* not enough space */
+		return EXI_ERROR_OUT_OF_STRING_BUFFER;
+	}
+	decodeCharacters(stream, len, s->codepoints);
+	s->len = len;
+	return 0;
+}
+
+/**
+ * Decode a length prefixed sequence of characters.
+ */
+int decodeString(bitstream_t* stream, string_ucs_t* s) {
+	int errn = decodeUnsignedInteger16(stream, &s->len);
+	if (errn < 0) {
+		return errn;
+	}
+	return decodeStringOnly(stream, s->len, s);
+}
+
+int decodeStringASCII(bitstream_t* stream, string_ascii_t* s) {
+	uint16_t slen;
+	int errn = decodeUnsignedInteger16(stream, &slen);
+	if (errn < 0) {
+		return errn;
+	}
+	if (s->size < slen) {
+		return EXI_ERROR_OUT_OF_ASCII_BUFFER;
+	}
+
+	return decodeCharactersASCII(stream, slen, s->chars);
+
+}
+
+int decodeStringValue(bitstream_t* stream, string_ucs_t* s) {
+	int errn = decodeUnsignedInteger16(stream, &s->len);
+	if (errn < 0) {
+		return errn;
+	}
+
+	switch (s->len) {
+	case 0:
+		/* local value partition */
+		return EXI_UNSUPPORTED_STRING_TABLE_LOCAL_HIT;
+	case 1:
+		/* found in global value partition */
+		return EXI_UNSUPPORTED_STRING_TABLE_GLOBAL_HIT;
+	default:
+		/* not found in global value (and local value) partition
+		 * ==> string literal is encoded as a String with the length
+		 * incremented by two */
+		return decodeStringOnly(stream, ((s->len) - 2), s);
+		/* After encoding the string value, it is added to both the
+		 * associated "local" value string table partition and the global
+		 * value string table partition */
+		/* addValue(context, value); */
+	}
+}
+
+int decodeRCSStringValue(bitstream_t* stream, rcs_t* rcs, string_ucs_t* s) {
+	unsigned int i;
+	uint32_t cp;
+	int errn = decodeUnsignedInteger16(stream, &s->len);
+	if (errn < 0) {
+		return errn;
+	}
+
+	switch (s->len) {
+	case 0:
+		/* local value partition */
+		return EXI_UNSUPPORTED_STRING_TABLE_LOCAL_HIT;
+	case 1:
+		/* found in global value partition */
+		return EXI_UNSUPPORTED_STRING_TABLE_GLOBAL_HIT;
+	default:
+		/* not found in global value (and local value) partition
+		 * ==> string literal is encoded as a String with the length
+		 * incremented by two */
+		s->len = s->len - 2;
+
+		if (s->len > s->size) {
+			/* not enough space */
+			return EXI_ERROR_OUT_OF_STRING_BUFFER;
+		}
+
+		for (i = 0; i < s->len && errn >= 0; i++) {
+			errn = decodeNBitUnsignedInteger(stream, rcs->codingLength, &cp);
+			if (errn < 0) {
+				return errn;
+			}
+			s->codepoints[i] = rcs->codepoints[cp];
+		}
+		/* After encoding the string value, it is added to both the
+		 * associated "local" value string table partition and the global
+		 * value string table partition */
+		/* addValue(context, value); */
+		return 0;
+	}
+}
+
+/**
+ * Decode a sequence of characters according to a given length.
+ * Each character is represented by its UCS [ISO/IEC 10646]
+ * code point encoded as an Unsigned Integer
+ */
+int decodeCharacters(bitstream_t* stream, uint16_t len, uint32_t* chars) {
+	unsigned int i;
+	int errn = 0;
+	for (i = 0; i < len && errn >= 0; i++) {
+		errn = decodeUnsignedInteger32(stream, &chars[i]);
+		if (errn < 0) {
+			return errn;
+		}
+	}
+
+	return errn;
+}
+int decodeCharactersASCII(bitstream_t* stream, uint16_t len, char* chars) {
+	unsigned int i;
+	uint32_t c;
+	int errn = 0;
+	for (i = 0; i < len && errn >= 0; i++) {
+		errn = decodeUnsignedInteger32(stream, &c);
+		if (errn < 0) {
+			return errn;
+		}
+		if (c > 127) {
+			return EXI_ERROR_CONVERSION_NO_ASCII_CHARACTERS;
+		}
+		chars[i] = c;
+	}
+	chars[i] = '\0';
+
+	return errn;
+}
+
+
+/**
+ * Decode a binary value as a length-prefixed sequence of octets.
+ */
+int decodeBinary(bitstream_t* stream, bytes_t* bytes) {
+	unsigned int i;
+	uint8_t b;
+	int errn = decodeUnsignedInteger16(stream, &bytes->len);
+	if (errn < 0) {
+		return errn;
+	}
+	if (bytes->len > bytes->size) {
+		/* not enough space */
+		return EXI_ERROR_OUT_OF_BYTE_BUFFER;
+	}
+
+	for (i = 0; i < bytes->len && errn >= 0; i++) {
+		errn = decode(stream, &b);
+		if (errn < 0) {
+			return errn;
+		}
+		bytes->data[i] = (uint8_t)b;
+	}
+
+	return errn;
+}
+
+/**
+ * Decode Date-Time as sequence of values representing the individual
+ * components of the Date-Time.
+ */
+int decodeDateTime(bitstream_t* stream, exi_datetime_type_t type, datetime_t* datetime){
+	int errn;
+
+	datetime->type = type;
+
+	datetime->year = 0;
+	datetime->monthDay = 0;
+	datetime->time = 0;
+	datetime->presenceFractionalSecs = 0;
+	datetime->fractionalSecs = 0;
+	datetime->presenceTimezone = 0;
+	datetime->timezone = 0;
+
+	switch (type) {
+	case EXI_DATETIME_GYEAR: /* Year, [Time-Zone] */
+		errn = decodeInteger32(stream, &datetime->year);
+		if (errn < 0) {
+			return errn;
+		}
+		datetime->year += DATETIME_YEAR_OFFSET;
+		break;
+	case EXI_DATETIME_GYEARMONTH: /* Year, MonthDay, [TimeZone] */
+	case EXI_DATETIME_DATE:
+		errn = decodeInteger32(stream, &datetime->year);
+		if (errn < 0) {
+			return errn;
+		}
+		datetime->year += DATETIME_YEAR_OFFSET;
+		errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay);
+		break;
+	case EXI_DATETIME_DATETIME: /* Year, MonthDay, Time, [FractionalSecs], [TimeZone] */
+		/* e.g. "0001-01-01T00:00:00.111+00:33"  */
+		errn = decodeInteger32(stream, &datetime->year);
+		if (errn < 0) {
+			return errn;
+		}
+		datetime->year += DATETIME_YEAR_OFFSET;
+		errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay);
+		if (errn < 0) {
+			return errn;
+		}
+		/* Note: *no* break  */
+	case EXI_DATETIME_TIME: /* Time, [FractionalSecs], [TimeZone] */
+		/* e.g. "12:34:56.135"  */
+		errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIME, &datetime->time);
+		if (errn < 0) {
+			return errn;
+		}
+		errn = decodeBoolean(stream, &datetime->presenceFractionalSecs);
+		if (errn < 0) {
+			return errn;
+		}
+		if (datetime->presenceFractionalSecs) {
+			errn = decodeUnsignedInteger32(stream, &datetime->fractionalSecs);
+		}
+		break;
+	case EXI_DATETIME_GMONTH: /* MonthDay, [TimeZone] */
+		/* e.g. "--12" */
+	case EXI_DATETIME_GMONTHDAY: /* MonthDay, [TimeZone] */
+		/* e.g. "--01-28"  */
+	case EXI_DATETIME_GDAY: /* MonthDay, [TimeZone] */
+		/* "---16"  */
+		errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay );
+		break;
+	default:
+		return -1;
+	}
+
+	errn = decodeBoolean(stream, &datetime->presenceTimezone );
+	if (errn < 0) {
+		return errn;
+	}
+	if (datetime->presenceTimezone) {
+		errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIMEZONE, &datetime->timezone);
+		datetime->timezone -= DATETIME_TIMEZONE_OFFSET_IN_MINUTES;
+	}
+
+	return errn;
+}
+
+#endif
+

+ 436 - 0
src/codec/AbstractEncoderChannel.c

@@ -0,0 +1,436 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EncoderChannel.h"
+#include "CoderChannel.h"
+#include "BitOutputStream.h"
+#include "EXITypes.h"
+#include "MethodsBag.h"
+
+#ifndef ABSTRACT_ENCODER_CHANNEL_C
+#define ABSTRACT_ENCODER_CHANNEL_C
+
+
+int encodeUnsignedInteger(bitstream_t* stream, integer_t* iv) {
+	int errn = 0;
+	switch(iv->type) {
+	/* Unsigned Integer */
+	case EXI_UNSIGNED_INTEGER_8:
+		errn = encodeUnsignedInteger32(stream, iv->val.uint8);
+		break;
+	case EXI_UNSIGNED_INTEGER_16:
+		errn = encodeUnsignedInteger32(stream, iv->val.uint16);
+		break;
+	case EXI_UNSIGNED_INTEGER_32:
+		errn = encodeUnsignedInteger32(stream, iv->val.uint32);
+		break;
+	case EXI_UNSIGNED_INTEGER_64:
+		errn = encodeUnsignedInteger64(stream, iv->val.uint64);
+		break;
+	/* (Signed) Integer */
+	case EXI_INTEGER_8:
+		if (iv->val.int8 < 0) {
+			return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
+		}
+		errn = encodeUnsignedInteger32(stream, iv->val.int8);
+		break;
+	case EXI_INTEGER_16:
+		if (iv->val.int16 < 0) {
+			return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
+		}
+		errn = encodeUnsignedInteger32(stream, iv->val.int16);
+		break;
+	case EXI_INTEGER_32:
+		if (iv->val.int32 < 0) {
+			return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
+		}
+		errn = encodeUnsignedInteger32(stream, iv->val.int32);
+		break;
+	case EXI_INTEGER_64:
+		if (iv->val.int64 < 0) {
+			return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
+		}
+		errn = encodeUnsignedInteger64(stream, iv->val.int64);
+		break;
+	default:
+		errn = EXI_UNSUPPORTED_INTEGER_VALUE_TYPE;
+	}
+
+	return errn;
+}
+
+/**
+ * Encode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int encodeUnsignedInteger32(bitstream_t* stream, uint32_t n) {
+	int errn = 0;
+	if (n < 128) {
+		/* write byte as is */
+		errn = encode(stream, (uint8_t) n);
+	} else {
+		uint8_t n7BitBlocks = numberOf7BitBlocksToRepresent(n);
+
+		switch (n7BitBlocks) {
+		case 5:
+			errn = encode(stream, (uint8_t) (128 | n));
+			n = n >> 7;
+			if (errn < 0) {
+				break;
+			}
+		case 4:
+			errn = encode(stream, (uint8_t) (128 | n));
+			n = n >> 7;
+			if (errn < 0) {
+				break;
+			}
+		case 3:
+			errn = encode(stream, (uint8_t) (128 | n));
+			n = n >> 7;
+			if (errn < 0) {
+				break;
+			}
+		case 2:
+			errn = encode(stream, (uint8_t) (128 | n));
+			n = n >> 7;
+			if (errn < 0) {
+				break;
+			}
+		case 1:
+			/* 0 .. 7 (last byte) */
+			errn = encode(stream, (uint8_t) (0 | n));
+		}
+	}
+
+	return errn;
+}
+
+/**
+ * Encode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int encodeUnsignedInteger64(bitstream_t* stream, uint64_t n) {
+	int errn = 0;
+	uint8_t lastEncode = (uint8_t) n;
+	n >>= 7;
+
+	while (n != 0) {
+		errn = encode(stream, lastEncode | 128);
+		if (errn < 0) {
+			return errn;
+		}
+		lastEncode = (uint8_t) n;
+		n >>= 7;
+	}
+
+	return encode(stream, lastEncode);
+}
+
+
+int encodeInteger(bitstream_t* stream, integer_t* iv) {
+	int errn = 0;
+	switch(iv->type) {
+	/* Unsigned Integer */
+	case EXI_UNSIGNED_INTEGER_8:
+		errn = encodeInteger32(stream, iv->val.uint8);
+		break;
+	case EXI_UNSIGNED_INTEGER_16:
+		errn = encodeInteger32(stream, iv->val.uint16);
+		break;
+	case EXI_UNSIGNED_INTEGER_32:
+		errn = encodeInteger64(stream, iv->val.uint32);
+		break;
+	case EXI_UNSIGNED_INTEGER_64:
+		errn = encodeInteger64(stream, iv->val.uint64);
+		break;
+	/* (Signed) Integer */
+	case EXI_INTEGER_8:
+		errn = encodeInteger32(stream, iv->val.int8);
+		break;
+	case EXI_INTEGER_16:
+		errn = encodeInteger32(stream, iv->val.int16);
+		break;
+	case EXI_INTEGER_32:
+		errn = encodeInteger32(stream, iv->val.int32);
+		break;
+	case EXI_INTEGER_64:
+		errn = encodeInteger64(stream, iv->val.int64);
+		break;
+	default:
+		errn = EXI_UNSUPPORTED_INTEGER_VALUE_TYPE;
+	}
+
+	return errn;
+}
+
+
+/**
+ * Encode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int encodeInteger32(bitstream_t* stream, int32_t n) {
+	int errn;
+	/* signalize sign */
+	if (n < 0) {
+		errn = encodeBoolean(stream, 1);
+		/* For negative values, the Unsigned Integer holds the
+		 * magnitude of the value minus 1 */
+		n = (-n) - 1;
+	} else {
+		errn = encodeBoolean(stream, 0);
+	}
+	if (errn < 0) {
+		return errn;
+	}
+	return encodeUnsignedInteger32(stream, n);
+}
+
+/**
+ * Encode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int encodeInteger64(bitstream_t* stream, int64_t n) {
+	int errn;
+	/* signalize sign */
+	if (n < 0) {
+		errn = encodeBoolean(stream, 1);
+		/* For negative values, the Unsigned Integer holds the
+		 * magnitude of the value minus 1 */
+		n = (-n) - 1;
+	} else {
+		errn = encodeBoolean(stream, 0);
+	}
+	if (errn < 0) {
+		return errn;
+	}
+	return encodeUnsignedInteger64(stream, n);
+}
+
+/**
+ * The Float datatype representation is two consecutive Integers.
+ * The first Integer represents the mantissa of the floating point
+ * number and the second Integer represents the base-10 exponent
+ * of the floating point number.
+ */
+int encodeFloat(bitstream_t* stream, float_me_t* f) {
+	int errn = encodeInteger64(stream, f->mantissa);
+	if (errn >= 0) {
+		errn = encodeInteger32(stream, f->exponent);
+	}
+	return errn;
+}
+
+/**
+ * Encode a decimal represented as a Boolean sign followed by two Unsigned
+ * Integers. A sign value of zero (0) is used to represent positive Decimal
+ * values and a sign value of one (1) is used to represent negative Decimal
+ * values The first Integer represents the integral portion of the Decimal
+ * value. The second positive integer represents the fractional portion of
+ * the decimal with the digits in reverse order to preserve leading zeros.
+ */
+int encodeDecimal(bitstream_t* stream, decimal_t* d) {
+	/* sign, integral, reverse fractional */
+	int errn = encodeBoolean(stream, d->negative);
+	if (errn < 0) {
+		return errn;
+	}
+	errn = encodeUnsignedInteger(stream, &d->integral);
+	if (errn < 0) {
+		return errn;
+	}
+	errn = encodeUnsignedInteger(stream, &d->reverseFraction);
+
+	return errn;
+}
+
+
+/**
+ * Encode a length prefixed sequence of characters.
+ */
+int encodeASCII(bitstream_t* stream, const char* ascii) {
+	int errn;
+	uint32_t slen = (uint32_t) strlen(ascii);
+	errn = encodeUnsignedInteger32(stream, slen);
+	if (errn >= 0) {
+		errn = encodeASCIICharacters(stream, ascii, slen);
+	}
+	return errn;
+}
+
+int encodeString(bitstream_t* stream, string_ucs_t* string) {
+	int errn = encodeUnsignedInteger32(stream, string->len);
+	if (errn >= 0) {
+		errn = encodeUCSCharacters(stream, string->codepoints, string->len);
+	}
+	return errn;
+}
+
+int encodeStringValue(bitstream_t* stream, string_ucs_t* string) {
+	/* encode string as string table miss */
+	int errn = encodeUnsignedInteger32(stream, string->len + 2);
+	if (errn >= 0) {
+		errn = encodeUCSCharacters(stream, string->codepoints, string->len);
+	}
+	return errn;
+}
+
+
+int encodeRCSStringValue(bitstream_t* stream, rcs_t* rcs, string_ucs_t* string) {
+	unsigned int i;
+	uint32_t k;
+	/* encode string as string table miss */
+	int errn = encodeUnsignedInteger32(stream, string->len + 2);
+	if (errn >= 0) {
+		for (i = 0; i < string->len && errn >= 0; i++) {
+			for (k = 0; k < rcs->size && errn >= 0; k++) {
+				if (rcs->codepoints[k] == string->codepoints[i]) {
+					errn = encodeNBitUnsignedInteger(stream, rcs->codingLength, k);
+					break; /* break inner for loop */
+				}
+			}
+		}
+	}
+	return errn;
+}
+
+/**
+ * Encode a sequence of characters according to a given length.
+ * Each character is represented by its UCS [ISO/IEC 10646]
+ * code point encoded as an Unsigned Integer
+ */
+int encodeUCSCharacters(bitstream_t* stream, uint32_t* chars, uint16_t len) {
+	unsigned int i;
+	int errn = 0;
+	for (i = 0; i < len && errn >= 0; i++) {
+		errn = encodeUnsignedInteger32(stream, chars[i]);
+	}
+	return errn;
+}
+
+int encodeASCIICharacters(bitstream_t* stream, const char* chars, uint16_t len) {
+	unsigned int i;
+	int errn = 0;
+	for (i = 0; i < len && errn >= 0; i++) {
+		errn = encode(stream, chars[i]);
+	}
+	return errn;
+}
+
+/**
+ * Encode a binary value as a length-prefixed sequence of octets.
+ */
+int encodeBinary(bitstream_t* stream, bytes_t* bytes) {
+	unsigned int i;
+	int errn = encodeUnsignedInteger32(stream, bytes->len);
+
+	for (i = 0; i < bytes->len && errn >= 0; i++) {
+		errn = encode(stream, bytes->data[i]);
+	}
+	return errn;
+}
+
+/**
+ * Encode a datetime representation which is a sequence of values
+ * representing the individual components of the Date-Time
+ */
+int encodeDateTime(bitstream_t* stream, datetime_t* datetime) {
+	int errn = 0;
+	switch (datetime->type) {
+	case EXI_DATETIME_GYEAR: /* Year, [Time-Zone] */
+		errn = encodeInteger32(stream, datetime->year - DATETIME_YEAR_OFFSET);
+		break;
+	case EXI_DATETIME_GYEARMONTH: /* Year, MonthDay, [TimeZone] */
+	case EXI_DATETIME_DATE: /* Year, MonthDay, [TimeZone] */
+		errn = encodeInteger32(stream, datetime->year - DATETIME_YEAR_OFFSET);
+		if (errn < 0) {
+			return errn;
+		}
+		errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, datetime->monthDay);
+		break;
+	case EXI_DATETIME_DATETIME: /* Year, MonthDay, Time, [FractionalSecs], [TimeZone] */
+		errn = encodeInteger32(stream, datetime->year - DATETIME_YEAR_OFFSET);
+		if (errn < 0) {
+			return errn;
+		}
+		errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, datetime->monthDay);
+		if (errn < 0) {
+			return errn;
+		}
+		/* Note: *no* break */
+	case EXI_DATETIME_TIME: /* Time, [FractionalSecs], [TimeZone] */
+		errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIME, datetime->time);
+		if (errn < 0) {
+			return errn;
+		}
+		if (datetime->presenceFractionalSecs) {
+			encodeBoolean(stream, 1);
+			if (errn < 0) {
+				return errn;
+			}
+			encodeUnsignedInteger32(stream, datetime->fractionalSecs);
+		} else {
+			encodeBoolean(stream, 0);
+		}
+		break;
+	case EXI_DATETIME_GMONTH: /* MonthDay, [TimeZone] */
+	case EXI_DATETIME_GMONTHDAY: /* MonthDay, [TimeZone] */
+	case EXI_DATETIME_GDAY: /* MonthDay, [TimeZone] */
+		errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, datetime->monthDay);
+		break;
+	default:
+		return EXI_ERROR_UNEXPECTED_DATETIME_TYPE;
+	}
+	if (errn < 0) {
+		return errn;
+	}
+	/* [TimeZone] */
+	if (datetime->presenceTimezone) {
+		errn = encodeBoolean(stream, 1);
+		if (errn < 0) {
+			return errn;
+		}
+		encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIMEZONE, datetime->timezone
+				+ DATETIME_TIMEZONE_OFFSET_IN_MINUTES);
+	} else {
+		encodeBoolean(stream, 0);
+	}
+
+	return errn;
+}
+
+#endif
+

+ 73 - 0
src/codec/BitDecoderChannel.c

@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "DecoderChannel.h"
+#include "BitInputStream.h"
+#include "EXITypes.h"
+
+#ifndef BIT_DECODER_CHANNEL_C
+#define BIT_DECODER_CHANNEL_C
+
+
+#if EXI_ALIGNMENT == BIT_PACKED
+
+int decode(bitstream_t* stream, uint8_t* b) {
+	uint32_t bb;
+	int errn =  readBits(stream, 8, &bb);
+	if (errn < 0) {
+		return errn;
+	}
+	if (bb > 256) {
+		return EXI_ERROR_UNEXPECTED_BYTE_VALUE;
+	} else {
+		*b = (uint8_t)bb;
+	}
+	return errn;
+}
+
+int decodeBoolean(bitstream_t* stream, int* b) {
+	uint32_t ub;
+	int errn = readBits(stream, 1, &ub);
+	*b = (ub == 0) ? 0 : 1;
+	return errn;
+}
+
+int decodeNBitUnsignedInteger(bitstream_t* stream, uint16_t nbits, uint32_t* uint32) {
+	if (nbits == 0) {
+		*uint32 = 0;
+		return 0;
+	} else {
+		return readBits(stream, nbits, uint32);
+	}
+}
+
+#endif
+
+#endif
+

+ 88 - 0
src/codec/BitEncoderChannel.c

@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EncoderChannel.h"
+#include "CoderChannel.h"
+#include "BitOutputStream.h"
+#include "EXITypes.h"
+
+#ifndef BIT_ENCODER_CHANNEL_C
+#define BIT_ENCODER_CHANNEL_C
+
+#if EXI_ALIGNMENT == BIT_PACKED
+
+
+int encode(bitstream_t* stream, uint8_t b) {
+	return writeBits(stream, 8, b);
+}
+
+/**
+ * Encode a single boolean value. A false value is encoded as bit 0 and true
+ * value is encode as bit 1.
+ */
+int encodeBoolean(bitstream_t* stream, int b) {
+	uint8_t val = b ? 1 : 0;
+	return writeBits(stream, 1, val);
+}
+
+
+/**
+ * Encode n-bit unsigned integer. The n least significant bits of parameter
+ * b starting with the most significant, i.e. from left to right.
+ */
+int encodeNBitUnsignedInteger(bitstream_t* stream, uint16_t nbits, uint32_t val)  {
+	if (nbits > 0) {
+		return writeBits(stream, nbits, val);
+	}
+	return 0;
+}
+
+/**
+ * Flush underlying bit output stream.
+ */
+int encodeFinish(bitstream_t* stream) {
+	return flush(stream);
+}
+
+
+#endif /* alignment */
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+

+ 110 - 0
src/codec/BitInputStream.c

@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EXITypes.h"
+#include "BitInputStream.h"
+
+#ifndef BIT_INPUT_STREAM_C
+#define BIT_INPUT_STREAM_C
+
+/* internal method to (re)fill buffer */
+int readBuffer(bitstream_t* stream)
+{
+	int errn = 0;
+	if(stream->capacity==0)
+	{
+#if EXI_STREAM == BYTE_ARRAY
+		if ( (*stream->pos) < stream->size ) {
+			stream->buffer = stream->data[(*stream->pos)++];
+			stream->capacity = BITS_IN_BYTE;
+		} else {
+			errn = EXI_ERROR_INPUT_STREAM_EOF;
+		}
+#endif
+#if EXI_STREAM == FILE_STREAM
+		stream->buffer = getc(stream->file);
+		/* EOF cannot be used, 0xFF valid value */
+		if ( feof(stream->file) || ferror(stream->file) ) {
+			return EXI_ERROR_INPUT_STREAM_EOF;
+		}
+		stream->capacity = BITS_IN_BYTE;
+#endif
+	}
+	return errn;
+}
+
+int readBits(bitstream_t* stream, uint16_t num_bits, uint32_t* b)
+{
+	int errn = readBuffer(stream);
+	if (errn < 0) {
+		return errn;
+	}
+
+	/* read the bits in one step */
+	if(num_bits <= stream->capacity)
+	{
+		stream->capacity -= num_bits;
+		*b = (stream->buffer >> stream->capacity) & (0xff >> (BITS_IN_BYTE - num_bits));
+	}
+	else
+	{
+		/* read bits as much as possible */
+		*b = stream->buffer & (0xff >> (BITS_IN_BYTE - stream->capacity));
+		num_bits -= stream->capacity;
+		stream->capacity = 0;
+
+		/* read whole bytes */
+		while(num_bits >= 8)
+		{
+			errn = readBuffer(stream);
+			if (errn < 0) {
+				return errn;
+			}
+			*b = ((*b) << BITS_IN_BYTE) | stream->buffer;
+			num_bits -= BITS_IN_BYTE;
+			stream->capacity = 0;
+		}
+
+		/* read the spare bits in the buffer */
+		if(num_bits>0)
+		{
+			errn = readBuffer(stream);
+			if (errn < 0) {
+				return errn;
+			}
+			*b = ((*b) << num_bits) | (stream->buffer >> (BITS_IN_BYTE - num_bits));
+			stream->capacity = BITS_IN_BYTE - num_bits;
+		}
+		
+	}
+
+	return errn;
+}
+
+#endif

+ 48 - 0
src/codec/BitInputStream.h

@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+#ifndef BIT_INPUT_STREAM_H
+#define BIT_INPUT_STREAM_H
+
+int readBits(bitstream_t* stream, uint16_t num_bits, uint32_t* b);
+
+int flush();
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif

+ 118 - 0
src/codec/BitOutputStream.c

@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EXITypes.h"
+#include "BitOutputStream.h"
+
+#ifndef BIT_OUTPUT_STREAM_C
+#define BIT_OUTPUT_STREAM_C
+
+/*	NOTE: nbits <= 8 */
+int writeBits(bitstream_t* stream, uint16_t nbits, uint32_t val) {
+	/*  is there enough space in the buffer */
+	if (nbits <= stream->capacity) {
+		/* all bits fit into the current buffer */
+		stream->buffer = (stream->buffer << (nbits)) | (val & (0xff
+				>> (BITS_IN_BYTE - nbits)));
+		stream->capacity -= nbits;
+		/* if the buffer is full write byte */
+		if (stream->capacity == 0) {
+#if EXI_STREAM == BYTE_ARRAY
+			if ((*stream->pos) >= stream->size) {
+				return EXI_ERROR_OUTPUT_STREAM_EOF;
+			}
+			stream->data[(*stream->pos)++] = stream->buffer;
+#endif
+#if EXI_STREAM == FILE_STREAM
+			if ( putc(stream->buffer, stream->file) == EOF ) {
+				return EXI_ERROR_OUTPUT_STREAM_EOF;
+			}
+#endif
+			stream->capacity = BITS_IN_BYTE;
+			stream->buffer = 0;
+		}
+	} else {
+		/* the buffer is not enough
+		 * fill the buffer */
+		stream->buffer = (stream->buffer << stream->capacity) | ((val >> (nbits
+				- stream->capacity)) & (0xff >> (BITS_IN_BYTE
+				- stream->capacity)));
+
+		nbits -= stream->capacity;
+#if EXI_STREAM == BYTE_ARRAY
+		if ((*stream->pos) >= stream->size) {
+			return EXI_ERROR_OUTPUT_STREAM_EOF;
+		}
+		stream->data[(*stream->pos)++] = stream->buffer;
+#endif
+#if EXI_STREAM == FILE_STREAM
+		if ( putc(stream->buffer, stream->file) == EOF ) {
+			return EXI_ERROR_OUTPUT_STREAM_EOF;
+		}
+#endif
+		stream->buffer = 0;
+
+		/* write whole bytes */
+		while (nbits >= BITS_IN_BYTE) {
+			nbits -= BITS_IN_BYTE;
+#if EXI_STREAM == BYTE_ARRAY
+			if ((*stream->pos) >= stream->size) {
+				return EXI_ERROR_OUTPUT_STREAM_EOF;
+			}
+			stream->data[(*stream->pos)++] = (val >> (nbits));
+#endif
+#if EXI_STREAM == FILE_STREAM
+			if ( putc((val >> (nbits)), stream->file) == EOF ) {
+				return EXI_ERROR_OUTPUT_STREAM_EOF;
+			}
+#endif
+		}
+
+		/* spared bits are kept in the buffer */
+		stream->buffer = val; /* Note: the high bits will be shifted out during further filling */
+		stream->capacity = BITS_IN_BYTE - (nbits);
+	}
+
+	return 0;
+}
+
+/**
+ * Flush output
+ */
+int flush(bitstream_t* stream) {
+	if (stream->capacity == BITS_IN_BYTE) {
+		/* nothing to do, no bits in buffer */
+		return 0;
+	} else {
+		return writeBits(stream, stream->capacity, 0);
+	}
+}
+
+#endif
+

+ 52 - 0
src/codec/BitOutputStream.h

@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#include "EXITypes.h"
+
+#ifndef BIT_OUTPUT_STREAM_H
+#define BIT_OUTPUT_STREAM_H
+
+int writeBits(bitstream_t* stream, uint16_t nbits, uint32_t bits);
+
+/* flush output */
+int flush(bitstream_t* stream);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+

+ 93 - 0
src/codec/ByteDecoderChannel.c

@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "DecoderChannel.h"
+#include "CoderChannel.h"
+#include "BitInputStream.h"
+#include "EXITypes.h"
+
+#ifndef BYTE_DECODER_CHANNEL_C
+#define BYTE_DECODER_CHANNEL_C
+
+
+#if EXI_ALIGNMENT == BYTE_ALIGNMENT
+
+int decode(bitstream_t* stream, uint8_t* b) {
+	int errn = 0;
+#if EXI_STREAM == BYTE_ARRAY
+	if ( (*stream->pos) < stream->size ) {
+		*b = stream->data[(*stream->pos)++];
+	} else {
+		errn = EXI_ERROR_INPUT_STREAM_EOF;
+	}
+#endif /* EXI_STREAM == BYTE_ARRAY */
+#if EXI_STREAM == FILE_STREAM
+	*b = getc(stream->file);
+	/* EOF cannot be used, 0xFF valid value */
+	if ( feof(stream->file) || ferror(stream->file) ) {
+		return EXI_ERROR_INPUT_STREAM_EOF;
+	}
+#endif /* EXI_STREAM == FILE_STREAM */
+
+	return errn;
+}
+
+int decodeBoolean(bitstream_t* stream, int* b) {
+	uint8_t bb;
+	int errn = decode(stream, &bb);
+	*b = (bb == 0) ? 0 : 1;
+	return errn;
+}
+
+/**
+ * Decodes and returns an n-bit unsigned integer using the minimum number of
+ * bytes required for n bits.
+ */
+int decodeNBitUnsignedInteger(bitstream_t* stream, uint16_t nbits, uint32_t* uint32) {
+	uint16_t bitsRead = 0;
+	uint8_t b;
+	int errn = 0;
+	*uint32 = 0;
+
+	while (bitsRead < nbits) {
+		errn = decode(stream, &b);
+		if (errn != 0) {
+			return errn;
+		}
+		*uint32 += (b << bitsRead);
+		bitsRead += 8;
+	}
+
+	return errn;
+}
+
+#endif
+
+#endif
+

+ 125 - 0
src/codec/ByteEncoderChannel.c

@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EncoderChannel.h"
+#include "CoderChannel.h"
+#include "BitOutputStream.h"
+#include "EXITypes.h"
+#include "MethodsBag.h"
+
+#ifndef BYTE_ENCODER_CHANNEL_C
+#define BYTE_ENCODER_CHANNEL_C
+
+#if EXI_ALIGNMENT == BYTE_ALIGNMENT
+
+
+int encode(bitstream_t* stream, uint8_t b) {
+#if EXI_STREAM == BYTE_ARRAY
+	if ( (*stream->pos) < stream->size ) {
+		stream->data[(*stream->pos)++] = b;
+		return 0;
+	} else {
+		return EXI_ERROR_OUTPUT_STREAM_EOF;
+	}
+#endif /* EXI_STREAM == BYTE_ARRAY */
+#if EXI_STREAM == FILE_STREAM
+	if ( putc(b, stream->file) == EOF ) {
+		return EXI_ERROR_OUTPUT_STREAM_EOF;
+	} else {
+		return 0;
+	}
+#endif /* EXI_STREAM == FILE_STREAM */
+}
+
+/**
+ * Encode a single boolean value. A false value is encoded as byte 0 and true
+ * value is encode as byte 1.
+ */
+int encodeBoolean(bitstream_t* stream, int b) {
+	uint8_t val = b ? 1 : 0;
+	return encode(stream, val);
+}
+
+
+/**
+ * Encode n-bit unsigned integer. The n least significant bits of parameter
+ * b starting with the most significant, i.e. from left to right.
+ */
+int encodeNBitUnsignedInteger(bitstream_t* stream, uint16_t nbits, uint32_t val)  {
+	if (nbits > 0) {
+		if (nbits < 9) {
+			/* 1 byte */
+			encode(stream, val & 0xff);
+		} else if (nbits < 17) {
+			/* 2 bytes */
+			encode(stream, val & 0x00ff);
+			encode(stream, (val & 0xff00) >> 8);
+		} else if (nbits < 25) {
+			/* 3 bytes */
+			encode(stream, val & 0x0000ff);
+			encode(stream, (val & 0x00ff00) >> 8);
+			encode(stream, (val & 0xff0000) >> 16);
+		} else if (nbits < 33) {
+			/* 4 bytes */
+			encode(stream, val & 0x000000ff);
+			encode(stream, (val & 0x0000ff00) >> 8);
+			encode(stream, (val & 0x00ff0000) >> 16);
+			encode(stream, (val & 0xff000000) >> 24);
+		} else {
+			/* TODO Currently not more than 4 Bytes allowed for NBitUnsignedInteger */
+			return EXI_UNSUPPORTED_NBIT_INTEGER_LENGTH;
+		}
+	}
+	return 0;
+}
+
+
+/**
+ * Flush underlying bit output stream.
+ */
+int encodeFinish(bitstream_t* stream) {
+	/* no pending bits in byte-aligned mode */
+	return 0;
+}
+
+#endif /* alignment */
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+

+ 79 - 0
src/codec/ByteStream.c

@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#define _CRT_SECURE_NO_DEPRECATE 1
+
+#include "EXITypes.h"
+
+#ifndef BYTE_STREAM_C
+#define BYTE_STREAM_C
+
+int readBytesFromFile(const char * filename, uint8_t* data, uint32_t size, uint32_t pos) {
+	FILE* f;
+	int character;
+
+	f = fopen(filename, "rb");
+
+	if (f == NULL) {
+		return EXI_ERROR_INPUT_FILE_HANDLE;
+	} else {
+		/* read bytes */
+		while ((character = getc(f)) != EOF) {
+			if (pos >= size) {
+				return EXI_ERROR_OUT_OF_BYTE_BUFFER;
+			}
+			data[pos++] = (uint8_t) character;
+		}
+		fclose(f);
+	}
+
+	return pos;
+}
+
+int writeBytesToFile(uint8_t* data, uint32_t len, const char * filename) {
+	uint16_t rlen;
+	FILE* f = fopen(filename, "wb+");
+
+	if (f == NULL) {
+		return -1;
+	} else {
+		rlen = fwrite(data, sizeof(uint8_t), len, f);
+		fflush(f);
+		fclose(f);
+		if(rlen == len) {
+			return 0;
+		} else {
+			return EXI_ERROR_OUTPUT_FILE;
+		}
+	}
+}
+
+
+#endif
+

+ 48 - 0
src/codec/ByteStream.h

@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+#ifndef BYTE_STREAM_H
+#define BYTE_STREAM_H
+
+int writeBytesToFile(uint8_t* data, uint32_t len, const char * filename);
+
+int readBytesFromFile(const char * filename, uint8_t* data, uint32_t size, uint32_t pos);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif

+ 48 - 0
src/codec/CoderChannel.h

@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+#ifndef CODER_CHANNEL_H
+#define CODER_CHANNEL_H
+
+/* EXI alignment mode */
+#define BIT_PACKED 1
+#define BYTE_ALIGNMENT 2
+#define EXI_ALIGNMENT BIT_PACKED
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

+ 178 - 0
src/codec/DecoderChannel.h

@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+#include "CoderChannel.h"
+
+#ifndef DECODER_CHANNEL_H
+#define DECODER_CHANNEL_H
+
+/**
+ * Decode a byte value.
+ */
+int decode(bitstream_t* stream, uint8_t* b);
+
+/**
+ * Decode a single boolean value. The value false is represented by the bit
+ * 0, and the value true is represented by the bit 1.
+ */
+int decodeBoolean(bitstream_t* stream, int* b);
+
+/**
+ * Decodes and returns an n-bit unsigned integer.
+ */
+int decodeNBitUnsignedInteger(bitstream_t* stream, uint16_t nbits, uint32_t* uint32);
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedInteger(bitstream_t* stream, integer_t* iv);
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedInteger16(bitstream_t* stream, uint16_t* uint16);
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedInteger32(bitstream_t* stream, uint32_t* uint32);
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedInteger64(bitstream_t* stream, uint64_t* uint64);
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeInteger(bitstream_t* stream, integer_t* iv);
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeInteger32(bitstream_t* stream, int32_t* int32);
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeInteger64(bitstream_t* stream, int64_t* int64);
+
+/**
+ * Decode a Float datatype as two consecutive Integers.
+ * The first Integer represents the mantissa of the floating point
+ * number and the second Integer represents the base-10 exponent
+ * of the floating point number.
+ */
+int decodeFloat(bitstream_t* stream, float_me_t* f);
+
+/**
+ * Decode a decimal represented as a Boolean sign followed by two Unsigned
+ * Integers. A sign value of zero (0) is used to represent positive Decimal
+ * values and a sign value of one (1) is used to represent negative Decimal
+ * values The first Integer represents the integral portion of the Decimal
+ * value. The second positive integer represents the fractional portion of
+ * the decimal with the digits in reverse order to preserve leading zeros.
+ */
+int decodeDecimal(bitstream_t* stream, decimal_t* d);
+
+/**
+ * Decode a sequence of characters for a given length.
+ */
+int decodeStringOnly(bitstream_t* stream, uint16_t len, string_ucs_t* s);
+
+/**
+ * Decode a length prefixed sequence of characters.
+ */
+int decodeString(bitstream_t* stream, string_ucs_t* s);
+
+int decodeStringASCII(bitstream_t* stream, string_ascii_t* s);
+
+/**
+ * Decode a length prefixed sequence of characters in the sense of string tables.
+ * length == 0, local value partition hit
+ * length == 1, global value partition hit
+ * --> string literal is encoded as a String with the length incremented by two
+ */
+int decodeStringValue(bitstream_t* stream, string_ucs_t* s);
+
+/**
+ * Restricted character set
+ */
+int decodeRCSStringValue(bitstream_t* stream, rcs_t* rcs, string_ucs_t* s);
+
+/**
+ * Decode a sequence of characters according to a given length.
+ */
+int decodeCharacters(bitstream_t* stream, uint16_t len, uint32_t* chars);
+int decodeCharactersASCII(bitstream_t* stream, uint16_t len, char* chars);
+
+/**
+ * Decode a binary value as a length-prefixed sequence of octets.
+ */
+int decodeBinary(bitstream_t* stream, bytes_t* bytes);
+
+/**
+ * Decode Date-Time as sequence of values representing the individual
+ * components of the Date-Time.
+ */
+int decodeDateTime(bitstream_t* stream, exi_datetime_type_t type, datetime_t* datetime);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2025 - 0
src/codec/EXICoder.c


+ 65 - 0
src/codec/EXICoder.h

@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI_CODER_H
+#define EXI_CODER_H
+
+#include "EXITypes.h"
+
+#define IS_STRICT 0
+#define DOCUMENT 0
+#define DOC_CONTENT 1
+#define DOC_END 2
+#define UR_TYPE_GRAMMAR_0 73
+#define UR_TYPE_GRAMMAR_1 602
+
+
+
+int exiPushStack(exi_state_t* state, uint16_t newState, eqname_t* eqn);
+
+int exiPopStack(exi_state_t* state);
+
+int exiHandleXsiNilTrue(exi_state_t* state);
+
+int exiHandleXsiType(exi_state_t* state, eqname_t* xsiType);
+
+int exiIsStartContent(int16_t ruleID);
+
+int exiMoveToElementContentRule(exi_state_t* state);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 569 - 0
src/codec/EXIDecoder.c


+ 93 - 0
src/codec/EXIDecoder.h

@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI__DECODER_H
+#define EXI__DECODER_H
+
+#include "EXITypes.h"
+
+int exiInitDecoder(bitstream_t* stream, exi_state_t* state,
+		exi_name_table_runtime_t runtimeTable);
+
+int exiDecodeNextEvent(bitstream_t* stream,
+		exi_state_t* state, exi_event_t* nextEvent);
+
+int exiDecodeStartDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int exiDecodeEndDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int
+exiDecodeStartElement(bitstream_t* stream,
+		exi_state_t* state, eqname_t* se);
+
+int exiDecodeStartElementGeneric(bitstream_t* stream,
+		exi_state_t* state, qname_t* qname);
+
+int exiDecodeEndElement(bitstream_t* stream,
+		exi_state_t* state, eqname_t* ee);
+
+int exiDecodeEndElementUndeclared(bitstream_t* stream,
+		exi_state_t* state, eqname_t* ee);
+
+int exiDecodeCharacters(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiDecodeCharactersGeneric(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiDecodeCharactersGenericUndeclared(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiDecodeAttribute(bitstream_t* stream,
+		exi_state_t* state, eqname_t* at, exi_value_t* val);
+
+int exiDecodeAttributeXsiNil(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiDecodeAttributeXsiType(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiDecodeAttributeGenericUndeclared(bitstream_t* stream,
+		exi_state_t* state, qname_t* at, exi_value_t* val);
+
+int exiDecodeListValue(bitstream_t* stream, exi_value_t* val,
+		list_t lt);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 500 - 0
src/codec/EXIEncoder.c


+ 79 - 0
src/codec/EXIEncoder.h

@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI__ENCODER_H
+#define EXI__ENCODER_H
+
+#include "EXITypes.h"
+
+int exiInitEncoder(bitstream_t* stream, exi_state_t* state,
+		exi_name_table_runtime_t runtimeTable);
+
+int exiEncodeStartDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int exiEncodeEndDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int
+exiEncodeStartElement(bitstream_t* stream,
+		exi_state_t* state, eqname_t* se);
+
+int exiEncodeStartElementGeneric(bitstream_t* stream,
+		exi_state_t* state, string_ascii_t* namespaceURI,
+		string_ascii_t* localName);
+
+int exiEncodeEndElement(bitstream_t* stream,
+		exi_state_t* state);
+
+int exiEncodeCharacters(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiEncodeAttribute(bitstream_t* stream,
+		exi_state_t* state, eqname_t* at, exi_value_t* val);
+
+int exiEncodeAttributeXsiNil(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiEncodeAttributeXsiType(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiEncodeListValue(bitstream_t* stream, exi_value_t* val,
+		list_t lt);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

+ 59 - 0
src/codec/EXIHeaderDecoder.c

@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EXIHeaderDecoder.h"
+#include "BitInputStream.h"
+#include "DecoderChannel.h"
+
+#ifndef EXI_HEADER_DECODER_C
+#define EXI_HEADER_DECODER_C
+
+int readEXIHeader(bitstream_t* stream) {
+	uint32_t header = 0;
+	int errn = readBits(stream, 8, &header);
+	if (errn < 0) {
+		return errn;
+	}
+	if(header == '$') {
+		/*	we do not support "EXI Cookie" */
+		errn = EXI_UNSUPPORTED_HEADER_COOKIE;
+	} else if ( header & 0x20 ) {
+		/* we do not support "Presence Bit for EXI Options" */
+		errn = EXI_UNSUPPORTED_HEADER_OPTIONS;
+	} else {
+		/* Yes, a *simple* header */
+		errn = 0;
+	}
+	return errn;
+}
+
+
+#endif
+
+

+ 46 - 0
src/codec/EXIHeaderDecoder.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+#ifndef EXI_HEADER_DECODER_H
+#define EXI_HEADER_DECODER_H
+
+int readEXIHeader(bitstream_t* stream);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif

+ 44 - 0
src/codec/EXIHeaderEncoder.c

@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include "EXIHeaderEncoder.h"
+#include "BitOutputStream.h"
+#include "EncoderChannel.h"
+
+#ifndef EXI_HEADER_ENCODER_C
+#define EXI_HEADER_ENCODER_C
+
+int writeEXIHeader(bitstream_t* stream) {
+	return writeBits(stream, 8, 128);
+}
+
+
+#endif
+
+

+ 46 - 0
src/codec/EXIHeaderEncoder.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+#ifndef EXI_HEADER_ENCODER_H
+#define EXI_HEADER_ENCODER_H
+
+int writeEXIHeader(bitstream_t* stream);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif

+ 447 - 0
src/codec/EXITypes.h

@@ -0,0 +1,447 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <stdint.h>
+#include <stdio.h>
+
+
+#ifndef EXI_TYPES_H
+#define EXI_TYPES_H
+
+#define BITS_IN_BYTE 8
+
+#define DATETIME_YEAR_OFFSET 2000
+#define DATETIME_NUMBER_BITS_MONTHDAY 9
+#define DATETIME_NUMBER_BITS_TIME 17
+#define DATETIME_NUMBER_BITS_TIMEZONE 11
+#define DATETIME_MONTH_MULTIPLICATOR 32
+#define DATETIME_TIMEZONE_OFFSET_IN_MINUTES 896
+
+#define UINT_MAX_VALUE 65535
+
+/* EXI Debug mode */
+/* Increases code footprint but offers addition functionalities, e.g. string retrieving  */
+#define EXI_DEBUG_ON 1
+#define EXI_DEBUG_OFF 2
+#define EXI_DEBUG EXI_DEBUG_OFF
+
+/* EXI stream */
+#define BYTE_ARRAY 1
+#define FILE_STREAM 2
+/*#define EXI_STREAM FILE_STREAM */
+
+#define EXI_STREAM BYTE_ARRAY
+
+#define EXI_ELEMENT_STACK_SIZE 16
+
+#define FLOAT_EXPONENT_SPECIAL_VALUES -16384
+#define FLOAT_MANTISSA_INFINITY 1
+#define FLOAT_MANTISSA_MINUS_INFINITY -1
+#define FLOAT_MANTISSA_NOT_A_NUMBER 0
+
+typedef struct {
+#if EXI_STREAM == BYTE_ARRAY
+	/*	Byte Array */
+	uint32_t size; /* array size */
+	uint8_t* data; /* int data array */
+	uint32_t* pos; /* next position in array */
+#endif
+#if EXI_STREAM == FILE_STREAM
+	/* FILE */
+	FILE *file;
+#endif
+	/* Current byte buffer & its remaining bit capacity */
+	uint8_t buffer;
+	uint8_t capacity;
+} bitstream_t;
+
+
+typedef enum {
+	/* Binary */
+	EXI_DATATYPE_BINARY_BASE64,
+	EXI_DATATYPE_BINARY_HEX,
+	/* Boolean */
+	EXI_DATATYPE_BOOLEAN,
+	EXI_DATATYPE_BOOLEAN_FACET,
+	/* Decimal */
+	EXI_DATATYPE_DECIMAL,
+	/* Float & Double */
+	EXI_DATATYPE_FLOAT,
+	/* N-Bit Unsigned Integer */
+	EXI_DATATYPE_NBIT_UNSIGNED_INTEGER,
+	/* Unsigned Integer */
+	EXI_DATATYPE_UNSIGNED_INTEGER,
+	/* (Signed) Integer */
+	EXI_DATATYPE_INTEGER,
+	/* Datetime */
+	EXI_DATATYPE_DATETIME,
+	/* String */
+	EXI_DATATYPE_STRING,
+	/* Restricted Character Set String */
+	EXI_DATATYPE_RCS_STRING,
+	/* Enumeration */
+	EXI_DATATYPE_ENUMERATION,
+	/* List */
+	EXI_DATATYPE_LIST
+} exi_datatype_t;
+
+
+typedef enum {
+	/* Unsigned Integer */
+	EXI_UNSIGNED_INTEGER_8,
+	EXI_UNSIGNED_INTEGER_16,
+	EXI_UNSIGNED_INTEGER_32,
+	EXI_UNSIGNED_INTEGER_64,
+	/* (Signed) Integer */
+	EXI_INTEGER_8,
+	EXI_INTEGER_16,
+	EXI_INTEGER_32,
+	EXI_INTEGER_64
+} exi_integer_type_t;
+
+typedef enum {
+	EXI_EVENT_START_DOCUMENT,
+	EXI_EVENT_END_DOCUMENT,
+	EXI_EVENT_START_ELEMENT,
+	EXI_EVENT_START_ELEMENT_NS,
+	EXI_EVENT_START_ELEMENT_GENERIC,
+	EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED,
+	EXI_EVENT_END_ELEMENT,
+	EXI_EVENT_END_ELEMENT_UNDECLARED,
+	EXI_EVENT_CHARACTERS,
+	EXI_EVENT_CHARACTERS_GENERIC,
+	EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED,
+	EXI_EVENT_ATTRIBUTE_XSI_TYPE,
+	EXI_EVENT_ATTRIBUTE_XSI_NIL,
+	EXI_EVENT_ATTRIBUTE,
+	EXI_EVENT_ATTRIBUTE_NS,
+	EXI_EVENT_ATTRIBUTE_GENERIC,
+	EXI_EVENT_ATTRIBUTE_INVALID_VALUE,
+	EXI_EVENT_ATTRIBUTE_ANY_INVALID_VALUE,
+	EXI_EVENT_ATTRIBUTE_GENERIC_UNDECLARED,
+	/* error state */
+	EXI_EVENT_ERROR
+} exi_event_t;
+
+
+/* differ datetime types */
+typedef enum {
+	EXI_DATETIME_GYEAR,
+	EXI_DATETIME_GYEARMONTH,
+	EXI_DATETIME_DATE,
+	EXI_DATETIME_DATETIME,
+	EXI_DATETIME_GMONTH,
+	EXI_DATETIME_GMONTHDAY,
+	EXI_DATETIME_GDAY,
+	EXI_DATETIME_TIME
+} exi_datetime_type_t;
+
+
+typedef struct {
+	/* Bytes Size and array container */
+	uint16_t size;
+	uint8_t* data;
+	/* current length (len <= size) */
+	uint16_t len;
+} bytes_t;
+
+/* Universal Character Set (UCS) strings */
+typedef struct {
+	/* UCS size and UCS character container*/
+	uint16_t size;
+	uint32_t* codepoints;
+	/* current length == number of code-points, (len <= size) */
+	uint16_t len;
+} string_ucs_t;
+
+/* Restricted Characeter Set */
+typedef struct {
+	/* size and UCS character codep*/
+	uint16_t size;
+	/* rcs codepoints */
+	uint32_t* codepoints;
+	/* character coding length*/
+	uint8_t codingLength; /* less than 256 characters */
+} rcs_t;
+
+/* ASCII strings */
+typedef struct {
+	/* size of String array */
+	uint16_t size;
+	char* chars;
+	/* current length can be retrieved by calling strlen(chars)*/
+} string_ascii_t;
+
+typedef struct {
+	exi_integer_type_t type;
+	union {
+		/* unsigned values */
+		int8_t int8;
+		int16_t int16;
+		int32_t int32;
+		int32_t int64;
+		/* (signed) values */
+		uint8_t uint8;
+		uint16_t uint16;
+		uint32_t uint32;
+		uint64_t uint64;
+	} val;
+} integer_t;
+
+typedef struct {
+	/* range of the mantissa is -(2^63) to 2^63-1 */
+	int64_t mantissa;
+	/* range of the exponent is - (2^14-1) to 2^14-1 */
+	int32_t exponent; /* base-10 */
+} float_me_t;
+
+typedef struct {
+	/* a sign value */
+	int negative;
+	/* represents the integral portion of the Decimal */
+	integer_t integral;
+	/* represents the fractional portion of the Decimal with the digits in reverse order to preserve leading zeros */
+	integer_t reverseFraction;
+} decimal_t;
+
+
+
+typedef struct {
+	/* datetime type */
+	exi_datetime_type_t type;
+	/* values */
+	int32_t year;
+	uint32_t monthDay;
+	uint32_t time;
+	int presenceFractionalSecs;
+	uint32_t fractionalSecs;
+	int presenceTimezone;
+	uint32_t timezone;
+} datetime_t;
+
+
+
+/* TODO list support */
+typedef struct {
+	/* list item type */
+	exi_datatype_t type;
+	/* number of items */
+	uint16_t len;
+	/* special datatypes */
+	exi_integer_type_t intType;
+	exi_datetime_type_t datetimeType;
+
+	/* List container with memory size */
+	/* uint16_t size;
+	uint8_t* data;*/
+} list_t;
+
+/* efficient ID qname */
+typedef struct {
+	uint16_t namespaceURI;
+	uint16_t localPart;
+} eqname_t;
+
+/* ascii qname */
+typedef struct {
+	string_ascii_t namespaceURI;
+	string_ascii_t localName;
+} qname_t;
+
+/* ==================================== */
+/* LocalName Entries */
+struct exiNamePartition {
+	/* length of array */
+	uint16_t len;
+#if EXI_DEBUG == EXI_DEBUG_ON
+	/* array of string entries */
+	char** names;
+#endif /*EXI_DEBUG*/
+};
+
+typedef struct exiNameTablePrepopulated {
+	/* length of both arrays (uris & localNames) */
+	uint16_t len;
+#if EXI_DEBUG == EXI_DEBUG_ON
+	/* URI entries*/
+	char** uris;
+#endif /*EXI_DEBUG*/
+	/* localName entries divided by URI */
+	struct exiNamePartition * localNames;
+} exi_name_table_prepopulated_t;
+
+
+#define EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_CHARACTERS 500
+#define EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_ENTRIES 25
+#define EXI_RESERVED_NUMBER_URI_PARTITION_ENTRIES 5
+#define EXI_RESERVED_NUMBER_LOCALNAME_PARTITION_ENTRIES 10
+
+typedef enum {
+	EXI_NAME_PARTITION_URI,
+	EXI_NAME_PARTITION_LOCALNAME
+} exi_name_partition_type_t;
+
+typedef struct {
+	 char* uri;
+	 uint16_t uriID;
+} exi_uri_partition_t;
+
+typedef struct {
+	 char* localName;
+	 uint16_t localNameID;
+	 uint16_t uriID;
+} exi_localname_partition_t;
+
+typedef struct {
+	exi_name_partition_type_t namePartitionType;
+    struct
+    {
+		exi_uri_partition_t uriPartition;
+        exi_localname_partition_t localNamePartition;
+    } entry;
+} exi_name_partition_t;
+
+typedef struct exiNameTableRuntime {
+	/* maximum number of characters in the name partitions entries PLUS null terminators */
+	char characters[EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_CHARACTERS + EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_ENTRIES];
+	uint16_t numberOfUsedCharacters; /* initially zero <= EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_CHARACTERS */
+	/* maximum number of name partitions entries. Name partitions entries consist in all uri, and local-name partition entries */
+	exi_name_partition_t namePartitionsEntries[EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_ENTRIES];
+	/* uint16_t numberOfUsedNamePartitions; */ /* initially zero */
+	/* added entries */
+	uint16_t addedUriEntries; /* initially zero */
+	uint16_t addedLocalNameEntries; /* initially zero */
+} exi_name_table_runtime_t;
+
+
+
+
+
+
+typedef struct {
+	/* stack of grammar states */
+	int16_t grammarStack[EXI_ELEMENT_STACK_SIZE];
+	/* stack of grammar elements */
+	eqname_t elementStack[EXI_ELEMENT_STACK_SIZE];
+	uint16_t stackIndex;
+	/* event-code */
+	uint32_t eventCode;
+	/* string table entries */
+	exi_name_table_prepopulated_t nameTablePrepopulated;
+	exi_name_table_runtime_t nameTableRuntime;
+} exi_state_t;
+
+typedef struct {
+	/* type of value */
+	exi_datatype_t type;
+
+	/* base types */
+	int boolean;
+	integer_t integer;
+
+	/*uint16_t uint8;
+	uint16_t uint16;
+	uint32_t uint32;
+	uint64_t uint64;
+	int8_t int8;
+	int16_t int16;
+	int32_t int32;
+	int64_t int64;*/
+
+	uint32_t enumeration;
+
+	/* Bytes, Strings and Lists are not native types anymore */
+	bytes_t binary;
+	string_ucs_t string;
+	float_me_t float_me;
+	decimal_t decimal;
+	datetime_t datetime;
+	list_t list;
+	eqname_t eqname;
+} exi_value_t;
+
+/*
+ * ERROR-Codes
+ */
+#define EXI_ERROR_INPUT_STREAM_EOF -10
+#define EXI_ERROR_OUTPUT_STREAM_EOF -11
+#define EXI_ERROR_INPUT_FILE_HANDLE -12
+#define EXI_ERROR_OUTPUT_FILE -13
+
+#define EXI_ERROR_OUT_OF_BOUNDS -100
+#define EXI_ERROR_OUT_OF_STRING_BUFFER -101
+#define EXI_ERROR_OUT_OF_ASCII_BUFFER -102
+#define EXI_ERROR_OUT_OF_BYTE_BUFFER -103
+#define EXI_ERROR_OUT_OF_GRAMMAR_STACK -104
+
+#define EXI_ERROR_UNKOWN_EVENT -109
+#define EXI_ERROR_UNKOWN_EVENT_CODE -110
+#define EXI_ERROR_UNEXPECTED_EVENT_LEVEL1 -111
+#define EXI_ERROR_UNEXPECTED_EVENT_LEVEL2 -112
+
+#define EXI_ERROR_UNEXPECTED_START_DOCUMENT -113
+#define EXI_ERROR_UNEXPECTED_END_DOCUMENT -114
+#define EXI_ERROR_UNEXPECTED_START_ELEMENT -115
+#define EXI_ERROR_UNEXPECTED_START_ELEMENT_GENERIC -116
+#define EXI_ERROR_UNEXPECTED_END_ELEMENT -117
+#define EXI_ERROR_UNEXPECTED_CHARACTERS -118
+#define EXI_ERROR_UNEXPECTED_ATTRIBUTE -119
+#define EXI_ERROR_UNEXPECTED_ATTRIBUTE_XSI_TYPE -120
+#define EXI_ERROR_UNEXPECTED_ATTRIBUTE_XSI_NIL -121
+#define EXI_ERROR_UNEXPECTED_GRAMMAR_ID -122
+#define EXI_ERROR_UNEXPECTED_ATTRIBUTE_MOVE_TO_CONTENT_RULE -123
+
+
+#define EXI_UNSUPPORTED_STRING_TABLE_LOCAL_HIT -130
+#define EXI_UNSUPPORTED_STRING_TABLE_GLOBAL_HIT -131
+#define EXI_UNSUPPORTED_NBIT_INTEGER_LENGTH -132
+#define EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS -133
+#define EXI_UNSUPPORTED_INTEGER_VALUE_TYPE -134
+#define EXI_UNSUPPORTED_INTEGER_VALUE -135
+#define EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE -136
+#define EXI_UNSUPPORTED_LIST_VALUE_TYPE -137
+#define EXI_UNSUPPORTED_HEADER_COOKIE -138
+#define EXI_UNSUPPORTED_HEADER_OPTIONS -139
+
+#define EXI_ERROR_UNEXPECTED_BYTE_VALUE -200
+#define EXI_ERROR_UNEXPECTED_DATETIME_TYPE -201
+
+#define EXI_ERROR_CONVERSION_NO_ASCII_CHARACTERS -300
+#define EXI_ERROR_CONVERSION_TYPE_TO_STRING -301
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 180 - 0
src/codec/EncoderChannel.h

@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+#ifndef ENCODER_CHANNEL_H
+#define ENCODER_CHANNEL_H
+
+/**
+ * Encode a byte value.
+ */
+int encode(bitstream_t* stream, uint8_t b);
+
+/**
+ * Encode a single boolean value. A false value is encoded as 0 and true
+ * value is encode as 1.
+ */
+int encodeBoolean(bitstream_t* stream, int b);
+
+
+/**
+ * Encode n-bit unsigned integer. The n least significant bits of parameter
+ * b starting with the most significant, i.e. from left to right.
+ */
+int encodeNBitUnsignedInteger(bitstream_t* stream, uint16_t nbits, uint32_t val);
+
+/**
+ * Encode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int encodeUnsignedInteger(bitstream_t* stream, integer_t* iv);
+
+
+/**
+ * Encode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int encodeUnsignedInteger32(bitstream_t* stream, uint32_t n);
+
+/**
+ * Encode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int encodeUnsignedInteger64(bitstream_t* stream, uint64_t n);
+
+
+/**
+ * Encode an arbitrary precision integer using a sign boolean followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int encodeInteger(bitstream_t* stream, integer_t* iv);
+
+/**
+ * Encode an arbitrary precision integer using a sign boolean followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int encodeInteger32(bitstream_t* stream, int32_t n);
+
+/**
+ * Encode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int encodeInteger64(bitstream_t* stream, int64_t n);
+
+/**
+ * Encode a Float datatype as two consecutive Integers.
+ * The first Integer represents the mantissa of the floating point
+ * number and the second Integer represents the base-10 exponent
+ * of the floating point number.
+ */
+int encodeFloat(bitstream_t* stream, float_me_t* f);
+
+/**
+ * Encode a decimal represented as a Boolean sign followed by two Unsigned
+ * Integers. A sign value of zero (0) is used to represent positive Decimal
+ * values and a sign value of one (1) is used to represent negative Decimal
+ * values The first Integer represents the integral portion of the Decimal
+ * value. The second positive integer represents the fractional portion of
+ * the decimal with the digits in reverse order to preserve leading zeros.
+ */
+int encodeDecimal(bitstream_t* stream, decimal_t* d);
+
+/**
+ * Encode a length prefixed sequence of characters.
+ */
+int encodeString(bitstream_t* stream, string_ucs_t* string);
+int encodeASCII(bitstream_t* stream, const char* ascii);
+
+/**
+ * Encode a length prefixed sequence of characters in the sense of string tables
+ */
+int encodeStringValue(bitstream_t* stream, string_ucs_t* string);
+
+/**
+ * Restricted character set
+ */
+int encodeRCSStringValue(bitstream_t* stream, rcs_t* rcs, string_ucs_t* string);
+
+/**
+ * Encode a sequence of characters according to a given length.
+ * Each character is represented by its UCS [ISO/IEC 10646]
+ * code point encoded as an Unsigned Integer
+ */
+int encodeUCSCharacters(bitstream_t* stream, uint32_t* chars, uint16_t len);
+
+int encodeASCIICharacters(bitstream_t* stream, const char* chars, uint16_t len);
+
+/**
+ * Encode a binary value as a length-prefixed sequence of octets.
+ */
+int encodeBinary(bitstream_t* stream, bytes_t* bytes);
+
+/**
+ * Encode a datetime representation which is a sequence of values
+ * representing the individual components of the Date-Time
+ */
+int encodeDateTime(bitstream_t* stream, datetime_t* datetime);
+
+/**
+ * Flush underlying bit output stream
+ */
+int encodeFinish(bitstream_t* stream);
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+
+
+
+

+ 106 - 0
src/codec/MethodsBag.c

@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef METHODS_BAG_C
+#define METHODS_BAG_C
+
+#include "MethodsBag.h"
+#include "EXITypes.h"
+
+static const int smallLengths[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+		4, 4, 4 };
+
+int exiGetCodingLength(uint32_t characteristics, uint16_t* codingLength) {
+	if (characteristics < 17) {
+		*codingLength = smallLengths[characteristics];
+		return 0;
+	} else if (characteristics < 33) {
+		/* 17 .. 32 */
+		*codingLength = 5;
+		return 0;
+	} else if (characteristics < 65) {
+		/* 33 .. 64 */
+		*codingLength = 6;
+		return 0;
+	} else if (characteristics < 129) {
+		/* 65 .. 128 */
+		*codingLength = 7;
+		return 0;
+	} else if (characteristics < 257) {
+		/* 129 .. 256 */
+		*codingLength = 8;
+		return 0;
+	} else if (characteristics < 513) {
+		/* 257 .. 512 */
+		*codingLength = 9;
+		return 0;
+	} else if (characteristics < 1025) {
+		/* 513 .. 1024 */
+		*codingLength = 10;
+		return 0;
+	} else {
+		/*
+		return (int) Math.ceil(Math.log((double) (characteristics))
+				/ Math.log(2.0)); */
+		return EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS;
+	}
+
+}
+
+
+uint8_t numberOf7BitBlocksToRepresent(uint32_t n) {
+	/* assert (n >= 0); */
+
+	/* 7 bits */
+	if (n < 128) {
+		return 1;
+	}
+	/* 14 bits */
+	else if (n < 16384) {
+		return 2;
+	}
+	/* 21 bits */
+	else if (n < 2097152) {
+		return 3;
+	}
+	/* 28 bits */
+	else if (n < 268435456) {
+		return 4;
+	}
+	/* 35 bits */
+	else {
+		/* int, 32 bits */
+		return 5;
+	}
+}
+
+
+
+#endif
+

+ 59 - 0
src/codec/MethodsBag.h

@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef METHODS_BAG_H
+#define METHODS_BAG_H
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+
+/**
+ * Returns the number of bits to identify the characteristics.
+ *
+ * @param characteristics
+ * @param codingLength (return value)
+ *
+ */
+int exiGetCodingLength(uint32_t characteristics, uint16_t* codingLength);
+
+/**
+ * Returns the least number of 7 bit-blocks that is needed to represent the
+ * int <param>n</param>. Returns 1 if <param>n</param> is 0.
+ *
+ * @param n
+ *            integer value
+ *
+ */
+uint8_t numberOf7BitBlocksToRepresent(uint32_t n);
+
+
+#endif
+

+ 64 - 0
src/codec/NameTableEntries.c

@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef EXI__NAME_TABLE_ENTRIES_C
+#define EXI__NAME_TABLE_ENTRIES_C
+
+#include "NameTableEntries.h"
+
+
+
+/* ==================================== */
+/* String Table Population */
+
+
+#if EXI_DEBUG == EXI_DEBUG_OFF
+static struct exiNamePartition localNamePartitions[9] = {
+ { 9 },
+ { 4 },
+ { 2 },
+ { 46 },
+ { 70 },
+ { 117 },
+ { 186 },
+ { 6 },
+ { 3 }
+};
+#endif /*EXI_DEBUG*/
+
+
+#if EXI_DEBUG == EXI_DEBUG_OFF
+exi_name_table_prepopulated_t exiNameTablePrepopulated = { 9, localNamePartitions };
+#endif /*EXI_DEBUG*/
+
+
+
+
+#endif
+

+ 41 - 0
src/codec/NameTableEntries.h

@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef EXI__NAME_TABLE_ENTRIES_H
+#define EXI__NAME_TABLE_ENTRIES_H
+
+#include "EXITypes.h"
+
+/* ==================================== */
+/* String Table Population */
+
+extern exi_name_table_prepopulated_t exiNameTablePrepopulated;
+
+#endif
+

+ 249 - 0
src/codec/StringTable.c

@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef STRING_TABLE_C
+#define STRING_TABLE_C
+
+#include <string.h>
+
+#include "StringTable.h"
+#include "NameTableEntries.h"
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+
+int exiGetUri(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID,
+		const char** uri) {
+	if (uriID < prepopulatedTable->len) {
+		*uri = prepopulatedTable->uris[uriID];
+	} else {
+		int i = 0;
+		uriID -= prepopulatedTable->len;
+		for(i=0; i<(runtimeTable->addedUriEntries+runtimeTable->addedLocalNameEntries); i++) {
+			if ( runtimeTable->namePartitionsEntries[i].namePartitionType == EXI_NAME_PARTITION_URI ) {
+				if (uriID == 0) {
+					*uri = runtimeTable->namePartitionsEntries[i].entry.uriPartition.uri;
+					return 0;
+				}
+				uriID--;
+			}
+		}
+
+		return EXI_ERROR_OUT_OF_BOUNDS;
+	}
+
+	return 0;
+}
+
+
+/*  0 ... Success, 1 ... Miss, -1 ... Error */
+int exiGetUriID(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, const char* uri,
+		uint16_t* uriID) {
+	unsigned int i;
+	for (i = 0; i < prepopulatedTable->len; i++) {
+		if (strcmp(uri, prepopulatedTable->uris[i]) == 0) {
+			*uriID = i;
+			return 0;
+		}
+	}
+	if (runtimeTable->addedUriEntries > 0) {
+		*uriID = prepopulatedTable->len - 1;
+		for(i=0; i< (runtimeTable->addedUriEntries + runtimeTable->addedLocalNameEntries); i++) {
+			if ( runtimeTable->namePartitionsEntries[i].namePartitionType == EXI_NAME_PARTITION_URI ) {
+				*uriID = *uriID + 1;
+				if (strcmp(uri, runtimeTable->namePartitionsEntries[i].entry.uriPartition.uri) == 0) {
+					return 0;
+				}
+			}
+		}
+	}
+	/* no URI ID found */
+	return +1;
+}
+
+#endif /*EXI_DEBUG*/
+
+int exiGetUriSize(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t* uriLength) {
+	*uriLength = prepopulatedTable->len;
+	return 0;
+}
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+
+int exiGetLocalName(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID,
+		uint16_t localNameID, const char** localName) {
+	int i;
+	if (uriID < prepopulatedTable->len) {
+		if (localNameID < prepopulatedTable->localNames[uriID].len) {
+			*localName = prepopulatedTable->localNames[uriID].names[localNameID];
+			return 0;
+		} else {
+			localNameID -= prepopulatedTable->localNames[uriID].len;
+		}
+	}
+
+	/* runtime tables */
+	for(i=0; i<(runtimeTable->addedLocalNameEntries+runtimeTable->addedUriEntries); i++) {
+		if ( runtimeTable->namePartitionsEntries[i].namePartitionType == EXI_NAME_PARTITION_LOCALNAME &&
+				runtimeTable->namePartitionsEntries[i].entry.localNamePartition.uriID == uriID ) {
+			if (localNameID == 0) {
+				*localName = runtimeTable->namePartitionsEntries[i].entry.localNamePartition.localName;
+				return 0;
+			}
+			localNameID--;
+		}
+	}
+
+	return EXI_ERROR_OUT_OF_BOUNDS;
+}
+
+
+/*  0 ... Success, 1 ... Miss, -1 ... Error */
+int exiGetLocalNameID(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID,
+		const char* localName, uint16_t* localNameID) {
+	unsigned int i;
+	if (uriID < prepopulatedTable->len) {
+		/* pre-populated names */
+		/* TODO binary search */
+		for (i = 0; i < prepopulatedTable->localNames[uriID].len; i++) {
+			if (strcmp(localName, prepopulatedTable->localNames[uriID].names[i]) == 0) {
+				*localNameID = i;
+				return 0;
+			}
+		}
+		/* runtime names */
+		for (i = 0; i < (runtimeTable->addedUriEntries + runtimeTable->addedLocalNameEntries); i++) {
+			if (runtimeTable->namePartitionsEntries[i].namePartitionType == EXI_NAME_PARTITION_LOCALNAME &&
+					strcmp(localName, runtimeTable->namePartitionsEntries[i].entry.localNamePartition.localName ) == 0) {
+				*localNameID = runtimeTable->namePartitionsEntries[i].entry.localNamePartition.localNameID;
+				return 0;
+			}
+		}
+
+		/* no localName ID found */
+		return +1;
+	} else if (uriID == prepopulatedTable->len) {
+		/* UCD profile */
+		/* no localName ID found */
+		return +1;
+	} else {
+		return EXI_ERROR_OUT_OF_BOUNDS;
+	}
+}
+
+#endif /*EXI_DEBUG*/
+
+int exiGetLocalNameSize(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable,
+		uint16_t uriID, uint16_t* localNameLength) {
+	*localNameLength = 0;
+	/* 1. pre-populated entries*/
+	if (uriID < prepopulatedTable->len) {
+		(*localNameLength) += prepopulatedTable->localNames[uriID].len;
+	} else {
+		/* range check */
+		if (uriID >= ( prepopulatedTable->len + runtimeTable->addedUriEntries )) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+	}
+	/* 2. runtime entries */
+	if (runtimeTable->addedLocalNameEntries > 0 ) {
+		int i;
+		for(i=0; i<(runtimeTable->addedUriEntries+runtimeTable->addedLocalNameEntries); i++) {
+			if ( runtimeTable->namePartitionsEntries[i].namePartitionType == EXI_NAME_PARTITION_LOCALNAME &&
+					runtimeTable->namePartitionsEntries[i].entry.localNamePartition.uriID == uriID ) {
+				(*localNameLength)++;
+			}
+		}
+	}
+
+	return 0;
+}
+
+
+/* inline */
+static int _max(int a, int b) {
+	return (a > b) ? a : b;
+}
+
+int exiInitNameTableRuntime(exi_name_table_runtime_t* runtimeTable) {
+	runtimeTable->numberOfUsedCharacters = 0;
+	runtimeTable->addedLocalNameEntries = 0;
+	runtimeTable->addedUriEntries = 0;
+	return 0;
+}
+
+int exiAddUri(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, char* uri) {
+	if (runtimeTable->addedUriEntries < EXI_RESERVED_NUMBER_URI_PARTITION_ENTRIES
+			|| runtimeTable->addedUriEntries
+					< (EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_ENTRIES - _max(
+							runtimeTable->addedLocalNameEntries,
+							EXI_RESERVED_NUMBER_LOCALNAME_PARTITION_ENTRIES))) {
+		uint16_t index = runtimeTable->addedUriEntries + runtimeTable->addedLocalNameEntries;
+		int charsIndex = runtimeTable->numberOfUsedCharacters+runtimeTable->addedUriEntries+runtimeTable->addedLocalNameEntries;
+		runtimeTable->namePartitionsEntries[index].namePartitionType = EXI_NAME_PARTITION_URI;
+		strcpy(runtimeTable->characters+charsIndex, uri);
+		runtimeTable->namePartitionsEntries[index].entry.uriPartition.uri = runtimeTable->characters+charsIndex;
+		runtimeTable->namePartitionsEntries[index].entry.uriPartition.uriID = prepopulatedTable->len + runtimeTable->addedUriEntries;
+		runtimeTable->addedUriEntries++;
+		runtimeTable->numberOfUsedCharacters += strlen(uri);
+		return 0;
+	} else {
+		return -1;
+	}
+}
+
+int exiAddLocalName(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID,
+		char* localName) {
+	if (runtimeTable->addedUriEntries < EXI_RESERVED_NUMBER_LOCALNAME_PARTITION_ENTRIES
+			|| runtimeTable->addedLocalNameEntries
+					< (EXI_MAXIMUM_NUMBER_OF_NAME_PARTITION_ENTRIES - _max(
+							runtimeTable->addedUriEntries,
+							EXI_RESERVED_NUMBER_URI_PARTITION_ENTRIES))) {
+		uint16_t index = runtimeTable->addedUriEntries + runtimeTable->addedLocalNameEntries;
+		int charsIndex = runtimeTable->numberOfUsedCharacters+runtimeTable->addedUriEntries+runtimeTable->addedLocalNameEntries;
+		uint16_t localNameID;
+		int errn = exiGetLocalNameSize(prepopulatedTable, runtimeTable, uriID, &localNameID);
+		if (errn < 0) {
+			return errn;
+		}
+
+		runtimeTable->namePartitionsEntries[index].namePartitionType = EXI_NAME_PARTITION_LOCALNAME;
+		strcpy(runtimeTable->characters+charsIndex, localName);
+		runtimeTable->namePartitionsEntries[index].entry.localNamePartition.localName = runtimeTable->characters+charsIndex;
+		runtimeTable->namePartitionsEntries[index].entry.localNamePartition.localNameID = localNameID;
+		runtimeTable->namePartitionsEntries[index].entry.localNamePartition.uriID = uriID;
+		runtimeTable->addedLocalNameEntries++;
+		runtimeTable->numberOfUsedCharacters += strlen(localName);
+		return 0;
+	} else {
+		return -1;
+	}
+}
+
+#endif
+

+ 69 - 0
src/codec/StringTable.h

@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef STRING_TABLE_H
+#define STRING_TABLE_H
+
+#include "EXITypes.h"
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+int exiGetUri(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID, const char** uri);
+/*  0 ... Success, 1 ... Miss, -1 ... Error */
+int exiGetUriID(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, const char* uri, uint16_t* uriID);
+#endif /*EXI_DEBUG*/
+
+int exiGetUriSize(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t* uriLength);
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+int exiGetLocalName(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID, uint16_t localNameID, const char** localName);
+/*  0 ... Success, 1 ... Miss, -1 ... Error */
+int exiGetLocalNameID(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID, const char* localName, uint16_t* localNameID);
+#endif /*EXI_DEBUG*/
+
+int exiGetLocalNameSize(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID, uint16_t* localNameLength);
+
+/* inits counter et cetera */
+int exiInitNameTableRuntime(exi_name_table_runtime_t* runtimeTable);
+
+/* add runtime URI entry */
+int exiAddUri(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, char* uri);
+
+/* add runtime local-name entry */
+int exiAddLocalName(exi_name_table_prepopulated_t* prepopulatedTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID, char* localName);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

+ 66 - 0
src/codec/UCSString.c

@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#include <string.h>
+
+#include "DecoderChannel.h"
+#include "BitInputStream.h"
+#include "EXITypes.h"
+
+#ifndef UCS_STRING_C
+#define UCS_STRING_C
+
+int toUCSString(char* chars, string_ucs_t* s) {
+	unsigned int i;
+	s->len = strlen(chars);
+
+	if (s->len <= s->size) {
+		for(i=0; i<s->len; i++) {
+			s->codepoints[i] = chars[i];
+		}
+		return 0;
+	} else {
+		return EXI_ERROR_OUT_OF_STRING_BUFFER;
+	}
+}
+
+/* Note A: fails if string contains non ASCII characters */
+/* Note B: causes harm if char array is not sufficiently long */
+int toASCIIString(string_ucs_t* string, char* outASCII) {
+	unsigned int i;
+	for(i=0; i<string->len; i++) {
+		outASCII[i] = (char)string->codepoints[i];
+	}
+	outASCII[string->len] = '\0';
+
+	return 0;
+}
+
+#endif
+

+ 52 - 0
src/codec/UCSString.h

@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXITypes.h"
+
+/* TODO utf8/cstring//wchar_t/char16_t/char32_t methods */
+
+
+#ifndef UCS_STRING_H
+#define UCS_STRING_H
+
+int toUCSString(char* chars, string_ucs_t* s);
+
+/* Note: fails if string contains non ASCII characters */
+int toASCIIString(string_ucs_t* string, char* outASCII);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif

+ 1882 - 0
src/codec/appHandCodec/appHand_EXIDecoder.c

@@ -0,0 +1,1882 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef EXI_appHand_DECODER_C
+#define EXI_appHand_DECODER_C
+
+#include "EXITypes.h"
+#include "BitInputStream.h"
+#include "DecoderChannel.h"
+#include "CoderChannel.h"
+
+#include "StringTable.h"
+#include "appHand_NameTableEntries.h"
+#include "MethodsBag.h"
+
+#include "EXICoder.h"
+#include "EXIHeaderDecoder.h"
+
+
+
+/* local variables */
+static uint32_t xsi;
+static uint32_t bits;
+static int errn;
+
+
+int exiappHandDecodeListValue(bitstream_t* stream, exi_value_t* val, list_t lt) {
+	uint32_t uint32;
+
+	val->type = lt.type;
+
+	switch(lt.type) {
+	case EXI_DATATYPE_BINARY_BASE64:
+	case EXI_DATATYPE_BINARY_HEX:
+		errn = decodeBinary(stream, &val->binary);
+		break;
+	case EXI_DATATYPE_BOOLEAN:
+		errn = decodeBoolean(stream, &val->boolean);
+		break;
+	case EXI_DATATYPE_BOOLEAN_FACET:
+		errn = decodeNBitUnsignedInteger(stream, 2, &uint32);
+		val->boolean = uint32 > 1;
+		break;
+	case EXI_DATATYPE_DECIMAL:
+		errn = decodeDecimal(stream, &val->decimal);
+		break;
+	case EXI_DATATYPE_FLOAT:
+		errn = decodeFloat(stream, &val->float_me);
+		break;
+	case EXI_DATATYPE_NBIT_UNSIGNED_INTEGER:
+	case EXI_DATATYPE_UNSIGNED_INTEGER:
+	case EXI_DATATYPE_INTEGER:
+		switch(lt.intType) {
+		/* (Signed) Integer */
+		case EXI_UNSIGNED_INTEGER_8:
+		case EXI_UNSIGNED_INTEGER_16:
+		case EXI_UNSIGNED_INTEGER_32:
+		case EXI_UNSIGNED_INTEGER_64:
+			errn = decodeUnsignedInteger(stream, &val->integer);
+			break;
+		/* (Signed) Integer */
+		case EXI_INTEGER_8:
+		case EXI_INTEGER_16:
+		case EXI_INTEGER_32:
+		case EXI_INTEGER_64:
+			errn = decodeInteger(stream, &val->integer);
+			break;
+		}
+		break;
+	case EXI_DATATYPE_DATETIME:
+		errn = decodeDateTime(stream,lt.datetimeType, &val->datetime);
+		break;
+	case EXI_DATATYPE_STRING:
+		errn = decodeStringValue(stream, &val->string);
+		break;
+	default:
+		return EXI_UNSUPPORTED_LIST_VALUE_TYPE;
+	}
+
+	return errn;
+}
+
+
+
+
+int exiappHandInitDecoder(bitstream_t* stream, exi_state_t* state, exi_name_table_runtime_t runtimeTable) {
+	/* init grammar state */
+	state->stackIndex = 0;
+	state->grammarStack[0] = DOCUMENT;
+	/* string table */
+	state->nameTablePrepopulated = exiappHandNameTablePrepopulated;
+	state->nameTableRuntime = runtimeTable;
+	/* decode header */
+	return readEXIHeader(stream);
+}
+
+static int exiDecodeNext2Event(bitstream_t* stream, exi_state_t* state,
+		exi_event_t* nextEvent) {
+	uint32_t eventCode2 = 0;
+
+	switch (state->grammarStack[state->stackIndex]) {
+	case 109:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 113:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 12:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 140:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 57:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 97:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 135:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 5:
+		/* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */
+	case 91:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+	case 111:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 103:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 7:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 133:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 123:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 61:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 99:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 107:
+		/* FirstStartTag[CHARACTERS[BINARY_HEX]] */
+	case 73:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 59:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 63:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 115:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 101:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 71:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 77:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 142:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 121:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 17:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 83:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 117:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 3:
+		/* FirstStartTag[START_ELEMENT(AppProtocol)] */
+	case 87:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 67:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 93:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 53:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 137:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 81:
+		/* FirstStartTag[CHARACTERS[BOOLEAN]] */
+	case 79:
+		/* FirstStartTag[CHARACTERS[BINARY_BASE64]] */
+	case 119:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 51:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 105:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 69:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 45:
+		/* FirstStartTag[CHARACTERS[ENUMERATION]] */
+	case 65:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 129:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 55:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 43:
+		/* FirstStartTag[START_ELEMENT(ResponseCode)] */
+	case 20:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 85:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 125:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 138:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 15:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 131:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 89:
+		/* FirstStartTag[CHARACTERS[DECIMAL]] */
+	case 127:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 95:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+		errn = decodeNBitUnsignedInteger(stream, 3, &eventCode2);
+		switch (eventCode2) {
+		case 0:
+			*nextEvent = EXI_EVENT_END_ELEMENT_UNDECLARED;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_XSI_TYPE;
+			return errn;
+		case 2:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_XSI_NIL;
+			return errn;
+		case 3:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_GENERIC_UNDECLARED;
+			return errn;
+		case 4:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_INVALID_VALUE;
+			return errn;
+		case 5:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED;
+			return errn;
+		case 6:
+			*nextEvent = EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED;
+			return errn;
+		}
+		break;
+	case 49:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 75:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		errn = decodeNBitUnsignedInteger(stream, 3, &eventCode2);
+		switch (eventCode2) {
+		case 0:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_XSI_TYPE;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_XSI_NIL;
+			return errn;
+		case 2:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_GENERIC_UNDECLARED;
+			return errn;
+		case 3:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_INVALID_VALUE;
+			return errn;
+		case 4:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED;
+			return errn;
+		case 5:
+			*nextEvent = EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED;
+			return errn;
+		}
+		break;
+	case 70:
+		/* Element[CHARACTERS[STRING]] */
+	case 124:
+		/* Element[CHARACTERS[STRING]] */
+	case 139:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 46:
+		/* Element[CHARACTERS[ENUMERATION]] */
+	case 22:
+		/* Element[START_ELEMENT(ProtocolNamespace)] */
+	case 86:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 120:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 100:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 54:
+		/* Element[CHARACTERS[STRING]] */
+	case 68:
+		/* Element[CHARACTERS[STRING]] */
+	case 72:
+		/* Element[CHARACTERS[STRING]] */
+	case 94:
+		/* Element[CHARACTERS[STRING]] */
+	case 21:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 78:
+		/* Element[CHARACTERS[STRING]] */
+	case 134:
+		/* Element[CHARACTERS[STRING]] */
+	case 141:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 52:
+		/* Element[CHARACTERS[LIST]] */
+	case 102:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 96:
+		/* Element[CHARACTERS[FLOAT]] */
+	case 60:
+		/* Element[CHARACTERS[LIST]] */
+	case 82:
+		/* Element[CHARACTERS[BOOLEAN]] */
+	case 88:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 116:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 98:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 128:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 13:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 90:
+		/* Element[CHARACTERS[DECIMAL]] */
+	case 92:
+		/* Element[CHARACTERS[FLOAT]] */
+	case 42:
+		/* Element[START_ELEMENT(AppProtocol)] */
+	case 143:
+		/* Element[CHARACTERS[STRING]] */
+	case 110:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 66:
+		/* Element[CHARACTERS[LIST]] */
+	case 112:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 58:
+		/* Element[CHARACTERS[STRING]] */
+	case 14:
+		/* Element[START_ELEMENT(SchemaID)] */
+	case 122:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 16:
+		/* Element[START_ELEMENT(Priority)] */
+	case 104:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 132:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 114:
+		/* Element[CHARACTERS[STRING]] */
+	case 108:
+		/* Element[CHARACTERS[BINARY_HEX]] */
+	case 84:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 106:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 11:
+		/* Element[START_ELEMENT(VersionNumberMinor)] */
+	case 74:
+		/* Element[CHARACTERS[STRING]] */
+	case 6:
+		/* Element[START_ELEMENT(VersionNumberMajor)] */
+	case 64:
+		/* Element[CHARACTERS[STRING]] */
+	case 62:
+		/* Element[CHARACTERS[STRING]] */
+	case 136:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 130:
+		/* Element[CHARACTERS[STRING]] */
+	case 126:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 118:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 48:
+		/* Element[START_ELEMENT(ResponseCode)] */
+	case 10:
+		/* Element[CHARACTERS[STRING]] */
+	case 80:
+		/* Element[CHARACTERS[BINARY_BASE64]] */
+	case 56:
+		/* Element[CHARACTERS[STRING]] */
+	case 18:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		errn = decodeNBitUnsignedInteger(stream, 2, &eventCode2);
+		switch (eventCode2) {
+		case 0:
+			*nextEvent = EXI_EVENT_END_ELEMENT_UNDECLARED;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED;
+			return errn;
+		case 2:
+			*nextEvent = EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED;
+			return errn;
+		}
+		break;
+	case 8:
+		/* Element[END_ELEMENT] */
+	case 34:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 40:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 44:
+		/* Element[START_ELEMENT(SchemaID), END_ELEMENT] */
+	case 25:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 31:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 39:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 33:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 50:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 26:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 32:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 47:
+		/* Element[END_ELEMENT] */
+	case 38:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 35:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 24:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 30:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 4:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 19:
+		/* Element[END_ELEMENT] */
+	case 37:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 29:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 23:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 27:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 76:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 41:
+		/* Element[END_ELEMENT] */
+	case 36:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 28:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		errn = decodeNBitUnsignedInteger(stream, 1, &eventCode2);
+		switch (eventCode2) {
+		case 0:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED;
+			return errn;
+		}
+		break;
+
+	default:
+		*nextEvent = EXI_EVENT_ERROR;
+		return EXI_ERROR_UNEXPECTED_EVENT_LEVEL2;
+	}
+
+	return EXI_ERROR_UNEXPECTED_EVENT_LEVEL2;
+}
+
+
+int exiappHandDecodeNextEvent(bitstream_t* stream, exi_state_t* state,
+		exi_event_t* nextEvent) {
+	state->eventCode = 0;
+
+	switch (state->grammarStack[state->stackIndex]) {
+	case 5:
+		/* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */
+	case 22:
+		/* Element[START_ELEMENT(ProtocolNamespace)] */
+	case 3:
+		/* FirstStartTag[START_ELEMENT(AppProtocol)] */
+	case 42:
+		/* Element[START_ELEMENT(AppProtocol)] */
+	case 14:
+		/* Element[START_ELEMENT(SchemaID)] */
+	case 16:
+		/* Element[START_ELEMENT(Priority)] */
+	case 11:
+		/* Element[START_ELEMENT(VersionNumberMinor)] */
+	case 43:
+		/* FirstStartTag[START_ELEMENT(ResponseCode)] */
+	case 6:
+		/* Element[START_ELEMENT(VersionNumberMajor)] */
+	case 48:
+		/* Element[START_ELEMENT(ResponseCode)] */
+		errn = decodeNBitUnsignedInteger(stream, 1, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+			*nextEvent = EXI_EVENT_START_ELEMENT;
+			return errn;
+		case 1:
+			/* 2nd level events */
+			errn = exiDecodeNext2Event(stream, state, nextEvent);
+			return errn;
+		}
+		break;
+	case 109:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 113:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 12:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 140:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 70:
+		/* Element[CHARACTERS[STRING]] */
+	case 124:
+		/* Element[CHARACTERS[STRING]] */
+	case 57:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 97:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 135:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 91:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+	case 111:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 139:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 103:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 46:
+		/* Element[CHARACTERS[ENUMERATION]] */
+	case 86:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 7:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 133:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 123:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 61:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 99:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 120:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 107:
+		/* FirstStartTag[CHARACTERS[BINARY_HEX]] */
+	case 73:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 100:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 54:
+		/* Element[CHARACTERS[STRING]] */
+	case 59:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 68:
+		/* Element[CHARACTERS[STRING]] */
+	case 72:
+		/* Element[CHARACTERS[STRING]] */
+	case 63:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 94:
+		/* Element[CHARACTERS[STRING]] */
+	case 115:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 101:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 21:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 71:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 77:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 142:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 78:
+		/* Element[CHARACTERS[STRING]] */
+	case 121:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 134:
+		/* Element[CHARACTERS[STRING]] */
+	case 141:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 52:
+		/* Element[CHARACTERS[LIST]] */
+	case 102:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 96:
+		/* Element[CHARACTERS[FLOAT]] */
+	case 17:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 83:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 117:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 87:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 60:
+		/* Element[CHARACTERS[LIST]] */
+	case 82:
+		/* Element[CHARACTERS[BOOLEAN]] */
+	case 88:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 116:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 98:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 128:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 67:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 93:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 13:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 90:
+		/* Element[CHARACTERS[DECIMAL]] */
+	case 92:
+		/* Element[CHARACTERS[FLOAT]] */
+	case 53:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 137:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 81:
+		/* FirstStartTag[CHARACTERS[BOOLEAN]] */
+	case 79:
+		/* FirstStartTag[CHARACTERS[BINARY_BASE64]] */
+	case 119:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 143:
+		/* Element[CHARACTERS[STRING]] */
+	case 110:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 66:
+		/* Element[CHARACTERS[LIST]] */
+	case 51:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 112:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 58:
+		/* Element[CHARACTERS[STRING]] */
+	case 105:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 122:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 69:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 104:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 132:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 114:
+		/* Element[CHARACTERS[STRING]] */
+	case 45:
+		/* FirstStartTag[CHARACTERS[ENUMERATION]] */
+	case 65:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 108:
+		/* Element[CHARACTERS[BINARY_HEX]] */
+	case 84:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 129:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 106:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 55:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 74:
+		/* Element[CHARACTERS[STRING]] */
+	case 20:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 85:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 125:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 64:
+		/* Element[CHARACTERS[STRING]] */
+	case 62:
+		/* Element[CHARACTERS[STRING]] */
+	case 136:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 138:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 130:
+		/* Element[CHARACTERS[STRING]] */
+	case 126:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 15:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 118:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 131:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 10:
+		/* Element[CHARACTERS[STRING]] */
+	case 80:
+		/* Element[CHARACTERS[BINARY_BASE64]] */
+	case 89:
+		/* FirstStartTag[CHARACTERS[DECIMAL]] */
+	case 56:
+		/* Element[CHARACTERS[STRING]] */
+	case 127:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 95:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+	case 18:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		errn = decodeNBitUnsignedInteger(stream, 1, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+			*nextEvent = EXI_EVENT_CHARACTERS;
+			return errn;
+		case 1:
+			/* 2nd level events */
+			errn = exiDecodeNext2Event(stream, state, nextEvent);
+			return errn;
+		}
+		break;
+	case 2:
+		/* DocEnd[END_DOCUMENT] */
+		*nextEvent = EXI_EVENT_END_DOCUMENT;
+		return errn;
+	case 1:
+		/* DocContent[START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes), START_ELEMENT_GENERIC] */
+		errn = decodeNBitUnsignedInteger(stream, 2, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+		case 1:
+			*nextEvent = EXI_EVENT_START_ELEMENT;
+			return errn;
+		case 2:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC;
+			return errn;
+		}
+		break;
+	case 49:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 75:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		errn = decodeNBitUnsignedInteger(stream, 3, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+			*nextEvent = EXI_EVENT_ATTRIBUTE_GENERIC;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC;
+			return errn;
+		case 2:
+			*nextEvent = EXI_EVENT_END_ELEMENT;
+			return errn;
+		case 3:
+			*nextEvent = EXI_EVENT_CHARACTERS_GENERIC;
+			return errn;
+		case 4:
+			/* 2nd level events */
+			errn = exiDecodeNext2Event(stream, state, nextEvent);
+			return errn;
+		}
+		break;
+	case 50:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 76:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		errn = decodeNBitUnsignedInteger(stream, 2, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+			*nextEvent = EXI_EVENT_START_ELEMENT_GENERIC;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_END_ELEMENT;
+			return errn;
+		case 2:
+			*nextEvent = EXI_EVENT_CHARACTERS_GENERIC;
+			return errn;
+		case 3:
+			/* 2nd level events */
+			errn = exiDecodeNext2Event(stream, state, nextEvent);
+			return errn;
+		}
+		break;
+	case 34:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 40:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 44:
+		/* Element[START_ELEMENT(SchemaID), END_ELEMENT] */
+	case 25:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 31:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 39:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 33:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 26:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 32:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 38:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 35:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 24:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 30:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 4:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 37:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 29:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 23:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 27:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 36:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 28:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		errn = decodeNBitUnsignedInteger(stream, 2, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+			*nextEvent = EXI_EVENT_START_ELEMENT;
+			return errn;
+		case 1:
+			*nextEvent = EXI_EVENT_END_ELEMENT;
+			return errn;
+		case 2:
+			/* 2nd level events */
+			errn = exiDecodeNext2Event(stream, state, nextEvent);
+			return errn;
+		}
+		break;
+	case 0:
+		/* Document[START_DOCUMENT] */
+		*nextEvent = EXI_EVENT_START_DOCUMENT;
+		return errn;
+	case 8:
+		/* Element[END_ELEMENT] */
+	case 47:
+		/* Element[END_ELEMENT] */
+	case 19:
+		/* Element[END_ELEMENT] */
+	case 41:
+		/* Element[END_ELEMENT] */
+		errn = decodeNBitUnsignedInteger(stream, 1, &state->eventCode);
+		switch (state->eventCode) {
+		case 0:
+			*nextEvent = EXI_EVENT_END_ELEMENT;
+			return errn;
+		case 1:
+			/* 2nd level events */
+			errn = exiDecodeNext2Event(stream, state, nextEvent);
+			return errn;
+		}
+		break;
+
+	default:
+		*nextEvent = EXI_EVENT_ERROR;
+		return EXI_ERROR_UNEXPECTED_EVENT_LEVEL1;
+	}
+
+	return EXI_ERROR_UNEXPECTED_EVENT_LEVEL1;
+}
+
+int exiappHandDecodeStartDocument(bitstream_t* stream, exi_state_t* state) {
+	if ( state->grammarStack[state->stackIndex] == 0 ) {
+		/* move on */
+		state->grammarStack[state->stackIndex] = 1;
+		return 0;
+	} 
+
+	return EXI_ERROR_UNEXPECTED_START_DOCUMENT;
+}
+
+int exiappHandDecodeEndDocument(bitstream_t* stream, exi_state_t* state) {
+	if ( state->grammarStack[state->stackIndex] == 2) {
+		return 0;
+	} 
+
+	return EXI_ERROR_UNEXPECTED_END_DOCUMENT;
+}
+
+static int _exiDecodeStartElement(exi_state_t* state, eqname_t* se,
+		uint16_t ns, uint16_t ln, uint16_t stackId, uint16_t newState) {
+	se->namespaceURI = ns;
+	se->localPart = ln;
+	/* move on */
+	state->grammarStack[state->stackIndex] = stackId;
+	/* push element on stack */
+	return exiPushStack(state, newState, se);
+}
+
+
+int exiappHandDecodeStartElement(bitstream_t* stream, exi_state_t* state,
+		eqname_t* se) {
+	switch (state->grammarStack[state->stackIndex]) {
+	case 1:
+		/* DocContent[START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes), START_ELEMENT_GENERIC] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 4, 6, 2, 3);
+		case 1:
+			return _exiDecodeStartElement(state, se, 4, 7, 2, 43);
+		case 2:
+			return _exiDecodeStartElement(state, se, 65535, 65535, 2, 49);
+		}
+		break;
+	case 3:
+		/* FirstStartTag[START_ELEMENT(AppProtocol)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 4, 5);
+		}
+		break;
+	case 4:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 23, 5);
+		}
+		break;
+	case 5:
+		/* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 2, 6, 7);
+		}
+		break;
+	case 6:
+		/* Element[START_ELEMENT(VersionNumberMajor)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 5, 11, 12);
+		}
+		break;
+	case 11:
+		/* Element[START_ELEMENT(VersionNumberMinor)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 6, 14, 15);
+		}
+		break;
+	case 14:
+		/* Element[START_ELEMENT(SchemaID)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 4, 16, 17);
+		}
+		break;
+	case 16:
+		/* Element[START_ELEMENT(Priority)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 1, 19, 20);
+		}
+		break;
+	case 22:
+		/* Element[START_ELEMENT(ProtocolNamespace)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 2, 6, 7);
+		}
+		break;
+	case 23:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 24, 5);
+		}
+		break;
+	case 24:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 25, 5);
+		}
+		break;
+	case 25:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 26, 5);
+		}
+		break;
+	case 26:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 27, 5);
+		}
+		break;
+	case 27:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 28, 5);
+		}
+		break;
+	case 28:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 29, 5);
+		}
+		break;
+	case 29:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 30, 5);
+		}
+		break;
+	case 30:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 31, 5);
+		}
+		break;
+	case 31:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 32, 5);
+		}
+		break;
+	case 32:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 33, 5);
+		}
+		break;
+	case 33:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 34, 5);
+		}
+		break;
+	case 34:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 35, 5);
+		}
+		break;
+	case 35:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 36, 5);
+		}
+		break;
+	case 36:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 37, 5);
+		}
+		break;
+	case 37:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 38, 5);
+		}
+		break;
+	case 38:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 39, 5);
+		}
+		break;
+	case 39:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 40, 5);
+		}
+		break;
+	case 40:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 41, 5);
+		}
+		break;
+	case 42:
+		/* Element[START_ELEMENT(AppProtocol)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 0, 4, 5);
+		}
+		break;
+	case 43:
+		/* FirstStartTag[START_ELEMENT(ResponseCode)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 3, 44, 45);
+		}
+		break;
+	case 44:
+		/* Element[START_ELEMENT(SchemaID), END_ELEMENT] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 4, 47, 17);
+		}
+		break;
+	case 48:
+		/* Element[START_ELEMENT(ResponseCode)] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 0, 3, 44, 45);
+		}
+		break;
+	case 49:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		switch(state->eventCode) {
+		case 1:
+			return _exiDecodeStartElement(state, se, 65535, 65535, 50, 49);
+		}
+		break;
+	case 50:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 65535, 65535, 50, 49);
+		}
+		break;
+	case 75:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		switch(state->eventCode) {
+		case 1:
+			return _exiDecodeStartElement(state, se, 65535, 65535, 76, 49);
+		}
+		break;
+	case 76:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		switch(state->eventCode) {
+		case 0:
+			return _exiDecodeStartElement(state, se, 65535, 65535, 76, 49);
+		}
+		break;
+
+	default:
+		return EXI_ERROR_UNEXPECTED_START_ELEMENT;
+	}
+
+	return EXI_ERROR_UNEXPECTED_START_ELEMENT;
+}
+
+
+static int _exiDecodeNamespaceUri(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable,
+		string_ascii_t* namespaceURI, uint32_t* uriID) {
+	uint16_t uriSize, uriCodingLength;
+	int errn;
+
+	errn = exiGetUriSize(nameTable, runtimeTable, &uriSize);
+	if (errn) {
+		return errn;
+	}
+	/* URI Entries + 1 */
+	errn = exiGetCodingLength(uriSize + 1, &uriCodingLength);
+	if (errn) {
+		return errn;
+	}
+
+	errn = decodeNBitUnsignedInteger(stream, uriCodingLength, uriID);
+	if (errn) {
+		return errn;
+	}
+
+	if (*uriID == 0) {
+		/* uri string value was not found */
+		/* ==> zero (0) as an n-nit unsigned integer */
+		/* followed by uri encoded as string */
+		decodeStringASCII(stream, namespaceURI);
+		/* after encoding string value is added to table */
+		errn = exiAddUri(nameTable, runtimeTable, namespaceURI->chars);
+		if (errn) {
+			return errn;
+		}
+		*uriID = uriSize;
+	} else {
+		/* uri string value found */
+		/* ==> value(i+1) is encoded as n-bit unsigned integer */
+		*uriID = *uriID - 1;
+	}
+
+	return 0;
+}
+
+static int _exiDecodeLocalName(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable,
+		string_ascii_t* localName,
+		uint32_t* localNameID, uint32_t uriID) {
+	uint16_t slen;
+	uint16_t localNameSize;
+	uint16_t localNameCodingLength;
+
+
+	int errn = decodeUnsignedInteger16(stream, &slen);
+	if (errn) {
+		return errn;
+	}
+
+	if (slen > 0) {
+		/* string value was not found in local partition */
+		/* ==> string literal is encoded as a String */
+		/* with the length of the string incremented by one */
+		if (slen-- >= localName->size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		errn = decodeCharactersASCII(stream, slen, localName->chars);
+		if (errn) {
+			return errn;
+		}
+		/* After encoding the string value, it is added to the string table */
+		/* partition and assigned the next available compact identifier */
+		errn = exiAddLocalName(nameTable, runtimeTable, uriID, localName->chars);
+		if (errn) {
+			return errn;
+		}
+		/* TODO UCD Profile */
+		/* qname = addLocalName(localName, uriID); */
+	} else {
+		/* string value found in local partition */
+		/* ==> string value is represented as zero (0) encoded as an */
+		/* Unsigned Integer */
+		/* followed by an the compact identifier of the string value as an */
+		/* n-bit unsigned integer */
+		/* n is log2 m and m is the number of entries in the string table */
+		/* partition */
+		errn = exiGetLocalNameSize(nameTable, runtimeTable, uriID, &localNameSize);
+		if (errn) {
+			return errn;
+		}
+		errn = exiGetCodingLength(localNameSize, &localNameCodingLength);
+		if (errn) {
+			return errn;
+		}
+		errn = decodeNBitUnsignedInteger(stream, localNameCodingLength, localNameID);
+		if (errn) {
+			return errn;
+		}
+	}
+
+	return 0;
+}
+
+static int _exiDecodeQName(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable,
+		qname_t* qname) {
+	uint32_t uriID;
+	uint32_t localNameID;
+	/* const char * clocalName; */
+
+	/* uri */
+	int errn =_exiDecodeNamespaceUri(stream, nameTable, runtimeTable, &qname->namespaceURI, &uriID);
+	if (errn) {
+		return errn;
+	}
+	/* localName */
+	errn = _exiDecodeLocalName(stream, nameTable, runtimeTable, &qname->localName, &localNameID, uriID);
+	if (errn) {
+		return errn;
+	}
+
+	/*
+	errn = exiGetLocalName(nameTable, runtimeTable, uriID, localNameID, &clocalName);
+	if (errn) {
+		return errn;
+	}
+	strcpy ( qname->localName.chars, clocalName );
+	*/
+
+	return 0 ;
+}
+
+int exiappHandDecodeStartElementGeneric(bitstream_t* stream, exi_state_t* state,
+		qname_t* qname) {
+	/* decode qname */
+	int errn = _exiDecodeQName(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), qname);
+	if (errn) {
+		return errn;
+	}
+
+	switch (state->grammarStack[state->stackIndex]) {
+	/* $EXI_DECODE_START_ELEMENT_GENERIC$ */
+	case DOC_CONTENT:
+		/* move on to DocEnd */
+		state->grammarStack[state->stackIndex] = DOC_END;
+		/* push new ur-type grammar on stack */
+		return exiPushStack(state, UR_TYPE_GRAMMAR_0, NULL);
+		break;
+	case UR_TYPE_GRAMMAR_0:
+		/* move on to UR_TYPE_GRAMMAR_1 */
+		state->grammarStack[state->stackIndex] = UR_TYPE_GRAMMAR_1;
+		/* push new ur-type grammar on stack */
+		return exiPushStack(state, UR_TYPE_GRAMMAR_0, NULL);
+		break;
+	case UR_TYPE_GRAMMAR_1:
+		/* remain in UR_TYPE_GRAMMAR_1 */
+		/* push new ur-type grammar on stack */
+		return exiPushStack(state, UR_TYPE_GRAMMAR_0, NULL);
+		break;
+	default:
+		return EXI_ERROR_UNEXPECTED_START_ELEMENT_GENERIC;
+	}
+
+	return EXI_ERROR_UNEXPECTED_START_ELEMENT_GENERIC;
+}
+
+int exiappHandDecodeEndElement(bitstream_t* stream, exi_state_t* state, eqname_t* ee) {
+	/* copy IDs */
+	ee->localPart  = state->elementStack[state->stackIndex].localPart;
+	ee->namespaceURI = state->elementStack[state->stackIndex].namespaceURI;
+
+	return exiPopStack(state);
+}
+
+int exiappHandDecodeEndElementUndeclared(bitstream_t* stream, exi_state_t* state, eqname_t* ee) {
+	int16_t currentID = state->grammarStack[state->stackIndex];
+	if (currentID < 0) {
+		/* runtime grammars do have IDs smaller than 0 */
+		/* TODO learn EE event */
+		return -1;
+	}
+
+	return exiappHandDecodeEndElement(stream, state, ee);
+}
+
+int exiappHandDecodeCharacters(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	switch (state->grammarStack[state->stackIndex]) {
+	case 12:
+		/* UNSIGNED_INTEGER */
+	case 13:
+		/* UNSIGNED_INTEGER */
+	case 15:
+		/* UNSIGNED_INTEGER */
+	case 119:
+		/* UNSIGNED_INTEGER */
+	case 120:
+		/* UNSIGNED_INTEGER */
+	case 125:
+		/* UNSIGNED_INTEGER */
+	case 126:
+		/* UNSIGNED_INTEGER */
+	case 137:
+		/* UNSIGNED_INTEGER */
+	case 138:
+		/* UNSIGNED_INTEGER */
+	case 139:
+		/* UNSIGNED_INTEGER */
+	case 140:
+		/* UNSIGNED_INTEGER */
+	case 141:
+		/* UNSIGNED_INTEGER */
+		val->type = EXI_DATATYPE_UNSIGNED_INTEGER;
+		errn = decodeUnsignedInteger(stream, &val->integer);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 17:
+		/* NBIT_UNSIGNED_INTEGER */
+	case 18:
+		/* NBIT_UNSIGNED_INTEGER */
+	case 135:
+		/* NBIT_UNSIGNED_INTEGER */
+	case 136:
+		/* NBIT_UNSIGNED_INTEGER */
+		val->type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+		errn = decodeNBitUnsignedInteger(stream, 8, &bits);
+		val->integer.val.uint8 = bits + 0;
+		val->integer.type = EXI_UNSIGNED_INTEGER_8;
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 50:
+		/* STRING */
+	case 49:
+		/* STRING */
+		val->type = EXI_DATATYPE_STRING;
+		errn = decodeStringValue(stream, &val->string);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 50;
+		return 0;
+	case 101:
+		/* DATETIME */
+	case 102:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_GMONTHDAY, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 20:
+		/* NBIT_UNSIGNED_INTEGER */
+	case 21:
+		/* NBIT_UNSIGNED_INTEGER */
+		val->type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+		errn = decodeNBitUnsignedInteger(stream, 5, &bits);
+		val->integer.val.uint8 = bits + 1;
+		val->integer.type = EXI_UNSIGNED_INTEGER_8;
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 97:
+		/* DATETIME */
+	case 98:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_GDAY, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 51:
+		/* LIST */
+	case 52:
+		/* LIST */
+	case 59:
+		/* LIST */
+	case 60:
+		/* LIST */
+	case 65:
+		/* LIST */
+	case 66:
+		/* LIST */
+		val->type = EXI_DATATYPE_LIST;
+		/* List not supported properly yet */
+		val->list.type = EXI_DATATYPE_STRING;
+		errn = decodeUnsignedInteger16(stream, &val->list.len);
+		if (errn) {
+			return errn;
+		}
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 79:
+		/* BINARY_BASE64 */
+	case 80:
+		/* BINARY_BASE64 */
+		val->type = EXI_DATATYPE_BINARY_BASE64;
+		errn = decodeBinary(stream, &val->binary);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 89:
+		/* DECIMAL */
+	case 90:
+		/* DECIMAL */
+		val->type = EXI_DATATYPE_DECIMAL;
+		errn = decodeDecimal(stream, &val->decimal);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 99:
+		/* DATETIME */
+	case 100:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_GMONTH, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 91:
+		/* FLOAT */
+	case 92:
+		/* FLOAT */
+	case 95:
+		/* FLOAT */
+	case 96:
+		/* FLOAT */
+		val->type = EXI_DATATYPE_FLOAT;
+		errn = decodeFloat(stream, &val->float_me);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 107:
+		/* BINARY_HEX */
+	case 108:
+		/* BINARY_HEX */
+		val->type = EXI_DATATYPE_BINARY_HEX;
+		errn = decodeBinary(stream, &val->binary);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 83:
+		/* NBIT_UNSIGNED_INTEGER */
+	case 84:
+		/* NBIT_UNSIGNED_INTEGER */
+		val->type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+		errn = decodeNBitUnsignedInteger(stream, 8, &bits);
+		val->integer.val.int8 = bits -128;
+		val->integer.type = EXI_INTEGER_8;
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 85:
+		/* DATETIME */
+	case 86:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_DATE, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 103:
+		/* DATETIME */
+	case 104:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_GYEAR, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 131:
+		/* DATETIME */
+	case 132:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_TIME, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 105:
+		/* DATETIME */
+	case 106:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_GYEARMONTH, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 109:
+		/* INTEGER */
+	case 110:
+		/* INTEGER */
+	case 111:
+		/* INTEGER */
+	case 112:
+		/* INTEGER */
+	case 115:
+		/* INTEGER */
+	case 116:
+		/* INTEGER */
+	case 117:
+		/* INTEGER */
+	case 118:
+		/* INTEGER */
+	case 121:
+		/* INTEGER */
+	case 122:
+		/* INTEGER */
+	case 127:
+		/* INTEGER */
+	case 128:
+		/* INTEGER */
+		val->type = EXI_DATATYPE_INTEGER;
+		errn = decodeInteger(stream, &val->integer);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 7:
+		/* STRING */
+	case 10:
+		/* STRING */
+	case 53:
+		/* STRING */
+	case 54:
+		/* STRING */
+	case 55:
+		/* STRING */
+	case 56:
+		/* STRING */
+	case 57:
+		/* STRING */
+	case 58:
+		/* STRING */
+	case 61:
+		/* STRING */
+	case 62:
+		/* STRING */
+	case 63:
+		/* STRING */
+	case 64:
+		/* STRING */
+	case 67:
+		/* STRING */
+	case 68:
+		/* STRING */
+	case 69:
+		/* STRING */
+	case 70:
+		/* STRING */
+	case 71:
+		/* STRING */
+	case 72:
+		/* STRING */
+	case 73:
+		/* STRING */
+	case 74:
+		/* STRING */
+	case 77:
+		/* STRING */
+	case 78:
+		/* STRING */
+	case 93:
+		/* STRING */
+	case 94:
+		/* STRING */
+	case 113:
+		/* STRING */
+	case 114:
+		/* STRING */
+	case 123:
+		/* STRING */
+	case 124:
+		/* STRING */
+	case 129:
+		/* STRING */
+	case 130:
+		/* STRING */
+	case 133:
+		/* STRING */
+	case 134:
+		/* STRING */
+	case 142:
+		/* STRING */
+	case 143:
+		/* STRING */
+		val->type = EXI_DATATYPE_STRING;
+		errn = decodeStringValue(stream, &val->string);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 45:
+		/* ENUMERATION */
+	case 46:
+		/* ENUMERATION */
+		val->type = EXI_DATATYPE_ENUMERATION;
+		errn = decodeNBitUnsignedInteger(stream, 2, &val->enumeration);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 76:
+		/* STRING */
+	case 75:
+		/* STRING */
+		val->type = EXI_DATATYPE_STRING;
+		errn = decodeStringValue(stream, &val->string);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 76;
+		return 0;
+	case 87:
+		/* DATETIME */
+	case 88:
+		/* DATETIME */
+		val->type = EXI_DATATYPE_DATETIME;
+		errn = decodeDateTime(stream, EXI_DATETIME_DATETIME, &val->datetime);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+	case 81:
+		/* BOOLEAN */
+	case 82:
+		/* BOOLEAN */
+		val->type = EXI_DATATYPE_BOOLEAN;
+		errn = decodeBoolean(stream, &val->boolean);
+		if (errn) {
+			return errn;
+		}
+		/* move on */
+		state->grammarStack[state->stackIndex] = 8;
+		return 0;
+
+	default:
+		return EXI_ERROR_UNEXPECTED_CHARACTERS;
+	}
+
+	return 0;
+}
+
+int exiappHandDecodeCharactersGeneric(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	return exiappHandDecodeCharacters(stream, state, val);
+}
+
+int exiappHandDecodeCharactersGenericUndeclared(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	int errn = 0;
+	if (state->grammarStack[state->stackIndex] < 0) {
+		/* runtime grammars do have IDs smaller than 0 */
+		/* TODO learn CH event */
+		return -1;
+	}
+
+	/* update current rule --> element content rule (if not already) */
+	errn = exiMoveToElementContentRule(state);
+	if (errn) {
+		return errn;
+	}
+
+	/* read content value */
+	/* STRING */
+	val->type = EXI_DATATYPE_STRING;
+	errn = decodeStringValue(stream, &val->string);
+	return errn;
+}
+
+
+int exiappHandDecodeAttribute(bitstream_t* stream, exi_state_t* state,
+		eqname_t* at, exi_value_t* val) {
+	switch (state->grammarStack[state->stackIndex]) {
+
+	default:
+		return EXI_ERROR_UNEXPECTED_ATTRIBUTE;
+	}
+	return EXI_ERROR_UNEXPECTED_ATTRIBUTE;
+}
+
+
+
+int exiappHandDecodeAttributeXsiNil(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	errn = decodeBoolean(stream, &val->boolean);
+	if (errn >= 0 && val->boolean) {
+		/* handle xsi:nil == true */
+		 errn = exiHandleXsiNilTrue(state);
+	}
+	return errn;
+}
+
+
+int exiappHandDecodeAttributeXsiType(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	uint32_t uriID;
+	uint32_t localNameID;
+	/* uri */
+	errn =_exiDecodeNamespaceUri(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), NULL, &uriID);
+	if (errn) {
+		return errn;
+	}
+	/* localName */
+	errn = _exiDecodeLocalName(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), NULL, &localNameID, uriID);
+	if (errn) {
+		return errn;
+	}
+
+	val->eqname.namespaceURI = uriID;
+	val->eqname.localPart = localNameID;
+
+	/* handle xsi type cast */
+	errn = exiHandleXsiType(state, &val->eqname);
+
+	return errn;
+}
+
+int exiappHandDecodeAttributeGenericUndeclared(bitstream_t* stream, exi_state_t* state,
+		qname_t* at, exi_value_t* val) {
+	int errn;
+	int16_t currentID = state->grammarStack[state->stackIndex];
+
+	if (currentID < 0) {
+		/* TODO runtime elements */
+		return -1;
+	} else {
+		/* decode qname */
+		errn = _exiDecodeQName(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), at);
+		if (errn) {
+			return errn;
+		}
+	}
+
+
+	if (currentID < 0) {
+		/* TODO learn AT event */
+		return -1;
+	}
+
+	/* decode attribute value */
+	val->type = EXI_DATATYPE_STRING;
+	errn = decodeStringValue(stream, &val->string);
+
+	/* we do not move forward in grammars */
+
+	return errn;
+}
+
+
+
+#endif
+

+ 93 - 0
src/codec/appHandCodec/appHand_EXIDecoder.h

@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI_appHand_DECODER_H
+#define EXI_appHand_DECODER_H
+
+#include "EXITypes.h"
+
+int exiappHandInitDecoder(bitstream_t* stream, exi_state_t* state,
+		exi_name_table_runtime_t runtimeTable);
+
+int exiappHandDecodeNextEvent(bitstream_t* stream,
+		exi_state_t* state, exi_event_t* nextEvent);
+
+int exiappHandDecodeStartDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int exiappHandDecodeEndDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int
+exiappHandDecodeStartElement(bitstream_t* stream,
+		exi_state_t* state, eqname_t* se);
+
+int exiappHandDecodeStartElementGeneric(bitstream_t* stream,
+		exi_state_t* state, qname_t* qname);
+
+int exiappHandDecodeEndElement(bitstream_t* stream,
+		exi_state_t* state, eqname_t* ee);
+
+int exiappHandDecodeEndElementUndeclared(bitstream_t* stream,
+		exi_state_t* state, eqname_t* ee);
+
+int exiappHandDecodeCharacters(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandDecodeCharactersGeneric(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandDecodeCharactersGenericUndeclared(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandDecodeAttribute(bitstream_t* stream,
+		exi_state_t* state, eqname_t* at, exi_value_t* val);
+
+int exiappHandDecodeAttributeXsiNil(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandDecodeAttributeXsiType(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandDecodeAttributeGenericUndeclared(bitstream_t* stream,
+		exi_state_t* state, qname_t* at, exi_value_t* val);
+
+int exiappHandDecodeListValue(bitstream_t* stream, exi_value_t* val,
+		list_t lt);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

+ 2021 - 0
src/codec/appHandCodec/appHand_EXIEncoder.c

@@ -0,0 +1,2021 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef EXI_appHand_ENCODER_C
+#define EXI_appHand_ENCODER_C
+
+#include "EXITypes.h"
+#include "BitOutputStream.h"
+#include "EncoderChannel.h"
+
+#include "StringTable.h"
+#include "appHand_NameTableEntries.h"
+#include "MethodsBag.h"
+
+#include "EXICoder.h"
+#include "EXIHeaderEncoder.h"
+
+
+
+
+/* local variables */
+static uint32_t bits;
+static int errn;
+
+/* ==================================== */
+
+
+int exiappHandEncodeListValue(bitstream_t* stream, exi_value_t* val, list_t lt) {
+
+	switch(lt.type) {
+	case EXI_DATATYPE_BINARY_BASE64:
+	case EXI_DATATYPE_BINARY_HEX:
+		errn = encodeBinary(stream, &val->binary);
+		break;
+	case EXI_DATATYPE_BOOLEAN:
+		errn = encodeBoolean(stream, val->boolean);
+		break;
+	case EXI_DATATYPE_BOOLEAN_FACET:
+		errn = encodeNBitUnsignedInteger(stream, 2, val->boolean ? 2 : 0);
+		break;
+	case EXI_DATATYPE_DECIMAL:
+		errn = encodeDecimal(stream, &val->decimal);
+		break;
+	case EXI_DATATYPE_FLOAT:
+		errn = encodeFloat(stream, &val->float_me);
+		break;
+	case EXI_DATATYPE_NBIT_UNSIGNED_INTEGER:
+	case EXI_DATATYPE_UNSIGNED_INTEGER:
+	case EXI_DATATYPE_INTEGER:
+		switch(lt.intType) {
+		/* (Signed) Integer */
+		case EXI_UNSIGNED_INTEGER_8:
+		case EXI_UNSIGNED_INTEGER_16:
+		case EXI_UNSIGNED_INTEGER_32:
+		case EXI_UNSIGNED_INTEGER_64:
+			errn = encodeUnsignedInteger(stream, &val->integer);
+			break;
+		/* (Signed) Integer */
+		case EXI_INTEGER_8:
+		case EXI_INTEGER_16:
+		case EXI_INTEGER_32:
+		case EXI_INTEGER_64:
+			errn = encodeInteger(stream, &val->integer);
+			break;
+		}
+		break;
+	case EXI_DATATYPE_DATETIME:
+		errn = encodeDateTime(stream, &val->datetime);
+		break;
+	case EXI_DATATYPE_STRING:
+		errn = encodeStringValue(stream, &val->string);
+		break;
+	default:
+		return EXI_UNSUPPORTED_LIST_VALUE_TYPE;
+	}
+
+	return errn;
+}
+
+
+
+/* <0 ... Error, 1 .. Not-Found, 0.. Success */
+static int _exiGet1stLevelEventCode(exi_state_t* state, exi_event_t eventType, uint16_t* resGrammarID) {
+	/* retrieve current grammar-rule ID */
+	uint16_t grammarID = state->grammarStack[ state->stackIndex ];
+
+	switch(grammarID) {
+	case DOCUMENT:
+		switch(eventType) {
+		case EXI_EVENT_START_DOCUMENT:
+			*resGrammarID = 0;
+			return 0;
+		default:
+			return 1; /* not found */
+		}
+		break;
+	case DOC_CONTENT:
+		switch(eventType) {
+		/* TODO other IDs */
+		case EXI_EVENT_START_ELEMENT_GENERIC:
+			*resGrammarID = 0;
+			return 0;
+		default:
+			return 1; /* not found */
+		}
+		break;
+	case DOC_END:
+		switch(eventType) {
+		case EXI_EVENT_END_DOCUMENT:
+			*resGrammarID = 0;
+			return 0;
+		default:
+			return 1; /* not found */
+		}
+		break;
+	case UR_TYPE_GRAMMAR_0:
+		switch(eventType) {
+		case EXI_EVENT_ATTRIBUTE_GENERIC:
+			*resGrammarID = 0;
+			return 0;
+		case EXI_EVENT_START_ELEMENT_GENERIC:
+			*resGrammarID = 1;
+			return 0;
+		case EXI_EVENT_END_ELEMENT:
+			*resGrammarID = 2;
+			return 0;
+		case EXI_EVENT_CHARACTERS_GENERIC:
+			*resGrammarID = 3;
+			return 0;
+		default:
+			return 1; /* not found */
+		}
+		break;
+	case UR_TYPE_GRAMMAR_1:
+		switch(eventType) {
+		case EXI_EVENT_START_ELEMENT_GENERIC:
+			*resGrammarID = 0;
+			return 0;
+		case EXI_EVENT_END_ELEMENT:
+			*resGrammarID = 1;
+			return 0;
+		case EXI_EVENT_CHARACTERS_GENERIC:
+			*resGrammarID = 2;
+			return 0;
+		default:
+			return 1; /* not found */
+		}
+		break;
+	}
+
+	return 1; /* not found */
+}
+
+
+static int _exiGetEventCodeLength(exi_state_t* state, uint16_t* eventCodeLength) {
+	/* retrieve current grammar-rule ID */
+	uint16_t grammarID = state->grammarStack[ state->stackIndex ];
+
+	switch(grammarID) {
+	/* TODO OTHER IDs */
+	case DOCUMENT:
+		*eventCodeLength = 0;
+		return 0;
+	case DOC_CONTENT:
+		/* TODO other root elements */
+		*eventCodeLength = IS_STRICT ? 0 : 1;
+		return 0;
+	case DOC_END:
+		*eventCodeLength = IS_STRICT ? 0 : 1;
+		return 0;
+	case UR_TYPE_GRAMMAR_0:
+		*eventCodeLength = IS_STRICT ? 4 : 5;
+		return 0;
+	case UR_TYPE_GRAMMAR_1:
+		*eventCodeLength = IS_STRICT ? 3 : 4;
+		return 0;
+	}
+
+	return EXI_ERROR_UNEXPECTED_GRAMMAR_ID;
+}
+
+static int _encodeNBitIntegerValue(bitstream_t* stream, integer_t* iv, uint16_t nbits, int32_t lowerBound) {
+	int errn;
+	uint32_t val;
+	switch(iv->type) {
+	/* Unsigned Integer */
+	case EXI_UNSIGNED_INTEGER_8:
+		val = iv->val.int8 - lowerBound;
+		break;
+	case EXI_UNSIGNED_INTEGER_16:
+		val = iv->val.int16 - lowerBound;
+		break;
+	case EXI_UNSIGNED_INTEGER_32:
+		val = iv->val.int32 - lowerBound;
+		break;
+	case EXI_UNSIGNED_INTEGER_64:
+		val = iv->val.int64 - lowerBound;
+		break;
+	/* (Signed) Integer */
+	case EXI_INTEGER_8:
+		val = iv->val.uint8 - lowerBound;
+		break;
+	case EXI_INTEGER_16:
+		val = iv->val.uint16 - lowerBound;
+		break;
+	case EXI_INTEGER_32:
+		val = iv->val.uint32 - lowerBound;
+		break;
+	case EXI_INTEGER_64:
+		val = iv->val.uint64 - lowerBound;
+		break;
+	}
+
+	errn = encodeNBitUnsignedInteger(stream, nbits, val);
+	return errn;
+}
+
+#define MAX_NUMBER_CHARACTERS 50
+char nameCharacters [MAX_NUMBER_CHARACTERS];
+
+/*
+#define MAX_NUMBER_URI 1
+#define MAX_NUMBER_LOCALNAMES 0
+char * uris [MAX_NUMBER_URI];
+exi_name_table_runtime_t nameTableRuntime = {MAX_NUMBER_URI, uris, 0};
+*/
+
+int exiappHandInitEncoder(bitstream_t* stream, exi_state_t* state, exi_name_table_runtime_t runtimeTable) {
+	/* init grammar state */
+	state->stackIndex = 0;
+	state->grammarStack[0] = DOCUMENT;
+	/* string tables */
+	state->nameTablePrepopulated = exiappHandNameTablePrepopulated;
+	state->nameTableRuntime = runtimeTable;
+	/* encode header */
+	return writeEXIHeader(stream);
+}
+
+int exiappHandEncodeStartDocument(bitstream_t* stream, exi_state_t* state) {
+	if ( state->grammarStack[state->stackIndex] == 0 ) {
+		/* move on */
+		state->grammarStack[state->stackIndex] = 1;
+		return 0;
+	} 
+
+	return EXI_ERROR_UNEXPECTED_START_DOCUMENT;
+}
+
+int exiappHandEncodeEndDocument(bitstream_t* stream, exi_state_t* state) {
+	if ( state->grammarStack[state->stackIndex] == 2) {
+		encodeFinish(stream);
+		return 0;
+	} 
+
+	return EXI_ERROR_UNEXPECTED_END_DOCUMENT;
+}
+
+static int _exiEncodeNamespaceUriID(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable, uint16_t uriID) {
+	int errn;
+	uint16_t uriCodingLength;
+	uint16_t uriSize;
+
+	errn = exiGetUriSize(nameTable, runtimeTable, &uriSize);
+	if (errn) {
+		return errn;
+	}
+	/* URI Entries + 1 */
+	errn = exiGetCodingLength(uriSize + 1, &uriCodingLength);
+	if (errn) {
+		return errn;
+	}
+
+	/* uri string value found */
+	/* ==> value(i+1) is encoded as n-bit unsigned integer */
+	errn = encodeNBitUnsignedInteger(stream, uriCodingLength, uriID+1);
+
+	return errn;
+}
+
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+static int _exiEncodeNamespaceUri(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable,
+		char** uri, uint16_t* uriID) {
+	int errn;
+	uint16_t uriCodingLength;
+	uint16_t uriSize;
+
+	errn = exiGetUriSize(nameTable, runtimeTable, &uriSize);
+	if (errn) {
+		return errn;
+	}
+	/* URI Entries + 1 */
+	errn = exiGetCodingLength(uriSize + 1, &uriCodingLength);
+	if (errn) {
+		return errn;
+	}
+
+	errn = exiGetUriID(nameTable, runtimeTable, *uri, uriID);
+	if (errn < 0) {
+		return errn;
+	} else if (errn == 1) {
+		/* uri string value was not found */
+		/* ==> zero (0) as an n-nit unsigned integer */
+		/* followed by uri encoded as string */
+		errn = encodeNBitUnsignedInteger(stream, uriCodingLength, 0);
+		if (errn) {
+			return errn;
+		}
+		/* ASCII String */
+		errn = encodeASCII(stream, *uri);
+		if (errn) {
+			return errn;
+		}
+		/* after encoding string value is added to table */
+		/* in UCD Profile NOT */
+		*uriID = uriSize;
+	} else {
+		/* uri string value found */
+		/* ==> value(i+1) is encoded as n-bit unsigned integer */
+		errn = encodeNBitUnsignedInteger(stream, uriCodingLength, *uriID + 1);
+	}
+
+	return errn;
+}
+#endif /*EXI_DEBUG*/
+
+
+static int _exiEncodeLocalNameID(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable,
+		uint16_t uriID, uint16_t localNameID) {
+	int errn;
+	uint16_t localNameSize;
+	uint16_t localNameCodingLength;
+
+	/* string value found in local partition */
+	/* ==> string value is represented as zero (0) encoded as an */
+	errn = encodeUnsignedInteger32(stream, 0 );
+	if (errn < 0) {
+		return errn;
+	}
+	/* Unsigned Integer followed by an the compact identifier of the */
+	/* string value as an n-bit unsigned integer n is log2 m and m is */
+	/* the number of entries in the string table partition */
+	errn = exiGetLocalNameSize(nameTable, runtimeTable, uriID, &localNameSize);
+	if (errn < 0) {
+		return errn;
+	}
+	errn = exiGetCodingLength(localNameSize, &localNameCodingLength);
+	if (errn) {
+		return errn;
+	}
+	errn = encodeNBitUnsignedInteger(stream, localNameCodingLength, localNameID);
+	return errn;
+
+}
+
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+static int _exiEncodeLocalName(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable, exi_name_table_runtime_t* runtimeTable,
+		char** localName,
+		uint16_t uriID) {
+	int errn;
+	uint16_t localNameID;
+	uint16_t localNameSize;
+	uint16_t localNameCodingLength;
+	uint32_t slen;
+
+	/* look for localNameID */
+	errn = exiGetLocalNameID(nameTable, runtimeTable, uriID, *localName, &localNameID);
+	if (errn < 0) {
+		return errn;
+	}
+
+	if (errn == 1) {
+		/* string value was not found in local partition */
+		/* ==> string literal is encoded as a String */
+		/* with the length of the string incremented by one */
+		slen = (uint32_t)strlen(*localName);
+		errn = encodeUnsignedInteger32(stream, slen + 1 );
+		if (errn >= 0) {
+			errn = encodeASCIICharacters(stream, *localName, slen);
+		}
+	} else {
+		/* string value found in local partition */
+		/* ==> string value is represented as zero (0) encoded as an */
+		errn = encodeUnsignedInteger32(stream, 0 );
+		if (errn < 0) {
+			return errn;
+		}
+		/* Unsigned Integer followed by an the compact identifier of the */
+		/* string value as an n-bit unsigned integer n is log2 m and m is */
+		/* the number of entries in the string table partition */
+		errn = exiGetLocalNameSize(nameTable, runtimeTable, uriID, &localNameSize);
+		if (errn < 0) {
+			return errn;
+		}
+		errn = exiGetCodingLength(localNameSize, &localNameCodingLength);
+		if (errn) {
+			return errn;
+		}
+		errn = encodeNBitUnsignedInteger(stream, localNameCodingLength, localNameID);
+	}
+
+	return errn;
+}
+#endif /*EXI_DEBUG*/
+
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+static int _exiEncodeQName(bitstream_t* stream, exi_name_table_prepopulated_t* nameTable,  exi_name_table_runtime_t* runtimeTable,
+		char** uri, char** localName) {
+	uint16_t uriID;
+	/* uri */
+	int errn =_exiEncodeNamespaceUri(stream, nameTable, runtimeTable, uri, &uriID);
+	if (errn) {
+		return errn;
+	}
+	/* localName */
+	errn = _exiEncodeLocalName(stream, nameTable, runtimeTable, localName, uriID);
+	if (errn) {
+		return errn;
+	}
+
+	return 0 ;
+}
+#endif /*EXI_DEBUG*/
+
+
+static int _exiEncodeStartElement(bitstream_t* stream, uint16_t nbits,
+		uint32_t val, exi_state_t* state, eqname_t* se, uint16_t stackId,
+		uint16_t newState) {
+	/* event-code */
+	int errn = encodeNBitUnsignedInteger(stream, nbits, val);
+	if (errn) {
+		return errn;
+	}
+	/* move on */
+	state->grammarStack[state->stackIndex] = stackId;
+	/* push element on stack */
+	return exiPushStack(state, newState, se);
+}
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+
+static eqname_t eqnGeneric = {65535, 65535}; /* UNSIGNED_INT16_MAX */
+
+static int _exiEncodeStartElementGeneric(bitstream_t* stream, uint16_t nbits,
+		uint32_t val, exi_state_t* state, char** uri, char** localName, uint16_t stackId,
+		uint16_t newState) {
+	uint16_t uriID;
+	/* event-code */
+	int errn = encodeNBitUnsignedInteger(stream, nbits, val);
+	if (errn) {
+		return errn;
+	}
+	/* qualified name */
+	errn = _exiEncodeNamespaceUri(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), uri, &uriID);
+	if (errn) {
+		return errn;
+	}
+	errn = _exiEncodeLocalName(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), localName, uriID);
+	if (errn) {
+		return errn;
+	}
+
+	/* move on */
+	state->grammarStack[state->stackIndex] = stackId;
+	/* push element on stack */
+	return exiPushStack(state, newState, &eqnGeneric);
+}
+#endif /*EXI_DEBUG*/
+
+int exiappHandEncodeStartElement(bitstream_t* stream, exi_state_t* state, eqname_t* se) {
+	switch (state->grammarStack[state->stackIndex]) {
+		case 1:
+		/* DocContent[START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes), START_ELEMENT_GENERIC] */ 
+		if ( se->localPart == 6 && se->namespaceURI == 4  ) {
+			/* SE( {urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 2, 3);
+		}
+		else if ( se->localPart == 7 && se->namespaceURI == 4 ) {
+			/* SE( {urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes ) */
+			return _exiEncodeStartElement(stream, 2, 1, state, se, 2, 43);
+		}
+		else {
+			/* SE( null ) */
+			return _exiEncodeStartElement(stream, 2, 2, state, se, 2, 49);
+		}
+		break;
+	case 3:
+		/* FirstStartTag[START_ELEMENT(AppProtocol)] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 4, 5);
+		}
+		break;
+	case 4:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 23, 5);
+		}
+		break;
+	case 5:
+		/* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */ 
+		if ( se->localPart == 2 && se->namespaceURI == 0  ) {
+			/* SE( ProtocolNamespace ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 6, 7);
+		}
+		break;
+	case 6:
+		/* Element[START_ELEMENT(VersionNumberMajor)] */ 
+		if ( se->localPart == 5 && se->namespaceURI == 0  ) {
+			/* SE( VersionNumberMajor ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 11, 12);
+		}
+		break;
+	case 11:
+		/* Element[START_ELEMENT(VersionNumberMinor)] */ 
+		if ( se->localPart == 6 && se->namespaceURI == 0  ) {
+			/* SE( VersionNumberMinor ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 14, 15);
+		}
+		break;
+	case 14:
+		/* Element[START_ELEMENT(SchemaID)] */ 
+		if ( se->localPart == 4 && se->namespaceURI == 0  ) {
+			/* SE( SchemaID ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 16, 17);
+		}
+		break;
+	case 16:
+		/* Element[START_ELEMENT(Priority)] */ 
+		if ( se->localPart == 1 && se->namespaceURI == 0  ) {
+			/* SE( Priority ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 19, 20);
+		}
+		break;
+	case 22:
+		/* Element[START_ELEMENT(ProtocolNamespace)] */ 
+		if ( se->localPart == 2 && se->namespaceURI == 0  ) {
+			/* SE( ProtocolNamespace ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 6, 7);
+		}
+		break;
+	case 23:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 24, 5);
+		}
+		break;
+	case 24:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 25, 5);
+		}
+		break;
+	case 25:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 26, 5);
+		}
+		break;
+	case 26:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 27, 5);
+		}
+		break;
+	case 27:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 28, 5);
+		}
+		break;
+	case 28:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 29, 5);
+		}
+		break;
+	case 29:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 30, 5);
+		}
+		break;
+	case 30:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 31, 5);
+		}
+		break;
+	case 31:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 32, 5);
+		}
+		break;
+	case 32:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 33, 5);
+		}
+		break;
+	case 33:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 34, 5);
+		}
+		break;
+	case 34:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 35, 5);
+		}
+		break;
+	case 35:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 36, 5);
+		}
+		break;
+	case 36:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 37, 5);
+		}
+		break;
+	case 37:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 38, 5);
+		}
+		break;
+	case 38:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 39, 5);
+		}
+		break;
+	case 39:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 40, 5);
+		}
+		break;
+	case 40:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 41, 5);
+		}
+		break;
+	case 42:
+		/* Element[START_ELEMENT(AppProtocol)] */ 
+		if ( se->localPart == 0 && se->namespaceURI == 0  ) {
+			/* SE( AppProtocol ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 4, 5);
+		}
+		break;
+	case 43:
+		/* FirstStartTag[START_ELEMENT(ResponseCode)] */ 
+		if ( se->localPart == 3 && se->namespaceURI == 0  ) {
+			/* SE( ResponseCode ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 44, 45);
+		}
+		break;
+	case 44:
+		/* Element[START_ELEMENT(SchemaID), END_ELEMENT] */ 
+		if ( se->localPart == 4 && se->namespaceURI == 0  ) {
+			/* SE( SchemaID ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 47, 17);
+		}
+		break;
+	case 48:
+		/* Element[START_ELEMENT(ResponseCode)] */ 
+		if ( se->localPart == 3 && se->namespaceURI == 0  ) {
+			/* SE( ResponseCode ) */
+			return _exiEncodeStartElement(stream, 1, 0, state, se, 44, 45);
+		}
+		break;
+	case 49:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */ 
+		{
+			/* SE( null ) */
+			return _exiEncodeStartElement(stream, 3, 1, state, se, 50, 49);
+		}
+		break;
+	case 50:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */ 
+		{
+			/* SE( null ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 50, 49);
+		}
+		break;
+	case 75:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */ 
+		{
+			/* SE( null ) */
+			return _exiEncodeStartElement(stream, 3, 1, state, se, 76, 49);
+		}
+		break;
+	case 76:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */ 
+		{
+			/* SE( null ) */
+			return _exiEncodeStartElement(stream, 2, 0, state, se, 76, 49);
+		}
+		break;
+
+	default:
+		return EXI_ERROR_UNEXPECTED_START_ELEMENT;
+	}
+
+	return EXI_ERROR_UNEXPECTED_START_ELEMENT;
+}
+
+/* Qualified Name unknown!! */
+#if EXI_DEBUG == EXI_DEBUG_ON
+static int exiEncodeStartElementGenericUnknown(bitstream_t* stream, exi_state_t* state,
+		char** uri, char** localName) {
+	uint16_t grammarID;
+	uint16_t eventCodeLength;
+
+	int errn = _exiGet1stLevelEventCode(state, EXI_EVENT_START_ELEMENT_GENERIC, &grammarID);
+	if (errn < 0) {
+		return errn;
+	} else if (errn == 1) {
+		/* not found --> try undeclared SE */
+		errn = _exiGet1stLevelEventCode(state, EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED, &grammarID);
+		if (errn < 0) {
+			return errn;
+		} else if (errn == 1) {
+			/* Should never happen except in STRICT mode */
+			return EXI_ERROR_UNEXPECTED_EVENT_LEVEL1;
+		} else {
+			/* found START_ELEMENT_GENERIC_UNDECLARED */
+			errn = _exiGetEventCodeLength(state, &eventCodeLength);
+			if (errn < 0) {
+				return errn;
+			} else {
+				/* encode event code*/
+				errn = encodeNBitUnsignedInteger(stream, eventCodeLength, grammarID);
+				if (errn) {
+					return errn;
+				}
+			}
+		}
+	} else {
+		/* found START_ELEMENT_GENERIC */
+		errn = _exiGetEventCodeLength(state, &eventCodeLength);
+		if (errn < 0) {
+			return errn;
+		} else {
+			/* encode event code*/
+			errn = encodeNBitUnsignedInteger(stream, eventCodeLength, grammarID);
+			if (errn) {
+				return errn;
+			}
+		}
+	}
+
+	/* encode qualified name */
+	errn = _exiEncodeQName(stream, &(state->nameTablePrepopulated), &(state->nameTableRuntime), uri, localName);
+	if (errn) {
+		return errn;
+	}
+
+	/* learn event, not in UCD Profile */
+
+	/* move on */
+	/* push element on stack */
+
+	switch (state->grammarStack[state->stackIndex]) {
+	/* $EXI_ENCODE_START_ELEMENT_GENERIC$ */
+	case DOC_CONTENT:
+		/* move on to DocEnd */
+		state->grammarStack[state->stackIndex] = DOC_END;
+		/* push new ur-type grammar on stack */
+		return exiPushStack(state, UR_TYPE_GRAMMAR_0, NULL);
+		break;
+	case UR_TYPE_GRAMMAR_0:
+		/* move on to UR_TYPE_GRAMMAR_1 */
+		state->grammarStack[state->stackIndex] = UR_TYPE_GRAMMAR_1;
+		/* push new ur-type grammar on stack */
+		return exiPushStack(state, UR_TYPE_GRAMMAR_0, NULL);
+		break;
+	case UR_TYPE_GRAMMAR_1:
+		/* remain in UR_TYPE_GRAMMAR_1 */
+		/* push new ur-type grammar on stack */
+		return exiPushStack(state, UR_TYPE_GRAMMAR_0, NULL);
+		break;
+	default:
+		return EXI_ERROR_UNEXPECTED_START_ELEMENT_GENERIC;
+	}
+
+
+
+	return 0;
+}
+#endif /*EXI_DEBUG*/
+
+
+/* Look first for qualified name */
+int exiappHandEncodeStartElementGeneric(bitstream_t* stream, exi_state_t* state,
+		string_ascii_t* namespaceURI , string_ascii_t* localName) {
+	int errn = -1;
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+	eqname_t se;
+	/* uri */
+	errn = exiGetUriID(&(state->nameTablePrepopulated), &(state->nameTableRuntime), namespaceURI->chars, &se.namespaceURI);
+	if (errn == -1) {
+		return errn;
+	} else if (errn == 1) {
+		/* No URI (and localNameID) found  */
+		exiEncodeStartElementGenericUnknown(stream, state, &(namespaceURI->chars), &(localName->chars));
+	} else {
+		/* localName */
+		errn = exiGetLocalNameID(&(state->nameTablePrepopulated), &(state->nameTableRuntime), se.namespaceURI, localName->chars, &se.localPart);
+		if (errn == -1) {
+			return errn;
+		} else if (errn == 1) {
+			/* No localName found, use generic StartElement(*) method */
+			exiEncodeStartElementGenericUnknown(stream, state, &(namespaceURI->chars), &(localName->chars));
+		} else {
+			/* Uri&LocalName found, use "efficient" StartElement method */
+			return exiappHandEncodeStartElement(stream, state, &se);
+		}
+	}
+#endif /*EXI_DEBUG*/
+
+	return errn;
+}
+
+static int _exiEncodeEndElementUndeclared(bitstream_t* stream, exi_state_t* state) {
+	int16_t currentID = state->grammarStack[state->stackIndex];
+	switch (currentID) {
+	case 9:
+		/* Element[] */
+		/* 1st level and 2nd level event code */
+		encodeNBitUnsignedInteger(stream, 0, 0);
+		encodeNBitUnsignedInteger(stream, 2, 0);
+		return 0;
+	case 70:
+		/* Element[CHARACTERS[STRING]] */
+	case 124:
+		/* Element[CHARACTERS[STRING]] */
+	case 139:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 46:
+		/* Element[CHARACTERS[ENUMERATION]] */
+	case 22:
+		/* Element[START_ELEMENT(ProtocolNamespace)] */
+	case 86:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 120:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 100:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 54:
+		/* Element[CHARACTERS[STRING]] */
+	case 68:
+		/* Element[CHARACTERS[STRING]] */
+	case 72:
+		/* Element[CHARACTERS[STRING]] */
+	case 94:
+		/* Element[CHARACTERS[STRING]] */
+	case 21:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 78:
+		/* Element[CHARACTERS[STRING]] */
+	case 134:
+		/* Element[CHARACTERS[STRING]] */
+	case 141:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 52:
+		/* Element[CHARACTERS[LIST]] */
+	case 102:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 96:
+		/* Element[CHARACTERS[FLOAT]] */
+	case 60:
+		/* Element[CHARACTERS[LIST]] */
+	case 82:
+		/* Element[CHARACTERS[BOOLEAN]] */
+	case 88:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 116:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 98:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 128:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 13:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 90:
+		/* Element[CHARACTERS[DECIMAL]] */
+	case 92:
+		/* Element[CHARACTERS[FLOAT]] */
+	case 42:
+		/* Element[START_ELEMENT(AppProtocol)] */
+	case 143:
+		/* Element[CHARACTERS[STRING]] */
+	case 110:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 66:
+		/* Element[CHARACTERS[LIST]] */
+	case 112:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 58:
+		/* Element[CHARACTERS[STRING]] */
+	case 14:
+		/* Element[START_ELEMENT(SchemaID)] */
+	case 122:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 16:
+		/* Element[START_ELEMENT(Priority)] */
+	case 104:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 132:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 114:
+		/* Element[CHARACTERS[STRING]] */
+	case 108:
+		/* Element[CHARACTERS[BINARY_HEX]] */
+	case 84:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 106:
+		/* Element[CHARACTERS[DATETIME]] */
+	case 11:
+		/* Element[START_ELEMENT(VersionNumberMinor)] */
+	case 74:
+		/* Element[CHARACTERS[STRING]] */
+	case 6:
+		/* Element[START_ELEMENT(VersionNumberMajor)] */
+	case 64:
+		/* Element[CHARACTERS[STRING]] */
+	case 62:
+		/* Element[CHARACTERS[STRING]] */
+	case 136:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 130:
+		/* Element[CHARACTERS[STRING]] */
+	case 126:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 118:
+		/* Element[CHARACTERS[INTEGER]] */
+	case 48:
+		/* Element[START_ELEMENT(ResponseCode)] */
+	case 10:
+		/* Element[CHARACTERS[STRING]] */
+	case 80:
+		/* Element[CHARACTERS[BINARY_BASE64]] */
+	case 56:
+		/* Element[CHARACTERS[STRING]] */
+	case 18:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		/* 1st level and 2nd level event code */
+		encodeNBitUnsignedInteger(stream, 1, 1);
+		encodeNBitUnsignedInteger(stream, 2, 0);
+		return 0;
+	case 109:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 113:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 12:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 140:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 57:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 97:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 135:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 5:
+		/* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */
+	case 91:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+	case 111:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 103:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 7:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 133:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 123:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 61:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 99:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 107:
+		/* FirstStartTag[CHARACTERS[BINARY_HEX]] */
+	case 73:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 59:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 63:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 115:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 101:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 71:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 77:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 142:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 121:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 17:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 83:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 117:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 3:
+		/* FirstStartTag[START_ELEMENT(AppProtocol)] */
+	case 87:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 67:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 93:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 53:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 137:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 81:
+		/* FirstStartTag[CHARACTERS[BOOLEAN]] */
+	case 79:
+		/* FirstStartTag[CHARACTERS[BINARY_BASE64]] */
+	case 119:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 51:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 105:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 69:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 45:
+		/* FirstStartTag[CHARACTERS[ENUMERATION]] */
+	case 65:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+	case 129:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 55:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+	case 43:
+		/* FirstStartTag[START_ELEMENT(ResponseCode)] */
+	case 20:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+	case 85:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 125:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 138:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 15:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+	case 131:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+	case 89:
+		/* FirstStartTag[CHARACTERS[DECIMAL]] */
+	case 127:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+	case 95:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+		/* 1st level and 2nd level event code */
+		encodeNBitUnsignedInteger(stream, 1, 1);
+		encodeNBitUnsignedInteger(stream, 3, 0);
+		return 0;
+
+	}
+	return EXI_ERROR_UNEXPECTED_END_ELEMENT;
+}
+
+int exiappHandEncodeEndElement(bitstream_t* stream, exi_state_t* state) {
+	int errn = 0;
+	int16_t currentID = state->grammarStack[state->stackIndex];
+	switch (currentID) {
+	case 49:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 75:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		errn = encodeNBitUnsignedInteger(stream, 3, 2);
+		break;
+	case 40:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 39:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 38:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 37:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 36:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 35:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 34:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 33:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 32:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 31:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 30:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 29:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 28:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 27:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 26:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 25:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 24:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 23:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 4:
+		/* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
+	case 44:
+		/* Element[START_ELEMENT(SchemaID), END_ELEMENT] */
+	case 50:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+	case 76:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		errn = encodeNBitUnsignedInteger(stream, 2, 1);
+		break;
+	case 8:
+		/* Element[END_ELEMENT] */
+	case 19:
+		/* Element[END_ELEMENT] */
+	case 41:
+		/* Element[END_ELEMENT] */
+	case 47:
+		/* Element[END_ELEMENT] */
+		errn = encodeNBitUnsignedInteger(stream, 1, 0);
+		break;
+
+	default:
+		if (currentID < 0) {
+			/* runtime grammars */
+			return -1;
+		} else {
+			errn = _exiEncodeEndElementUndeclared(stream, state);
+			if (errn < 0) {
+				return errn;
+			}
+		}
+		/* return EXI_ERROR_UNEXPECTED_END_ELEMENT; */
+	}
+
+	if (errn < 0) {
+		return errn;
+	}
+
+	/* pop item */
+	return exiPopStack(state);
+}
+
+static int _exiValueToString(exi_value_t* val) {
+	if (val->type == EXI_DATATYPE_STRING) {
+		return 0;
+	} else {
+		/* TODO convert typed value to string */
+		return EXI_ERROR_CONVERSION_TYPE_TO_STRING;
+	}
+}
+
+int exiappHandEncodeCharacters(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	int errn;
+	int16_t currentID = state->grammarStack[state->stackIndex];
+	switch (currentID) {
+		case 91:
+	case 95:
+		/* FirstStartTag[CHARACTERS[FLOAT]] */
+		if (val->type == EXI_DATATYPE_FLOAT) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeFloat(stream, &val->float_me);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 49:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		if (val->type == EXI_DATATYPE_STRING) {
+			encodeNBitUnsignedInteger(stream, 3, 3);
+			errn = encodeStringValue(stream, &val->string);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 50;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 3, 4);
+			encodeNBitUnsignedInteger(stream, 3, 5);
+		}
+		break;
+	case 109:
+	case 111:
+	case 115:
+	case 117:
+	case 121:
+	case 127:
+		/* FirstStartTag[CHARACTERS[INTEGER]] */
+		if (val->type == EXI_DATATYPE_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeInteger(stream, &val->integer);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 89:
+		/* FirstStartTag[CHARACTERS[DECIMAL]] */
+		if (val->type == EXI_DATATYPE_DECIMAL) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeDecimal(stream, &val->decimal);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 107:
+		/* FirstStartTag[CHARACTERS[BINARY_HEX]] */
+		if (val->type == EXI_DATATYPE_BINARY_HEX) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeBinary(stream, &val->binary);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 82:
+		/* Element[CHARACTERS[BOOLEAN]] */
+		if (val->type == EXI_DATATYPE_BOOLEAN) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeBoolean(stream, val->boolean);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 13:
+	case 120:
+	case 126:
+	case 139:
+	case 141:
+		/* Element[CHARACTERS[UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeUnsignedInteger(stream, &val->integer);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 12:
+	case 15:
+		/* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeUnsignedInteger(stream, &val->integer);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 10:
+	case 54:
+	case 56:
+	case 58:
+	case 62:
+	case 64:
+	case 68:
+	case 70:
+	case 72:
+	case 74:
+	case 78:
+	case 94:
+	case 114:
+	case 124:
+	case 130:
+	case 134:
+	case 143:
+		/* Element[CHARACTERS[STRING]] */
+		if (val->type == EXI_DATATYPE_STRING) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeStringValue(stream, &val->string);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 110:
+	case 112:
+	case 116:
+	case 118:
+	case 122:
+	case 128:
+		/* Element[CHARACTERS[INTEGER]] */
+		if (val->type == EXI_DATATYPE_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeInteger(stream, &val->integer);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 45:
+		/* FirstStartTag[CHARACTERS[ENUMERATION]] */
+		if (val->type == EXI_DATATYPE_ENUMERATION) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeNBitUnsignedInteger(stream, 2, val->enumeration);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 108:
+		/* Element[CHARACTERS[BINARY_HEX]] */
+		if (val->type == EXI_DATATYPE_BINARY_HEX) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeBinary(stream, &val->binary);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 86:
+	case 88:
+	case 98:
+	case 100:
+	case 102:
+	case 104:
+	case 106:
+	case 132:
+		/* Element[CHARACTERS[DATETIME]] */
+		if (val->type == EXI_DATATYPE_DATETIME) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeDateTime(stream, &val->datetime);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 92:
+	case 96:
+		/* Element[CHARACTERS[FLOAT]] */
+		if (val->type == EXI_DATATYPE_FLOAT) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeFloat(stream, &val->float_me);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 90:
+		/* Element[CHARACTERS[DECIMAL]] */
+		if (val->type == EXI_DATATYPE_DECIMAL) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeDecimal(stream, &val->decimal);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 20:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = _encodeNBitIntegerValue(stream, &val->integer, 5, 1);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 85:
+	case 87:
+	case 97:
+	case 99:
+	case 101:
+	case 103:
+	case 105:
+	case 131:
+		/* FirstStartTag[CHARACTERS[DATETIME]] */
+		if (val->type == EXI_DATATYPE_DATETIME) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeDateTime(stream, &val->datetime);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 75:
+		/* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		if (val->type == EXI_DATATYPE_STRING) {
+			encodeNBitUnsignedInteger(stream, 3, 3);
+			errn = encodeStringValue(stream, &val->string);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 76;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 3, 4);
+			encodeNBitUnsignedInteger(stream, 3, 5);
+		}
+		break;
+	case 21:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = _encodeNBitIntegerValue(stream, &val->integer, 5, 1);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 76:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		if (val->type == EXI_DATATYPE_STRING) {
+			encodeNBitUnsignedInteger(stream, 2, 2);
+			errn = encodeStringValue(stream, &val->string);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 76;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 2, 3);
+			encodeNBitUnsignedInteger(stream, 1, 1);
+		}
+		break;
+	case 46:
+		/* Element[CHARACTERS[ENUMERATION]] */
+		if (val->type == EXI_DATATYPE_ENUMERATION) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeNBitUnsignedInteger(stream, 2, val->enumeration);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 81:
+		/* FirstStartTag[CHARACTERS[BOOLEAN]] */
+		if (val->type == EXI_DATATYPE_BOOLEAN) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeBoolean(stream, val->boolean);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 79:
+		/* FirstStartTag[CHARACTERS[BINARY_BASE64]] */
+		if (val->type == EXI_DATATYPE_BINARY_BASE64) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeBinary(stream, &val->binary);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 18:
+	case 136:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = _encodeNBitIntegerValue(stream, &val->integer, 8, 0);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 7:
+	case 53:
+	case 55:
+	case 57:
+	case 61:
+	case 63:
+	case 67:
+	case 69:
+	case 71:
+	case 73:
+	case 77:
+	case 93:
+	case 113:
+	case 123:
+	case 129:
+	case 133:
+	case 142:
+		/* FirstStartTag[CHARACTERS[STRING]] */
+		if (val->type == EXI_DATATYPE_STRING) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeStringValue(stream, &val->string);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 80:
+		/* Element[CHARACTERS[BINARY_BASE64]] */
+		if (val->type == EXI_DATATYPE_BINARY_BASE64) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeBinary(stream, &val->binary);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 84:
+		/* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = _encodeNBitIntegerValue(stream, &val->integer, 8, -128);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 50:
+		/* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
+		if (val->type == EXI_DATATYPE_STRING) {
+			encodeNBitUnsignedInteger(stream, 2, 2);
+			errn = encodeStringValue(stream, &val->string);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 50;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 2, 3);
+			encodeNBitUnsignedInteger(stream, 1, 1);
+		}
+		break;
+	case 17:
+	case 135:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = _encodeNBitIntegerValue(stream, &val->integer, 8, 0);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 119:
+	case 125:
+	case 137:
+	case 138:
+	case 140:
+		/* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeUnsignedInteger(stream, &val->integer);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 52:
+	case 60:
+	case 66:
+		/* Element[CHARACTERS[LIST]] */
+		if (val->type == EXI_DATATYPE_LIST) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeUnsignedInteger32(stream, val->list.len);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 2, 2);
+		}
+		break;
+	case 51:
+	case 59:
+	case 65:
+		/* FirstStartTag[CHARACTERS[LIST]] */
+		if (val->type == EXI_DATATYPE_LIST) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = encodeUnsignedInteger32(stream, val->list.len);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+	case 83:
+		/* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
+		if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
+			encodeNBitUnsignedInteger(stream, 1, 0);
+			errn = _encodeNBitIntegerValue(stream, &val->integer, 8, -128);
+			if (errn) {
+				return errn;
+			}
+			/* move on */
+			state->grammarStack[state->stackIndex] = 8;
+			return 0;
+		} else { 
+			/* deviant characters */ 
+			encodeNBitUnsignedInteger(stream, 1, 1);
+			encodeNBitUnsignedInteger(stream, 3, 6);
+		}
+		break;
+
+	default:
+		return EXI_ERROR_UNEXPECTED_CHARACTERS;
+	}
+
+	if (currentID < 0) {
+		/* runtime rules */
+		return -1;
+	} else {
+		/* convert typed value to string for EXI encoding */
+		errn = _exiValueToString(val);
+		if (errn) {
+			return errn;
+		}
+		/* undeclared CH event code already written */
+		/* encode deviant value */
+		errn = encodeStringValue(stream, &val->string);
+		if (errn) {
+			return errn;
+		}
+
+		/* move to element content rule if not already */
+		errn = exiMoveToElementContentRule( state);
+	}
+
+	return errn;
+}
+
+
+int exiappHandEncodeAttribute(bitstream_t* stream, exi_state_t* state, eqname_t* at,
+		exi_value_t* val) {
+	int16_t currentID = state->grammarStack[state->stackIndex];
+	switch (currentID) {
+	
+	}
+
+	/* no expected attribute */
+	if (currentID < 0) {
+		/* runtime element */
+		return -1;
+	} else {
+		return +1;
+	}
+
+	/* return EXI_ERROR_UNEXPECTED_ATTRIBUTE; */
+}
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+static int exiEncodeAttribute2(bitstream_t* stream, exi_state_t* state, qname_t* at,
+		exi_value_t* val) {
+	int errn;
+	eqname_t eat;
+
+	/* attribute generic undeclared */
+	uint16_t codeLength1, codeLength2;
+	uint32_t ec1, ec2;
+
+	errn = exiGetUriID(&state->nameTablePrepopulated,  &state->nameTableRuntime, at->namespaceURI.chars, &eat.namespaceURI);
+	if (errn < 0) {
+		return errn;
+	} else if (errn > 0) {
+		/* uri not found*/
+	} else {
+		/* uri found, try to find localname id */
+		errn = exiGetLocalNameID(&state->nameTablePrepopulated,  &state->nameTableRuntime, eat.namespaceURI,
+				at->localName.chars, &eat.localPart);
+		if (errn < 0) {
+			return errn;
+		} else if (errn > 0) {
+			/* local-name not found*/
+		} else {
+			/* found uri and local-name */
+			errn = exiappHandEncodeAttribute(stream, state, &eat, val);
+			if (errn < 0) {
+				return errn;
+			}
+			if (errn == 0) {
+				return errn;
+			}
+
+		}
+	}
+
+
+	/* event codes */
+	encodeNBitUnsignedInteger(stream, codeLength1, ec1);
+	encodeNBitUnsignedInteger(stream, codeLength2, ec2);
+
+	/* qname */
+	/*
+	errn = _exiEncodeQName(stream, state->nameTablePrepopulated,  state->nameTableRuntime,
+			char** uri, char** localName);
+	QName qname = qnameDatatype.encodeQName(uri, localName, null, channel);
+	*/
+	/* content as string */
+	/*
+	typeEncoder.isValid(BuiltIn.DEFAULT_DATATYPE, value);
+	typeEncoder.writeValue(qname, channel);
+	*/
+	return -1;
+
+}
+#endif /*EXI_DEBUG*/
+
+int exiappHandEncodeAttributeXsiNil(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+
+	switch (state->grammarStack[state->stackIndex]) {
+
+	}
+
+	if (errn < 0) {
+		return errn;
+	}
+
+	errn = encodeBoolean(stream, val->boolean);
+	if (errn >= 0 && val->boolean) {
+		/* handle xsi:nil == true */
+		 errn = exiHandleXsiNilTrue(state);
+	}
+	return errn;
+}
+
+int exiappHandEncodeAttributeXsiType(bitstream_t* stream, exi_state_t* state,
+		exi_value_t* val) {
+	/* encode xsi:type event code */
+	switch (state->grammarStack[state->stackIndex]) {
+	case 12:
+		errn = encodeNBitUnsignedInteger(stream, 1, 1);
+		errn = encodeNBitUnsignedInteger(stream, 3, 1);
+		break;
+	case 15:
+		errn = encodeNBitUnsignedInteger(stream, 1, 1);
+		errn = encodeNBitUnsignedInteger(stream, 3, 1);
+		break;
+
+	default:
+		return EXI_ERROR_UNEXPECTED_ATTRIBUTE_XSI_TYPE;
+	}
+	if (errn < 0) {
+		return errn;
+	}
+
+	/* encode qname */
+	errn = _exiEncodeNamespaceUriID(stream, &state->nameTablePrepopulated, &state->nameTableRuntime, val->eqname.namespaceURI);
+	if (errn < 0) {
+		return errn;
+	}
+	errn = _exiEncodeLocalNameID(stream, &state->nameTablePrepopulated, &state->nameTableRuntime, val->eqname.namespaceURI, val->eqname.localPart);
+	if (errn < 0) {
+		return errn;
+	}
+
+	/* handle xsi type cast */
+	errn = exiHandleXsiType(state, &val->eqname);
+
+	return errn;
+}
+
+#endif
+

+ 79 - 0
src/codec/appHandCodec/appHand_EXIEncoder.h

@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI_appHand_ENCODER_H
+#define EXI_appHand_ENCODER_H
+
+#include "EXITypes.h"
+
+int exiappHandInitEncoder(bitstream_t* stream, exi_state_t* state,
+		exi_name_table_runtime_t runtimeTable);
+
+int exiappHandEncodeStartDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int exiappHandEncodeEndDocument(bitstream_t* stream,
+		exi_state_t* state);
+
+int
+exiappHandEncodeStartElement(bitstream_t* stream,
+		exi_state_t* state, eqname_t* se);
+
+int exiappHandEncodeStartElementGeneric(bitstream_t* stream,
+		exi_state_t* state, string_ascii_t* namespaceURI,
+		string_ascii_t* localName);
+
+int exiappHandEncodeEndElement(bitstream_t* stream,
+		exi_state_t* state);
+
+int exiappHandEncodeCharacters(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandEncodeAttribute(bitstream_t* stream,
+		exi_state_t* state, eqname_t* at, exi_value_t* val);
+
+int exiappHandEncodeAttributeXsiNil(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandEncodeAttributeXsiType(bitstream_t* stream,
+		exi_state_t* state, exi_value_t* val);
+
+int exiappHandEncodeListValue(bitstream_t* stream, exi_value_t* val,
+		list_t lt);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+

+ 60 - 0
src/codec/appHandCodec/appHand_NameTableEntries.c

@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef EXI_appHand_NAME_TABLE_ENTRIES_C
+#define EXI_appHand_NAME_TABLE_ENTRIES_C
+
+#include "appHand_NameTableEntries.h"
+
+
+
+/* ==================================== */
+/* String Table Population */
+
+
+#if EXI_DEBUG == EXI_DEBUG_OFF
+static struct exiNamePartition localNamePartitions[5] = {
+ { 7 },
+ { 4 },
+ { 2 },
+ { 46 },
+ { 8 }
+};
+#endif /*EXI_DEBUG*/
+
+
+#if EXI_DEBUG == EXI_DEBUG_OFF
+exi_name_table_prepopulated_t exiappHandNameTablePrepopulated = { 5, localNamePartitions };
+#endif /*EXI_DEBUG*/
+
+
+
+
+#endif
+

+ 41 - 0
src/codec/appHandCodec/appHand_NameTableEntries.h

@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+#ifndef EXI_appHand_NAME_TABLE_ENTRIES_H
+#define EXI_appHand_NAME_TABLE_ENTRIES_H
+
+#include "EXITypes.h"
+
+/* ==================================== */
+/* String Table Population */
+
+extern exi_name_table_prepopulated_t exiappHandNameTablePrepopulated;
+
+#endif
+

+ 80 - 0
src/service/v2g_service.h

@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2007-2010 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXI_SERVICE_H_
+#define EXI_SERVICE_H_
+
+#include "v2g_serviceDataTypes.h"
+#include "EXITypes.h"
+
+struct uniqueIDPath
+{
+	int id[10];
+	size_t pos;
+};
+
+
+struct EXIService
+{
+	/* in-/ out-stream */
+	bitstream_t inStream;
+	bitstream_t outStream;
+
+	/* EXI */
+	exi_state_t stateDecode;
+	exi_state_t stateEncode;
+	exi_event_t event;
+	eqname_t eqn;
+	exi_value_t val;
+
+	/* v2g message data structure */
+	struct EXIDocumentType exiMsg;
+
+	/* unique id for ambiguous elements */
+	struct uniqueIDPath idPath;
+
+	/* error code */
+	uint8_t errorCode;
+
+	/* offset for transported header data */
+	uint16_t transportHeaderOffset;
+};
+
+/* define error codes (TODO: define precise error codes) */
+#define EXI_NON_VALID_MESSAGE 0x01
+#define EXI_SERIALIZATION_FAILED 0x02
+#define EXI_DESERIALIZATION_FAILED 0x03
+
+#define EXI_UNKNOWN_ERROR 0xFF
+
+#endif /* EXI_SERVICE_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 44 - 0
src/service/v2g_serviceClientDataTransmitter.h

@@ -0,0 +1,44 @@
+
+/*
+ * Copyright (C) 2007-2010 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2G_SERVICECLIENTDATATRANSMITTER_H_
+#define V2G_SERVICECLIENTDATATRANSMITTER_H_
+
+#include "EXITypes.h"
+
+/* This method has to be implemented!
+ * This method sends EXI stream (outStream) to the EVSE and receives response stream (inStream)*/
+int serviceDataTransmitter(uint8_t* outStream, uint16_t outStreamLength, uint8_t* inStream);
+
+#endif /* V2G_SERVICECLIENTDATATRANSMITTER_H_ */
+
+#ifdef __cplusplus
+}
+#endif

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2665 - 0
src/service/v2g_serviceClientStubs.c


+ 268 - 0
src/service/v2g_serviceClientStubs.h

@@ -0,0 +1,268 @@
+
+
+
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+ 
+ 
+ #ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SERVICECLIENTSTUBS_H
+#define SERVICECLIENTSTUBS_H
+
+ #include "v2g_service.h"
+ #include "v2g_serviceDataTypes.h"
+ #include "v2g_serviceClientStubs.h"
+ 
+/**  
+ * \brief   Prepares the remote sessionSetup method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct SessionSetupReqType* Request data for the server (has to be set up before)
+ * \param	result   struct SessionSetupResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_sessionSetup(struct EXIService* service, struct MessageHeaderType* header, struct SessionSetupReqType* params, struct SessionSetupResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote serviceDiscovery method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct ServiceDiscoveryReqType* Request data for the server (has to be set up before)
+ * \param	result   struct ServiceDiscoveryResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_serviceDiscovery(struct EXIService* service, struct MessageHeaderType* header, struct ServiceDiscoveryReqType* params, struct ServiceDiscoveryResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote serviceDetail method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct ServiceDetailReqType* Request data for the server (has to be set up before)
+ * \param	result   struct ServiceDetailResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_serviceDetail(struct EXIService* service, struct MessageHeaderType* header, struct ServiceDetailReqType* params, struct ServiceDetailResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote servicePaymentSelection method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct ServicePaymentSelectionReqType* Request data for the server (has to be set up before)
+ * \param	result   struct ServicePaymentSelectionResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_servicePaymentSelection(struct EXIService* service, struct MessageHeaderType* header, struct ServicePaymentSelectionReqType* params, struct ServicePaymentSelectionResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote paymentDetails method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct PaymentDetailsReqType* Request data for the server (has to be set up before)
+ * \param	result   struct PaymentDetailsResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_paymentDetails(struct EXIService* service, struct MessageHeaderType* header, struct PaymentDetailsReqType* params, struct PaymentDetailsResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote contractAuthentication method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct ContractAuthenticationReqType* Request data for the server (has to be set up before)
+ * \param	result   struct ContractAuthenticationResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_contractAuthentication(struct EXIService* service, struct MessageHeaderType* header, struct ContractAuthenticationReqType* params, struct ContractAuthenticationResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote chargeParameterDiscovery method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct ChargeParameterDiscoveryReqType* Request data for the server (has to be set up before)
+ * \param	result   struct ChargeParameterDiscoveryResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_chargeParameterDiscovery(struct EXIService* service, struct MessageHeaderType* header, struct ChargeParameterDiscoveryReqType* params, struct ChargeParameterDiscoveryResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote powerDelivery method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct PowerDeliveryReqType* Request data for the server (has to be set up before)
+ * \param	result   struct PowerDeliveryResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_powerDelivery(struct EXIService* service, struct MessageHeaderType* header, struct PowerDeliveryReqType* params, struct PowerDeliveryResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote chargingStatus method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+  * \param	result   struct ChargingStatusResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_chargingStatus(struct EXIService* service, struct MessageHeaderType* header, struct ChargingStatusResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote meteringReceipt method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct MeteringReceiptReqType* Request data for the server (has to be set up before)
+ * \param	result   struct MeteringReceiptResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_meteringReceipt(struct EXIService* service, struct MessageHeaderType* header, struct MeteringReceiptReqType* params, struct MeteringReceiptResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote certificateUpdate method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct CertificateUpdateReqType* Request data for the server (has to be set up before)
+ * \param	result   struct CertificateUpdateResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_certificateUpdate(struct EXIService* service, struct MessageHeaderType* header, struct CertificateUpdateReqType* params, struct CertificateUpdateResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote certificateInstallation method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct CertificateInstallationReqType* Request data for the server (has to be set up before)
+ * \param	result   struct CertificateInstallationResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_certificateInstallation(struct EXIService* service, struct MessageHeaderType* header, struct CertificateInstallationReqType* params, struct CertificateInstallationResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote cableCheck method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct CableCheckReqType* Request data for the server (has to be set up before)
+ * \param	result   struct CableCheckResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_cableCheck(struct EXIService* service, struct MessageHeaderType* header, struct CableCheckReqType* params, struct CableCheckResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote preCharge method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct PreChargeReqType* Request data for the server (has to be set up before)
+ * \param	result   struct PreChargeResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_preCharge(struct EXIService* service, struct MessageHeaderType* header, struct PreChargeReqType* params, struct PreChargeResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote currentDemand method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct CurrentDemandReqType* Request data for the server (has to be set up before)
+ * \param	result   struct CurrentDemandResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_currentDemand(struct EXIService* service, struct MessageHeaderType* header, struct CurrentDemandReqType* params, struct CurrentDemandResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote weldingDetection method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+ * \param	params   struct WeldingDetectionReqType* Request data for the server (has to be set up before)
+ * \param	result   struct WeldingDetectionResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_weldingDetection(struct EXIService* service, struct MessageHeaderType* header, struct WeldingDetectionReqType* params, struct WeldingDetectionResType* result);
+
+ 
+
+	
+/**  
+ * \brief   Prepares the remote sessionStop method
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	header   struct MessageHeaderType* Header data structure
+  * \param	result   struct SessionStopResType* Contains the response data from the server 
+ * \return  0 = 0K; -1 = ERROR */
+	int prepare_sessionStop(struct EXIService* service, struct MessageHeaderType* header, struct SessionStopResType* result);
+
+ 
+
+	
+
+
+ /** 
+ * \brief   Determines which response message was received
+ * \param	service  struct EXIService* Service data structure (has to be initialized before)
+ * \param	respMsg   enum responseMessages* contains the name of the response message 
+  * \param	result   struct SessionStopResType* Contains the response data from the server 
+ * \return  0 = 0K; 0 != ERROR */ 
+int determineResponseMesssage(struct EXIService* service, enum responseMessages* respMsg);
+
+
+
+
+	/* Initialize the v2g client */
+int init_v2gServiceClient(struct EXIService* service, bytes_t bytes, string_ucs_t string, uint8_t* inStream, size_t max_inStream_size, uint8_t* outStream, size_t max_outStream_size, uint32_t* outPayloadLength, uint16_t transportHeaderOffset);
+
+ 
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 7882 - 0
src/service/v2g_serviceDataSerialization.c

@@ -0,0 +1,7882 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+#include "v2g_service.h"
+#include "v2g_serviceDataTypes.h"
+
+#include "EXITypes.h"
+#include "EXIEncoder.h"
+ 
+#include <string.h>
+ 
+ 
+ 
+
+static int serialize_NotificationType(struct NotificationType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of FaultCode*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=74;	
+
+
+			/* encode start element FaultCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->FaultCode;
+			
+			/* encode character  FaultCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of FaultCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.FaultMsg)
+		{		
+					
+			/* element ID assignment of FaultMsg*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=75;	
+
+
+			/* encode start element FaultMsg */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->FaultMsg.arraylen.data;
+			memcpy(service->val.string.codepoints, type->FaultMsg.data,type->FaultMsg.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  FaultMsg */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of FaultMsg */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_CanonicalizationMethodType(struct CanonicalizationMethodType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Algorithm*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=0;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Algorithm.arraylen.data;
+			service->val.string.codepoints= type->attr_Algorithm.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+
+
+	return 0;			
+}
+
+
+static int serialize_SignatureMethodType(struct SignatureMethodType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Algorithm*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=0;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Algorithm.arraylen.data;
+			service->val.string.codepoints= type->attr_Algorithm.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+
+
+	return 0;			
+}
+
+
+static int serialize_DigestMethodType(struct DigestMethodType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Algorithm*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=0;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Algorithm.arraylen.data;
+			service->val.string.codepoints= type->attr_Algorithm.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+
+
+	return 0;			
+}
+
+
+static int serialize_ReferenceType(struct ReferenceType* type, struct EXIService* service)
+{
+
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+
+	if(type->isused.attr_URI)
+		{		
+					
+			/* element ID assignment of attr_URI*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=7;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_URI.arraylen.data;
+			service->val.string.codepoints= type->attr_URI.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+
+	if(type->isused.attr_Type)
+		{		
+					
+			/* element ID assignment of attr_Type*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=6;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Type.arraylen.data;
+			service->val.string.codepoints= type->attr_Type.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of DigestMethod*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=5;	
+
+
+			/* encode start element DigestMethod */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DigestMethod */
+			if(serialize_DigestMethodType( &(type->DigestMethod),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DigestMethod */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DigestValue*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;	
+
+
+			/* encode start element DigestValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->DigestValue.arraylen.data;
+		memcpy(service->val.binary.data, type->DigestValue.data,type->DigestValue.arraylen.data);
+		
+		
+		/* encode character  DigestValue */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of DigestValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_SignedInfoType(struct SignedInfoType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of CanonicalizationMethod*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=0;	
+
+
+			/* encode start element CanonicalizationMethod */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CanonicalizationMethod */
+			if(serialize_CanonicalizationMethodType( &(type->CanonicalizationMethod),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CanonicalizationMethod */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of SignatureMethod*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=43;	
+
+
+			/* encode start element SignatureMethod */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SignatureMethod */
+			if(serialize_SignatureMethodType( &(type->SignatureMethod),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SignatureMethod */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	for(i_loop=0;i_loop < 1;i_loop++)
+		{
+			
+			/* element ID assignment of Reference*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=34;	
+
+
+			/* encode start element Reference */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of Reference */
+			if(serialize_ReferenceType(&(type->Reference[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of Reference */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_X509IssuerSerialType(struct X509IssuerSerialType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of X509IssuerName*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=62;	
+
+
+			/* encode start element X509IssuerName */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->X509IssuerName.arraylen.data;
+			memcpy(service->val.string.codepoints, type->X509IssuerName.data,type->X509IssuerName.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  X509IssuerName */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of X509IssuerName */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of X509SerialNumber*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=66;	
+
+
+			/* encode start element X509SerialNumber */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int64=type->X509SerialNumber;
+			service->val.integer.type = EXI_INTEGER_64;
+			
+			/* encode character  X509SerialNumber */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of X509SerialNumber */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_X509DataType(struct X509DataType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of X509IssuerSerial*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;	
+
+
+			/* encode start element X509IssuerSerial */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of X509IssuerSerial */
+			if(serialize_X509IssuerSerialType( &(type->X509IssuerSerial),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of X509IssuerSerial */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of X509SKI*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=65;	
+
+
+			/* encode start element X509SKI */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->X509SKI.arraylen.data;
+		memcpy(service->val.binary.data, type->X509SKI.data,type->X509SKI.arraylen.data);
+		
+		
+		/* encode character  X509SKI */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of X509SKI */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of X509SubjectName*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=67;	
+
+
+			/* encode start element X509SubjectName */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->X509SubjectName.arraylen.data;
+			memcpy(service->val.string.codepoints, type->X509SubjectName.data,type->X509SubjectName.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  X509SubjectName */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of X509SubjectName */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of X509Certificate*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=59;	
+
+
+			/* encode start element X509Certificate */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->X509Certificate.arraylen.data;
+		memcpy(service->val.binary.data, type->X509Certificate.data,type->X509Certificate.arraylen.data);
+		
+		
+		/* encode character  X509Certificate */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of X509Certificate */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of X509CRL*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=58;	
+
+
+			/* encode start element X509CRL */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->X509CRL.arraylen.data;
+		memcpy(service->val.binary.data, type->X509CRL.data,type->X509CRL.arraylen.data);
+		
+		
+		/* encode character  X509CRL */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of X509CRL */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_KeyInfoType(struct KeyInfoType* type, struct EXIService* service)
+{
+
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of X509Data*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=60;	
+
+
+			/* encode start element X509Data */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of X509Data */
+			if(serialize_X509DataType( &(type->X509Data),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of X509Data */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_SignatureType(struct SignatureType* type, struct EXIService* service)
+{
+
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of SignedInfo*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=52;	
+
+
+			/* encode start element SignedInfo */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SignedInfo */
+			if(serialize_SignedInfoType( &(type->SignedInfo),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SignedInfo */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of SignatureValue*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=50;	
+
+
+			/* encode start element SignatureValue */
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)))
+			{
+					return -1;
+			}
+
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+			service->val.binary.len = type->SignatureValue.arraylen.data;
+			service->val.binary.data= type->SignatureValue.data;
+
+		/* encode character  DigestValue */
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)))
+		{
+
+				return -1;
+		}
+
+
+
+			/* encode end element of SignatureValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.KeyInfo)
+		{		
+					
+			/* element ID assignment of KeyInfo*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=14;	
+
+
+			/* encode start element KeyInfo */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of KeyInfo */
+			if(serialize_KeyInfoType( &(type->KeyInfo),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of KeyInfo */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_MessageHeaderType(struct MessageHeaderType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of SessionID*/
+			service->eqn.namespaceURI=8;			
+			service->eqn.localPart=2;	
+
+
+			/* encode start element SessionID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_HEX;
+		service->val.binary.len = type->SessionID.arraylen.data;
+		memcpy(service->val.binary.data, type->SessionID.data,type->SessionID.arraylen.data);
+		
+		
+		/* encode character  SessionID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of SessionID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.Notification)
+		{		
+					
+			/* element ID assignment of Notification*/
+			service->eqn.namespaceURI=8;			
+			service->eqn.localPart=1;	
+
+
+			/* encode start element Notification */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of Notification */
+			if(serialize_NotificationType( &(type->Notification),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of Notification */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.Signature)
+		{		
+					
+			/* element ID assignment of Signature*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=42;	
+
+
+			/* encode start element Signature */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of Signature */
+			if(serialize_SignatureType( (type->Signature),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of Signature */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SessionSetupReqType(struct SessionSetupReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of EVCCID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=40;	
+
+
+			/* encode start element EVCCID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_HEX;
+		service->val.binary.len = type->EVCCID.arraylen.data;
+		memcpy(service->val.binary.data, type->EVCCID.data,type->EVCCID.arraylen.data);
+		
+		
+		/* encode character  EVCCID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of EVCCID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_SessionSetupResType(struct SessionSetupResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=46;	
+
+
+			/* encode start element EVSEID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_HEX;
+		service->val.binary.len = type->EVSEID.arraylen.data;
+		memcpy(service->val.binary.data, type->EVSEID.data,type->EVSEID.arraylen.data);
+		
+		
+		/* encode character  EVSEID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of EVSEID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.DateTimeNow)
+		{		
+					
+			/* element ID assignment of DateTimeNow*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=39;	
+
+
+			/* encode start element DateTimeNow */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int64=type->DateTimeNow;
+			service->val.integer.type = EXI_INTEGER_64;
+			
+			/* encode character  DateTimeNow */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of DateTimeNow */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDiscoveryReqType(struct ServiceDiscoveryReqType* type, struct EXIService* service)
+{
+
+	if(type->isused.ServiceScope)
+		{		
+					
+			/* element ID assignment of ServiceScope*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=103;	
+
+
+			/* encode start element ServiceScope */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ServiceScope.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ServiceScope.data,type->ServiceScope.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ServiceScope */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ServiceScope */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceCategory)
+		{		
+					
+			/* element ID assignment of ServiceCategory*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=87;	
+
+
+			/* encode start element ServiceCategory */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ServiceCategory;
+			
+			/* encode character  ServiceCategory */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ServiceCategory */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PaymentOptionsType(struct PaymentOptionsType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.PaymentOption;i_loop++)
+		{
+			
+			/* element ID assignment of PaymentOption*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=99;	
+
+
+			/* encode start element PaymentOption */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->PaymentOption[i_loop];
+			
+			/* encode character  PaymentOption */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of PaymentOption */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceTagType(struct ServiceTagType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ServiceID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=130;	
+
+
+			/* encode start element ServiceID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint16=type->ServiceID;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_16;
+			
+			/* encode character  ServiceID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ServiceID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.ServiceName)
+		{		
+					
+			/* element ID assignment of ServiceName*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=131;	
+
+
+			/* encode start element ServiceName */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ServiceName.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ServiceName.data,type->ServiceName.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ServiceName */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ServiceName */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceCategory)
+		{		
+					
+			/* element ID assignment of ServiceCategory*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=127;	
+
+
+			/* encode start element ServiceCategory */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ServiceCategory;
+			
+			/* encode character  ServiceCategory */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ServiceCategory */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceScope)
+		{		
+					
+			/* element ID assignment of ServiceScope*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=133;	
+
+
+			/* encode start element ServiceScope */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ServiceScope.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ServiceScope.data,type->ServiceScope.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ServiceScope */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ServiceScope */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceChargeType(struct ServiceChargeType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ServiceTag*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=134;	
+
+
+			/* encode start element ServiceTag */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceTag */
+			if(serialize_ServiceTagType( &(type->ServiceTag),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceTag */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of FreeService*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=76;	
+
+
+			/* encode start element FreeService */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->FreeService;
+			
+			/* encode character  FreeService */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of FreeService */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EnergyTransferType*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=71;	
+
+
+			/* encode start element EnergyTransferType */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->EnergyTransferType;
+			
+			/* encode character  EnergyTransferType */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EnergyTransferType */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ServiceType(struct ServiceType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ServiceTag*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=134;	
+
+
+			/* encode start element ServiceTag */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceTag */
+			if(serialize_ServiceTagType( &(type->ServiceTag),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceTag */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of FreeService*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=76;	
+
+
+			/* encode start element FreeService */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->FreeService;
+			
+			/* encode character  FreeService */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of FreeService */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ServiceTagListType(struct ServiceTagListType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.Service;i_loop++)
+		{
+			
+			/* element ID assignment of Service*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=126;	
+
+
+			/* encode start element Service */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of Service */
+			if(serialize_ServiceType(&(type->Service[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of Service */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDiscoveryResType(struct ServiceDiscoveryResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of PaymentOptions*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=69;	
+
+
+			/* encode start element PaymentOptions */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PaymentOptions */
+			if(serialize_PaymentOptionsType( &(type->PaymentOptions),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PaymentOptions */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ChargeService*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=18;	
+
+
+			/* encode start element ChargeService */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ChargeService */
+			if(serialize_ServiceChargeType( &(type->ChargeService),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ChargeService */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.ServiceList)
+		{		
+					
+			/* element ID assignment of ServiceList*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=97;	
+
+
+			/* encode start element ServiceList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceList */
+			if(serialize_ServiceTagListType( &(type->ServiceList),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceList */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDetailReqType(struct ServiceDetailReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ServiceID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=96;	
+
+
+			/* encode start element ServiceID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint16=type->ServiceID;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_16;
+			
+			/* encode character  ServiceID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ServiceID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_PhysicalValueType(struct PhysicalValueType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of Multiplier*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=84;	
+
+
+			/* encode start element Multiplier */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.int8=type->Multiplier;
+			service->val.integer.type = EXI_INTEGER_8;
+			
+			/* encode character  Multiplier */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of Multiplier */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.Unit)
+		{		
+					
+			/* element ID assignment of Unit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=145;	
+
+
+			/* encode start element Unit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->Unit;
+			
+			/* encode character  Unit */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of Unit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of Value*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=146;	
+
+
+			/* encode start element Value */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->Value;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  Value */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of Value */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ParameterType(struct ParameterType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Name*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=4;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Name.arraylen.data;
+			service->val.string.codepoints= type->attr_Name.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+	
+			/* element ID assignment of attr_ValueType*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=8;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_ValueType.arraylen.data;
+			service->val.string.codepoints= type->attr_ValueType.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+	
+			/* element ID assignment of boolValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=149;	
+
+
+			/* encode start element boolValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->boolValue;
+			
+			/* encode character  boolValue */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of boolValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of byteValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=150;	
+
+
+			/* encode start element byteValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.int8=type->byteValue;
+			service->val.integer.type = EXI_INTEGER_8;
+			
+			/* encode character  byteValue */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of byteValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of shortValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=177;	
+
+
+			/* encode start element shortValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->shortValue;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  shortValue */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of shortValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of intValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=162;	
+
+
+			/* encode start element intValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int32=type->intValue;
+			service->val.integer.type = EXI_INTEGER_32;
+			
+			/* encode character  intValue */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of intValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of physicalValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=168;	
+
+
+			/* encode start element physicalValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of physicalValue */
+			if(serialize_PhysicalValueType( &(type->physicalValue),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of physicalValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of stringValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=181;	
+
+
+			/* encode start element stringValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->stringValue.arraylen.data;
+			memcpy(service->val.string.codepoints, type->stringValue.data,type->stringValue.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  stringValue */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of stringValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ParameterSetType(struct ParameterSetType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+		
+			/* element ID assignment of ParameterSetID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=96;	
+
+
+			/* encode start element ParameterSetID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->ParameterSetID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  ParameterSetID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ParameterSetID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	for(i_loop=0;i_loop < type->arraylen.Parameter;i_loop++)
+		{
+			
+			/* element ID assignment of Parameter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=94;	
+
+
+			/* encode start element Parameter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of Parameter */
+			if(serialize_ParameterType(&(type->Parameter[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of Parameter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceParameterListType(struct ServiceParameterListType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.ParameterSet;i_loop++)
+		{
+			
+			/* element ID assignment of ParameterSet*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=95;	
+
+
+			/* encode start element ParameterSet */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of ParameterSet */
+			if(serialize_ParameterSetType(&(type->ParameterSet[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of ParameterSet */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDetailResType(struct ServiceDetailResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ServiceID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=96;	
+
+
+			/* encode start element ServiceID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint16=type->ServiceID;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_16;
+			
+			/* encode character  ServiceID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ServiceID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.ServiceParameterList)
+		{		
+					
+			/* element ID assignment of ServiceParameterList*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=98;	
+
+
+			/* encode start element ServiceParameterList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceParameterList */
+			if(serialize_ServiceParameterListType( &(type->ServiceParameterList),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceParameterList */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SelectedServiceType(struct SelectedServiceType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ServiceID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=130;	
+
+
+			/* encode start element ServiceID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint16=type->ServiceID;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_16;
+			
+			/* encode character  ServiceID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ServiceID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.ParameterSetID)
+		{		
+					
+			/* element ID assignment of ParameterSetID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=96;	
+
+
+			/* encode start element ParameterSetID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->ParameterSetID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  ParameterSetID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ParameterSetID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SelectedServiceListType(struct SelectedServiceListType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.SelectedService;i_loop++)
+		{
+			
+			/* element ID assignment of SelectedService*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=123;	
+
+
+			/* encode start element SelectedService */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of SelectedService */
+			if(serialize_SelectedServiceType(&(type->SelectedService[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of SelectedService */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServicePaymentSelectionReqType(struct ServicePaymentSelectionReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of SelectedPaymentOption*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=85;	
+
+
+			/* encode start element SelectedPaymentOption */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->SelectedPaymentOption;
+			
+			/* encode character  SelectedPaymentOption */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SelectedPaymentOption */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of SelectedServiceList*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=86;	
+
+
+			/* encode start element SelectedServiceList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SelectedServiceList */
+			if(serialize_SelectedServiceListType( &(type->SelectedServiceList),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SelectedServiceList */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ServicePaymentSelectionResType(struct ServicePaymentSelectionResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_SubCertificatesType(struct SubCertificatesType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.Certificate;i_loop++)
+		{
+			
+			/* element ID assignment of Certificate*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=8;	
+
+
+			/* encode start element Certificate */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+			service->val.binary.len = type->Certificate[i_loop].arraylen.data;
+			memcpy(service->val.binary.data, type->Certificate[i_loop].data,type->Certificate[i_loop].arraylen.data);
+
+		
+		/* encode character  Certificate */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of Certificate */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_CertificateChainType(struct CertificateChainType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of Certificate*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=8;	
+
+
+			/* encode start element Certificate */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->Certificate.arraylen.data;
+		memcpy(service->val.binary.data, type->Certificate.data,type->Certificate.arraylen.data);
+		
+		
+		/* encode character  Certificate */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of Certificate */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SubCertificates)
+		{		
+					
+			/* element ID assignment of SubCertificates*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=141;	
+
+
+			/* encode start element SubCertificates */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SubCertificates */
+			if(serialize_SubCertificatesType( &(type->SubCertificates),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SubCertificates */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PaymentDetailsReqType(struct PaymentDetailsReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ContractID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=29;	
+
+
+			/* encode start element ContractID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ContractID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ContractID.data,type->ContractID.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ContractID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ContractID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractSignatureCertChain*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=30;	
+
+
+			/* encode start element ContractSignatureCertChain */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ContractSignatureCertChain */
+			if(serialize_CertificateChainType( &(type->ContractSignatureCertChain),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ContractSignatureCertChain */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_PaymentDetailsResType(struct PaymentDetailsResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of GenChallenge*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=57;	
+
+
+			/* encode start element GenChallenge */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->GenChallenge.arraylen.data;
+			memcpy(service->val.string.codepoints, type->GenChallenge.data,type->GenChallenge.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  GenChallenge */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of GenChallenge */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DateTimeNow*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=39;	
+
+
+			/* encode start element DateTimeNow */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int64=type->DateTimeNow;
+			service->val.integer.type = EXI_INTEGER_64;
+			
+			/* encode character  DateTimeNow */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of DateTimeNow */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ContractAuthenticationReqType(struct ContractAuthenticationReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+	
+			/* element ID assignment of GenChallenge*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=57;	
+
+
+			/* encode start element GenChallenge */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->GenChallenge.arraylen.data;
+			memcpy(service->val.string.codepoints, type->GenChallenge.data,type->GenChallenge.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  GenChallenge */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of GenChallenge */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ContractAuthenticationResType(struct ContractAuthenticationResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_AC_EVChargeParameterType(struct AC_EVChargeParameterType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DepartureTime*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=30;	
+
+
+			/* encode start element DepartureTime */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->DepartureTime;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  DepartureTime */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of DepartureTime */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EAmount*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=31;	
+
+
+			/* encode start element EAmount */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EAmount */
+			if(serialize_PhysicalValueType( &(type->EAmount),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EAmount */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVMaxVoltage*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=40;	
+
+
+			/* encode start element EVMaxVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaxVoltage */
+			if(serialize_PhysicalValueType( &(type->EVMaxVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaxVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVMaxCurrent*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=39;	
+
+
+			/* encode start element EVMaxCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaxCurrent */
+			if(serialize_PhysicalValueType( &(type->EVMaxCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaxCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVMinCurrent*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=44;	
+
+
+			/* encode start element EVMinCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMinCurrent */
+			if(serialize_PhysicalValueType( &(type->EVMinCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMinCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_DC_EVStatusType(struct DC_EVStatusType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of EVReady*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=49;	
+
+
+			/* encode start element EVReady */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->EVReady;
+			
+			/* encode character  EVReady */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVReady */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVCabinConditioning)
+		{		
+					
+			/* element ID assignment of EVCabinConditioning*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=33;	
+
+
+			/* encode start element EVCabinConditioning */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->EVCabinConditioning;
+			
+			/* encode character  EVCabinConditioning */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVCabinConditioning */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVRESSConditioning)
+		{		
+					
+			/* element ID assignment of EVRESSConditioning*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=47;	
+
+
+			/* encode start element EVRESSConditioning */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->EVRESSConditioning;
+			
+			/* encode character  EVRESSConditioning */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVRESSConditioning */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of EVErrorCode*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=38;	
+
+
+			/* encode start element EVErrorCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->EVErrorCode;
+			
+			/* encode character  EVErrorCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVErrorCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVRESSSOC*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=48;	
+
+
+			/* encode start element EVRESSSOC */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.int8=type->EVRESSSOC;
+			service->val.integer.type = EXI_INTEGER_8;
+			
+			/* encode character  EVRESSSOC */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVRESSSOC */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_DC_EVChargeParameterType(struct DC_EVChargeParameterType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=28;	
+
+
+			/* encode start element DC_EVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVStatus */
+			if(serialize_DC_EVStatusType( &(type->DC_EVStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVMaximumCurrentLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=41;	
+
+
+			/* encode start element EVMaximumCurrentLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaximumCurrentLimit */
+			if(serialize_PhysicalValueType( &(type->EVMaximumCurrentLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaximumCurrentLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVMaximumPowerLimit)
+		{		
+					
+			/* element ID assignment of EVMaximumPowerLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=42;	
+
+
+			/* encode start element EVMaximumPowerLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaximumPowerLimit */
+			if(serialize_PhysicalValueType( &(type->EVMaximumPowerLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaximumPowerLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of EVMaximumVoltageLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=43;	
+
+
+			/* encode start element EVMaximumVoltageLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaximumVoltageLimit */
+			if(serialize_PhysicalValueType( &(type->EVMaximumVoltageLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaximumVoltageLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVEnergyCapacity)
+		{		
+					
+			/* element ID assignment of EVEnergyCapacity*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=36;	
+
+
+			/* encode start element EVEnergyCapacity */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVEnergyCapacity */
+			if(serialize_PhysicalValueType( &(type->EVEnergyCapacity),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVEnergyCapacity */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVEnergyRequest)
+		{		
+					
+			/* element ID assignment of EVEnergyRequest*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=37;	
+
+
+			/* encode start element EVEnergyRequest */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVEnergyRequest */
+			if(serialize_PhysicalValueType( &(type->EVEnergyRequest),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVEnergyRequest */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.FullSOC)
+		{		
+					
+			/* element ID assignment of FullSOC*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=77;	
+
+
+			/* encode start element FullSOC */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.int8=type->FullSOC;
+			service->val.integer.type = EXI_INTEGER_8;
+			
+			/* encode character  FullSOC */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of FullSOC */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.BulkSOC)
+		{		
+					
+			/* element ID assignment of BulkSOC*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=7;	
+
+
+			/* encode start element BulkSOC */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.int8=type->BulkSOC;
+			service->val.integer.type = EXI_INTEGER_8;
+			
+			/* encode character  BulkSOC */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of BulkSOC */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ChargeParameterDiscoveryReqType(struct ChargeParameterDiscoveryReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of EVRequestedEnergyTransferType*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=44;	
+
+
+			/* encode start element EVRequestedEnergyTransferType */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->EVRequestedEnergyTransferType;
+			
+			/* encode character  EVRequestedEnergyTransferType */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVRequestedEnergyTransferType */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.AC_EVChargeParameter)
+		{		
+					
+			/* element ID assignment of AC_EVChargeParameter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=0;	
+
+
+			/* encode start element AC_EVChargeParameter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of AC_EVChargeParameter */
+			if(serialize_AC_EVChargeParameterType( (type->AC_EVChargeParameter),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of AC_EVChargeParameter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.DC_EVChargeParameter)
+		{		
+					
+			/* element ID assignment of DC_EVChargeParameter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=18;	
+
+
+			/* encode start element DC_EVChargeParameter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVChargeParameter */
+			if(serialize_DC_EVChargeParameterType( (type->DC_EVChargeParameter),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVChargeParameter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_RelativeTimeIntervalType(struct RelativeTimeIntervalType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of start*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=179;	
+
+
+			/* encode start element start */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->start;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  start */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of start */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.duration)
+		{		
+					
+			/* element ID assignment of duration*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=156;	
+
+
+			/* encode start element duration */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->duration;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  duration */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of duration */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PMaxScheduleEntryType(struct PMaxScheduleEntryType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of RelativeTimeInterval*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=106;	
+
+
+			/* encode start element RelativeTimeInterval */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of RelativeTimeInterval */
+			if(serialize_RelativeTimeIntervalType( &(type->RelativeTimeInterval),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of RelativeTimeInterval */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of PMax*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=87;	
+
+
+			/* encode start element PMax */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->PMax;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  PMax */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of PMax */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_PMaxScheduleType(struct PMaxScheduleType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+		
+			/* element ID assignment of PMaxScheduleID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=91;	
+
+
+			/* encode start element PMaxScheduleID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->PMaxScheduleID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  PMaxScheduleID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of PMaxScheduleID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	for(i_loop=0;i_loop < type->arraylen.PMaxScheduleEntry;i_loop++)
+		{
+			
+			/* element ID assignment of PMaxScheduleEntry*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=89;	
+
+
+			/* encode start element PMaxScheduleEntry */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of PMaxScheduleEntry */
+			if(serialize_PMaxScheduleEntryType(&(type->PMaxScheduleEntry[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of PMaxScheduleEntry */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_CostType(struct CostType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of costKind*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=153;	
+
+
+			/* encode start element costKind */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->costKind;
+			
+			/* encode character  costKind */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of costKind */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of amount*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=147;	
+
+
+			/* encode start element amount */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->amount;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  amount */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of amount */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.amountMultiplier)
+		{		
+					
+			/* element ID assignment of amountMultiplier*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=148;	
+
+
+			/* encode start element amountMultiplier */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.int8=type->amountMultiplier;
+			service->val.integer.type = EXI_INTEGER_8;
+			
+			/* encode character  amountMultiplier */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of amountMultiplier */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ConsumptionCostType(struct ConsumptionCostType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+		
+			/* element ID assignment of startValue*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=180;	
+
+
+			/* encode start element startValue */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->startValue;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  startValue */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of startValue */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.Cost)
+		{		
+				
+	for(i_loop=0;i_loop < type->arraylen.Cost;i_loop++)
+		{
+			
+			/* element ID assignment of Cost*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=16;	
+
+
+			/* encode start element Cost */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of Cost */
+			if(serialize_CostType(&(type->Cost[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of Cost */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SalesTariffEntryType(struct SalesTariffEntryType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+		
+			/* element ID assignment of RelativeTimeInterval*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=106;	
+
+
+			/* encode start element RelativeTimeInterval */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of RelativeTimeInterval */
+			if(serialize_RelativeTimeIntervalType( &(type->RelativeTimeInterval),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of RelativeTimeInterval */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EPriceLevel*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=32;	
+
+
+			/* encode start element EPriceLevel */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.uint8=type->EPriceLevel;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_8;
+			
+			/* encode character  EPriceLevel */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EPriceLevel */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.ConsumptionCost)
+		{		
+				
+	for(i_loop=0;i_loop < type->arraylen.ConsumptionCost;i_loop++)
+		{
+			
+			/* element ID assignment of ConsumptionCost*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=14;	
+
+
+			/* encode start element ConsumptionCost */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of ConsumptionCost */
+			if(serialize_ConsumptionCostType(&(type->ConsumptionCost[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of ConsumptionCost */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SalesTariffType(struct SalesTariffType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+		
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+	
+			/* element ID assignment of SalesTariffID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=121;	
+
+
+			/* encode start element SalesTariffID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->SalesTariffID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  SalesTariffID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SalesTariffID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SalesTariffDescription)
+		{		
+					
+			/* element ID assignment of SalesTariffDescription*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=118;	
+
+
+			/* encode start element SalesTariffDescription */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->SalesTariffDescription.arraylen.data;
+			memcpy(service->val.string.codepoints, type->SalesTariffDescription.data,type->SalesTariffDescription.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  SalesTariffDescription */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of SalesTariffDescription */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of NumEPriceLevels*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=86;	
+
+
+			/* encode start element NumEPriceLevels */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_NBIT_UNSIGNED_INTEGER;
+			service->val.integer.val.uint8=type->NumEPriceLevels;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_8;
+			
+			/* encode character  NumEPriceLevels */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of NumEPriceLevels */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	for(i_loop=0;i_loop < type->arraylen.SalesTariffEntry;i_loop++)
+		{
+			
+			/* element ID assignment of SalesTariffEntry*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=119;	
+
+
+			/* encode start element SalesTariffEntry */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of SalesTariffEntry */
+			if(serialize_SalesTariffEntryType(&(type->SalesTariffEntry[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of SalesTariffEntry */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SAScheduleTupleType(struct SAScheduleTupleType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of SAScheduleTupleID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=113;	
+
+
+			/* encode start element SAScheduleTupleID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->SAScheduleTupleID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  SAScheduleTupleID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SAScheduleTupleID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of PMaxSchedule*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=88;	
+
+
+			/* encode start element PMaxSchedule */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PMaxSchedule */
+			if(serialize_PMaxScheduleType( &(type->PMaxSchedule),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PMaxSchedule */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SalesTariff)
+		{		
+					
+			/* element ID assignment of SalesTariff*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=117;	
+
+
+			/* encode start element SalesTariff */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SalesTariff */
+			if(serialize_SalesTariffType( (type->SalesTariff),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SalesTariff */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_SAScheduleListType(struct SAScheduleListType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.SAScheduleTuple;i_loop++)
+		{
+			
+			/* element ID assignment of SAScheduleTuple*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=112;	
+
+
+			/* encode start element SAScheduleTuple */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of SAScheduleTuple */
+			if(serialize_SAScheduleTupleType(&(type->SAScheduleTuple[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of SAScheduleTuple */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_AC_EVSEStatusType(struct AC_EVSEStatusType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of PowerSwitchClosed*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=102;	
+
+
+			/* encode start element PowerSwitchClosed */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->PowerSwitchClosed;
+			
+			/* encode character  PowerSwitchClosed */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of PowerSwitchClosed */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of RCD*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=105;	
+
+
+			/* encode start element RCD */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->RCD;
+			
+			/* encode character  RCD */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of RCD */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ShutDownTime*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=138;	
+
+
+			/* encode start element ShutDownTime */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->ShutDownTime;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  ShutDownTime */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ShutDownTime */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of StopCharging*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=140;	
+
+
+			/* encode start element StopCharging */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->StopCharging;
+			
+			/* encode character  StopCharging */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of StopCharging */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_AC_EVSEChargeParameterType(struct AC_EVSEChargeParameterType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of AC_EVSEStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=4;	
+
+
+			/* encode start element AC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of AC_EVSEStatus */
+			if(serialize_AC_EVSEStatusType( &(type->AC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of AC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEMaxVoltage*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=57;	
+
+
+			/* encode start element EVSEMaxVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaxVoltage */
+			if(serialize_PhysicalValueType( &(type->EVSEMaxVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaxVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEMaxCurrent*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=56;	
+
+
+			/* encode start element EVSEMaxCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaxCurrent */
+			if(serialize_PhysicalValueType( &(type->EVSEMaxCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaxCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEMinCurrent*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=61;	
+
+
+			/* encode start element EVSEMinCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMinCurrent */
+			if(serialize_PhysicalValueType( &(type->EVSEMinCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMinCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_DC_EVSEStatusType(struct DC_EVSEStatusType* type, struct EXIService* service)
+{
+
+	if(type->isused.EVSEIsolationStatus)
+		{		
+					
+			/* element ID assignment of EVSEIsolationStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=55;	
+
+
+			/* encode start element EVSEIsolationStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->EVSEIsolationStatus;
+			
+			/* encode character  EVSEIsolationStatus */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVSEIsolationStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of EVSEStatusCode*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=66;	
+
+
+			/* encode start element EVSEStatusCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->EVSEStatusCode;
+			
+			/* encode character  EVSEStatusCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVSEStatusCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_DC_EVSEChargeParameterType(struct DC_EVSEChargeParameterType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVSEStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=25;	
+
+
+			/* encode start element DC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEStatus */
+			if(serialize_DC_EVSEStatusType( &(type->DC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEMaximumCurrentLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=58;	
+
+
+			/* encode start element EVSEMaximumCurrentLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaximumCurrentLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMaximumCurrentLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaximumCurrentLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVSEMaximumPowerLimit)
+		{		
+					
+			/* element ID assignment of EVSEMaximumPowerLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=59;	
+
+
+			/* encode start element EVSEMaximumPowerLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaximumPowerLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMaximumPowerLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaximumPowerLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of EVSEMaximumVoltageLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=60;	
+
+
+			/* encode start element EVSEMaximumVoltageLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaximumVoltageLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMaximumVoltageLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaximumVoltageLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEMinimumCurrentLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=62;	
+
+
+			/* encode start element EVSEMinimumCurrentLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMinimumCurrentLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMinimumCurrentLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMinimumCurrentLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEMinimumVoltageLimit*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=63;	
+
+
+			/* encode start element EVSEMinimumVoltageLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMinimumVoltageLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMinimumVoltageLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMinimumVoltageLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVSECurrentRegulationTolerance)
+		{		
+					
+			/* element ID assignment of EVSECurrentRegulationTolerance*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=53;	
+
+
+			/* encode start element EVSECurrentRegulationTolerance */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSECurrentRegulationTolerance */
+			if(serialize_PhysicalValueType( &(type->EVSECurrentRegulationTolerance),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSECurrentRegulationTolerance */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of EVSEPeakCurrentRipple*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=64;	
+
+
+			/* encode start element EVSEPeakCurrentRipple */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEPeakCurrentRipple */
+			if(serialize_PhysicalValueType( &(type->EVSEPeakCurrentRipple),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEPeakCurrentRipple */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVSEEnergyToBeDelivered)
+		{		
+					
+			/* element ID assignment of EVSEEnergyToBeDelivered*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=54;	
+
+
+			/* encode start element EVSEEnergyToBeDelivered */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEEnergyToBeDelivered */
+			if(serialize_PhysicalValueType( &(type->EVSEEnergyToBeDelivered),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEEnergyToBeDelivered */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ChargeParameterDiscoveryResType(struct ChargeParameterDiscoveryResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SAScheduleList)
+		{		
+					
+			/* element ID assignment of SAScheduleList*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=110;	
+
+
+			/* encode start element SAScheduleList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SAScheduleList */
+			if(serialize_SAScheduleListType( (type->SAScheduleList),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SAScheduleList */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.AC_EVSEChargeParameter)
+		{		
+					
+			/* element ID assignment of AC_EVSEChargeParameter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=2;	
+
+
+			/* encode start element AC_EVSEChargeParameter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of AC_EVSEChargeParameter */
+			if(serialize_AC_EVSEChargeParameterType( (type->AC_EVSEChargeParameter),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of AC_EVSEChargeParameter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.DC_EVSEChargeParameter)
+		{		
+					
+			/* element ID assignment of DC_EVSEChargeParameter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=23;	
+
+
+			/* encode start element DC_EVSEChargeParameter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEChargeParameter */
+			if(serialize_DC_EVSEChargeParameterType( (type->DC_EVSEChargeParameter),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEChargeParameter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ProfileEntryType(struct ProfileEntryType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ChargingProfileEntryStart*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=12;	
+
+
+			/* encode start element ChargingProfileEntryStart */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_UNSIGNED_INTEGER;
+			service->val.integer.val.uint32=type->ChargingProfileEntryStart;
+			service->val.integer.type = EXI_UNSIGNED_INTEGER_32;
+			
+			/* encode character  ChargingProfileEntryStart */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ChargingProfileEntryStart */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ChargingProfileEntryMaxPower*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=11;	
+
+
+			/* encode start element ChargingProfileEntryMaxPower */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->ChargingProfileEntryMaxPower;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  ChargingProfileEntryMaxPower */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ChargingProfileEntryMaxPower */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ChargingProfileType(struct ChargingProfileType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+		
+			/* element ID assignment of SAScheduleTupleID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=113;	
+
+
+			/* encode start element SAScheduleTupleID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->SAScheduleTupleID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  SAScheduleTupleID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SAScheduleTupleID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	for(i_loop=0;i_loop < type->arraylen.ProfileEntry;i_loop++)
+		{
+			
+			/* element ID assignment of ProfileEntry*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=103;	
+
+
+			/* encode start element ProfileEntry */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			/* encode children of ProfileEntry */
+			if(serialize_ProfileEntryType(&(type->ProfileEntry[i_loop]),service))
+			{
+				return -1;
+			}
+			
+			 
+			/* encode end element of ProfileEntry */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_DC_EVPowerDeliveryParameterType(struct DC_EVPowerDeliveryParameterType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=28;	
+
+
+			/* encode start element DC_EVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVStatus */
+			if(serialize_DC_EVStatusType( &(type->DC_EVStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.BulkChargingComplete)
+		{		
+					
+			/* element ID assignment of BulkChargingComplete*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=6;	
+
+
+			/* encode start element BulkChargingComplete */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->BulkChargingComplete;
+			
+			/* encode character  BulkChargingComplete */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of BulkChargingComplete */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of ChargingComplete*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=10;	
+
+
+			/* encode start element ChargingComplete */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->ChargingComplete;
+			
+			/* encode character  ChargingComplete */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ChargingComplete */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_PowerDeliveryReqType(struct PowerDeliveryReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ReadyToChargeState*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=78;	
+
+
+			/* encode start element ReadyToChargeState */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->ReadyToChargeState;
+			
+			/* encode character  ReadyToChargeState */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ReadyToChargeState */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.ChargingProfile)
+		{		
+					
+			/* element ID assignment of ChargingProfile*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=20;	
+
+
+			/* encode start element ChargingProfile */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ChargingProfile */
+			if(serialize_ChargingProfileType( &(type->ChargingProfile),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ChargingProfile */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.DC_EVPowerDeliveryParameter)
+		{		
+					
+			/* element ID assignment of DC_EVPowerDeliveryParameter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=21;	
+
+
+			/* encode start element DC_EVPowerDeliveryParameter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVPowerDeliveryParameter */
+			if(serialize_DC_EVPowerDeliveryParameterType( (type->DC_EVPowerDeliveryParameter),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVPowerDeliveryParameter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PowerDeliveryResType(struct PowerDeliveryResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.AC_EVSEStatus)
+		{		
+					
+			/* element ID assignment of AC_EVSEStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=4;	
+
+
+			/* encode start element AC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of AC_EVSEStatus */
+			if(serialize_AC_EVSEStatusType( (type->AC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of AC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.DC_EVSEStatus)
+		{		
+					
+			/* element ID assignment of DC_EVSEStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=25;	
+
+
+			/* encode start element DC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEStatus */
+			if(serialize_DC_EVSEStatusType( (type->DC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ChargingStatusReqType(struct ChargingStatusReqType* type, struct EXIService* service)
+{
+
+
+	return 0;			
+}
+
+
+static int serialize_MeterInfoType(struct MeterInfoType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of MeterID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=80;	
+
+
+			/* encode start element MeterID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->MeterID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->MeterID.data,type->MeterID.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  MeterID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of MeterID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.MeterReading)
+		{		
+					
+			/* element ID assignment of MeterReading*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element MeterReading */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of MeterReading */
+			if(serialize_PhysicalValueType( &(type->MeterReading),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of MeterReading */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.SigMeterReading)
+		{		
+					
+			/* element ID assignment of SigMeterReading*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=139;	
+
+
+			/* encode start element SigMeterReading */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->SigMeterReading.arraylen.data;
+		memcpy(service->val.binary.data, type->SigMeterReading.data,type->SigMeterReading.arraylen.data);
+		
+		
+		/* encode character  SigMeterReading */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of SigMeterReading */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.MeterStatus)
+		{		
+					
+			/* element ID assignment of MeterStatus*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=83;	
+
+
+			/* encode start element MeterStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->MeterStatus;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  MeterStatus */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of MeterStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.TMeter)
+		{		
+					
+			/* element ID assignment of TMeter*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=143;	
+
+
+			/* encode start element TMeter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int64=type->TMeter;
+			service->val.integer.type = EXI_INTEGER_64;
+			
+			/* encode character  TMeter */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of TMeter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ChargingStatusResType(struct ChargingStatusResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=46;	
+
+
+			/* encode start element EVSEID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_HEX;
+		service->val.binary.len = type->EVSEID.arraylen.data;
+		memcpy(service->val.binary.data, type->EVSEID.data,type->EVSEID.arraylen.data);
+		
+		
+		/* encode character  EVSEID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of EVSEID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SAScheduleTupleID)
+		{		
+					
+			/* element ID assignment of SAScheduleTupleID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=84;	
+
+
+			/* encode start element SAScheduleTupleID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->SAScheduleTupleID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  SAScheduleTupleID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SAScheduleTupleID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVSEMaxCurrent)
+		{		
+					
+			/* element ID assignment of EVSEMaxCurrent*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=47;	
+
+
+			/* encode start element EVSEMaxCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaxCurrent */
+			if(serialize_PhysicalValueType( &(type->EVSEMaxCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaxCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.MeterInfo)
+		{		
+					
+			/* element ID assignment of MeterInfo*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=59;	
+
+
+			/* encode start element MeterInfo */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of MeterInfo */
+			if(serialize_MeterInfoType( &(type->MeterInfo),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of MeterInfo */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of ReceiptRequired*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=79;	
+
+
+			/* encode start element ReceiptRequired */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->ReceiptRequired;
+			
+			/* encode character  ReceiptRequired */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ReceiptRequired */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of AC_EVSEStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=0;	
+
+
+			/* encode start element AC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of AC_EVSEStatus */
+			if(serialize_AC_EVSEStatusType( &(type->AC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of AC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_MeteringReceiptReqType(struct MeteringReceiptReqType* type, struct EXIService* service)
+{
+
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of SessionID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=104;	
+
+
+			/* encode start element SessionID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_HEX;
+		service->val.binary.len = type->SessionID.arraylen.data;
+		memcpy(service->val.binary.data, type->SessionID.data,type->SessionID.arraylen.data);
+		
+		
+		/* encode character  SessionID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of SessionID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.SAScheduleTupleID)
+		{		
+					
+			/* element ID assignment of SAScheduleTupleID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=84;	
+
+
+			/* encode start element SAScheduleTupleID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->SAScheduleTupleID;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  SAScheduleTupleID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of SAScheduleTupleID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of MeterInfo*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=59;	
+
+
+			/* encode start element MeterInfo */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of MeterInfo */
+			if(serialize_MeterInfoType( &(type->MeterInfo),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of MeterInfo */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_MeteringReceiptResType(struct MeteringReceiptResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of AC_EVSEStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=0;	
+
+
+			/* encode start element AC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of AC_EVSEStatus */
+			if(serialize_AC_EVSEStatusType( &(type->AC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of AC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_SessionStopType(struct SessionStopType* type, struct EXIService* service)
+{
+
+
+	return 0;			
+}
+
+
+static int serialize_SessionStopResType(struct SessionStopResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_ListOfRootCertificateIDsType(struct ListOfRootCertificateIDsType* type, struct EXIService* service)
+{
+
+			size_t i_loop;
+	
+	for(i_loop=0;i_loop < type->arraylen.RootCertificateID;i_loop++)
+		{
+			
+			/* element ID assignment of RootCertificateID*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=108;	
+
+
+			/* encode start element RootCertificateID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->RootCertificateID[i_loop].arraylen.data;
+			memcpy(service->val.string.codepoints, type->RootCertificateID[i_loop].data,type->RootCertificateID[i_loop].arraylen.data*sizeof(uint32_t));
+		
+			/* encode character  RootCertificateID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of RootCertificateID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_CertificateUpdateReqType(struct CertificateUpdateReqType* type, struct EXIService* service)
+{
+
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of ContractSignatureCertChain*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=30;	
+
+
+			/* encode start element ContractSignatureCertChain */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ContractSignatureCertChain */
+			if(serialize_CertificateChainType( &(type->ContractSignatureCertChain),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ContractSignatureCertChain */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=29;	
+
+
+			/* encode start element ContractID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ContractID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ContractID.data,type->ContractID.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ContractID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ContractID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ListOfRootCertificateIDs*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=58;	
+
+
+			/* encode start element ListOfRootCertificateIDs */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ListOfRootCertificateIDs */
+			if(serialize_ListOfRootCertificateIDsType( &(type->ListOfRootCertificateIDs),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ListOfRootCertificateIDs */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DHParams*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=38;	
+
+
+			/* encode start element DHParams */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->DHParams.arraylen.data;
+		memcpy(service->val.binary.data, type->DHParams.data,type->DHParams.arraylen.data);
+		
+		
+		/* encode character  DHParams */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of DHParams */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CertificateUpdateResType(struct CertificateUpdateResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractSignatureCertChain*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=30;	
+
+
+			/* encode start element ContractSignatureCertChain */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ContractSignatureCertChain */
+			if(serialize_CertificateChainType( &(type->ContractSignatureCertChain),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ContractSignatureCertChain */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractSignatureEncryptedPrivateKey*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=31;	
+
+
+			/* encode start element ContractSignatureEncryptedPrivateKey */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->ContractSignatureEncryptedPrivateKey.arraylen.data;
+		memcpy(service->val.binary.data, type->ContractSignatureEncryptedPrivateKey.data,type->ContractSignatureEncryptedPrivateKey.arraylen.data);
+		
+		
+		/* encode character  ContractSignatureEncryptedPrivateKey */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of ContractSignatureEncryptedPrivateKey */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DHParams*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=38;	
+
+
+			/* encode start element DHParams */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->DHParams.arraylen.data;
+		memcpy(service->val.binary.data, type->DHParams.data,type->DHParams.arraylen.data);
+		
+		
+		/* encode character  DHParams */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of DHParams */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=29;	
+
+
+			/* encode start element ContractID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ContractID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ContractID.data,type->ContractID.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ContractID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ContractID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of RetryCounter*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=83;	
+
+
+			/* encode start element RetryCounter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_INTEGER;
+			service->val.integer.val.int16=type->RetryCounter;
+			service->val.integer.type = EXI_INTEGER_16;
+			
+			/* encode character  RetryCounter */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of RetryCounter */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CertificateInstallationReqType(struct CertificateInstallationReqType* type, struct EXIService* service)
+{
+
+	if(type->isused.attr_Id)
+		{		
+					
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+		}
+	
+			/* element ID assignment of OEMProvisioningCert*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=64;	
+
+
+			/* encode start element OEMProvisioningCert */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->OEMProvisioningCert.arraylen.data;
+		memcpy(service->val.binary.data, type->OEMProvisioningCert.data,type->OEMProvisioningCert.arraylen.data);
+		
+		
+		/* encode character  OEMProvisioningCert */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of OEMProvisioningCert */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ListOfRootCertificateIDs*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=58;	
+
+
+			/* encode start element ListOfRootCertificateIDs */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ListOfRootCertificateIDs */
+			if(serialize_ListOfRootCertificateIDsType( &(type->ListOfRootCertificateIDs),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ListOfRootCertificateIDs */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DHParams*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=38;	
+
+
+			/* encode start element DHParams */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->DHParams.arraylen.data;
+		memcpy(service->val.binary.data, type->DHParams.data,type->DHParams.arraylen.data);
+		
+		
+		/* encode character  DHParams */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of DHParams */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CertificateInstallationResType(struct CertificateInstallationResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of attr_Id*/
+			service->eqn.namespaceURI=0;			
+			service->eqn.localPart=2;	
+
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->attr_Id.arraylen.data;
+			service->val.string.codepoints= type->attr_Id.data;
+			if (exiEncodeAttribute(&(service->outStream), &(service->stateEncode), &(service->eqn),&(service->val)))
+			{
+					return -1;
+			}
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractSignatureCertChain*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=30;	
+
+
+			/* encode start element ContractSignatureCertChain */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ContractSignatureCertChain */
+			if(serialize_CertificateChainType( &(type->ContractSignatureCertChain),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ContractSignatureCertChain */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractSignatureEncryptedPrivateKey*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=31;	
+
+
+			/* encode start element ContractSignatureEncryptedPrivateKey */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->ContractSignatureEncryptedPrivateKey.arraylen.data;
+		memcpy(service->val.binary.data, type->ContractSignatureEncryptedPrivateKey.data,type->ContractSignatureEncryptedPrivateKey.arraylen.data);
+		
+		
+		/* encode character  ContractSignatureEncryptedPrivateKey */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of ContractSignatureEncryptedPrivateKey */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DHParams*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=38;	
+
+
+			/* encode start element DHParams */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			service->val.type = EXI_DATATYPE_BINARY_BASE64;
+		service->val.binary.len = type->DHParams.arraylen.data;
+		memcpy(service->val.binary.data, type->DHParams.data,type->DHParams.arraylen.data);
+		
+		
+		/* encode character  DHParams */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+		{
+				 
+				return -1;
+		}
+
+			
+			 
+			/* encode end element of DHParams */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of ContractID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=29;	
+
+
+			/* encode start element ContractID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_STRING;
+			service->val.string.len = type->ContractID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ContractID.data,type->ContractID.arraylen.data*sizeof(uint32_t));
+						
+		
+			/* encode character  ContractID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+					return -1;
+			}
+			
+			 
+			/* encode end element of ContractID */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CableCheckReqType(struct CableCheckReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=37;	
+
+
+			/* encode start element DC_EVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVStatus */
+			if(serialize_DC_EVStatusType( &(type->DC_EVStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CableCheckResType(struct CableCheckResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DC_EVSEStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=36;	
+
+
+			/* encode start element DC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEStatus */
+			if(serialize_DC_EVSEStatusType( &(type->DC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_PreChargeReqType(struct PreChargeReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=37;	
+
+
+			/* encode start element DC_EVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVStatus */
+			if(serialize_DC_EVStatusType( &(type->DC_EVStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVTargetVoltage*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=56;	
+
+
+			/* encode start element EVTargetVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVTargetVoltage */
+			if(serialize_PhysicalValueType( &(type->EVTargetVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVTargetVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVTargetCurrent*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=55;	
+
+
+			/* encode start element EVTargetCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVTargetCurrent */
+			if(serialize_PhysicalValueType( &(type->EVTargetCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVTargetCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_PreChargeResType(struct PreChargeResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DC_EVSEStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=36;	
+
+
+			/* encode start element DC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEStatus */
+			if(serialize_DC_EVSEStatusType( &(type->DC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEPresentVoltage*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=53;	
+
+
+			/* encode start element EVSEPresentVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEPresentVoltage */
+			if(serialize_PhysicalValueType( &(type->EVSEPresentVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEPresentVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CurrentDemandReqType(struct CurrentDemandReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=37;	
+
+
+			/* encode start element DC_EVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVStatus */
+			if(serialize_DC_EVStatusType( &(type->DC_EVStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVTargetCurrent*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=55;	
+
+
+			/* encode start element EVTargetCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVTargetCurrent */
+			if(serialize_PhysicalValueType( &(type->EVTargetCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVTargetCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVMaximumVoltageLimit)
+		{		
+					
+			/* element ID assignment of EVMaximumVoltageLimit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=43;	
+
+
+			/* encode start element EVMaximumVoltageLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaximumVoltageLimit */
+			if(serialize_PhysicalValueType( &(type->EVMaximumVoltageLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaximumVoltageLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVMaximumCurrentLimit)
+		{		
+					
+			/* element ID assignment of EVMaximumCurrentLimit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=41;	
+
+
+			/* encode start element EVMaximumCurrentLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaximumCurrentLimit */
+			if(serialize_PhysicalValueType( &(type->EVMaximumCurrentLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaximumCurrentLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVMaximumPowerLimit)
+		{		
+					
+			/* element ID assignment of EVMaximumPowerLimit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=42;	
+
+
+			/* encode start element EVMaximumPowerLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVMaximumPowerLimit */
+			if(serialize_PhysicalValueType( &(type->EVMaximumPowerLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVMaximumPowerLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.BulkChargingComplete)
+		{		
+					
+			/* element ID assignment of BulkChargingComplete*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=1;	
+
+
+			/* encode start element BulkChargingComplete */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->BulkChargingComplete;
+			
+			/* encode character  BulkChargingComplete */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of BulkChargingComplete */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of ChargingComplete*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=19;	
+
+
+			/* encode start element ChargingComplete */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->ChargingComplete;
+			
+			/* encode character  ChargingComplete */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ChargingComplete */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.RemainingTimeToFullSoC)
+		{		
+					
+			/* element ID assignment of RemainingTimeToFullSoC*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=81;	
+
+
+			/* encode start element RemainingTimeToFullSoC */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of RemainingTimeToFullSoC */
+			if(serialize_PhysicalValueType( &(type->RemainingTimeToFullSoC),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of RemainingTimeToFullSoC */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.RemainingTimeToBulkSoC)
+		{		
+					
+			/* element ID assignment of RemainingTimeToBulkSoC*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=80;	
+
+
+			/* encode start element RemainingTimeToBulkSoC */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of RemainingTimeToBulkSoC */
+			if(serialize_PhysicalValueType( &(type->RemainingTimeToBulkSoC),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of RemainingTimeToBulkSoC */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+					
+			/* element ID assignment of EVTargetVoltage*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=56;	
+
+
+			/* encode start element EVTargetVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVTargetVoltage */
+			if(serialize_PhysicalValueType( &(type->EVTargetVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVTargetVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_CurrentDemandResType(struct CurrentDemandResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DC_EVSEStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=36;	
+
+
+			/* encode start element DC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEStatus */
+			if(serialize_DC_EVSEStatusType( &(type->DC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEPresentVoltage*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=53;	
+
+
+			/* encode start element EVSEPresentVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEPresentVoltage */
+			if(serialize_PhysicalValueType( &(type->EVSEPresentVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEPresentVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEPresentCurrent*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=52;	
+
+
+			/* encode start element EVSEPresentCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEPresentCurrent */
+			if(serialize_PhysicalValueType( &(type->EVSEPresentCurrent),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEPresentCurrent */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSECurrentLimitAchieved*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=45;	
+
+
+			/* encode start element EVSECurrentLimitAchieved */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->EVSECurrentLimitAchieved;
+			
+			/* encode character  EVSECurrentLimitAchieved */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVSECurrentLimitAchieved */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEVoltageLimitAchieved*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=54;	
+
+
+			/* encode start element EVSEVoltageLimitAchieved */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->EVSEVoltageLimitAchieved;
+			
+			/* encode character  EVSEVoltageLimitAchieved */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVSEVoltageLimitAchieved */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEPowerLimitAchieved*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=51;	
+
+
+			/* encode start element EVSEPowerLimitAchieved */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_BOOLEAN;
+			service->val.boolean=type->EVSEPowerLimitAchieved;
+			
+			/* encode character  EVSEPowerLimitAchieved */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of EVSEPowerLimitAchieved */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+	if(type->isused.EVSEMaximumVoltageLimit)
+		{		
+					
+			/* element ID assignment of EVSEMaximumVoltageLimit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=50;	
+
+
+			/* encode start element EVSEMaximumVoltageLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaximumVoltageLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMaximumVoltageLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaximumVoltageLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVSEMaximumCurrentLimit)
+		{		
+					
+			/* element ID assignment of EVSEMaximumCurrentLimit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=48;	
+
+
+			/* encode start element EVSEMaximumCurrentLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaximumCurrentLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMaximumCurrentLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaximumCurrentLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.EVSEMaximumPowerLimit)
+		{		
+					
+			/* element ID assignment of EVSEMaximumPowerLimit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=49;	
+
+
+			/* encode start element EVSEMaximumPowerLimit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEMaximumPowerLimit */
+			if(serialize_PhysicalValueType( &(type->EVSEMaximumPowerLimit),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEMaximumPowerLimit */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_WeldingDetectionReqType(struct WeldingDetectionReqType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of DC_EVStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=37;	
+
+
+			/* encode start element DC_EVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVStatus */
+			if(serialize_DC_EVStatusType( &(type->DC_EVStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_WeldingDetectionResType(struct WeldingDetectionResType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=82;	
+
+
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+			
+			service->val.type = EXI_DATATYPE_ENUMERATION;
+			service->val.enumeration=type->ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val))) 
+			{
+				 
+				return -1;
+			}
+				
+			 
+			/* encode end element of ResponseCode */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of DC_EVSEStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=36;	
+
+
+			/* encode start element DC_EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of DC_EVSEStatus */
+			if(serialize_DC_EVSEStatusType( &(type->DC_EVSEStatus),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of DC_EVSEStatus */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of EVSEPresentVoltage*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=53;	
+
+
+			/* encode start element EVSEPresentVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of EVSEPresentVoltage */
+			if(serialize_PhysicalValueType( &(type->EVSEPresentVoltage),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of EVSEPresentVoltage */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_BodyType(struct BodyType* type, struct EXIService* service)
+{
+
+	if(type->isused.SessionSetupReq)
+		{		
+					
+			/* element ID assignment of SessionSetupReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=105;	
+
+
+			/* encode start element SessionSetupReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SessionSetupReq */
+			if(serialize_SessionSetupReqType( (type->SessionSetupReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SessionSetupReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.SessionSetupRes)
+		{		
+					
+			/* element ID assignment of SessionSetupRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=107;	
+
+
+			/* encode start element SessionSetupRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SessionSetupRes */
+			if(serialize_SessionSetupResType( (type->SessionSetupRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SessionSetupRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceDiscoveryReq)
+		{		
+					
+			/* element ID assignment of ServiceDiscoveryReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=92;	
+
+
+			/* encode start element ServiceDiscoveryReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceDiscoveryReq */
+			if(serialize_ServiceDiscoveryReqType( (type->ServiceDiscoveryReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceDiscoveryReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceDiscoveryRes)
+		{		
+					
+			/* element ID assignment of ServiceDiscoveryRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=94;	
+
+
+			/* encode start element ServiceDiscoveryRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceDiscoveryRes */
+			if(serialize_ServiceDiscoveryResType( (type->ServiceDiscoveryRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceDiscoveryRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceDetailReq)
+		{		
+					
+			/* element ID assignment of ServiceDetailReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=88;	
+
+
+			/* encode start element ServiceDetailReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceDetailReq */
+			if(serialize_ServiceDetailReqType( (type->ServiceDetailReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceDetailReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServiceDetailRes)
+		{		
+					
+			/* element ID assignment of ServiceDetailRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=90;	
+
+
+			/* encode start element ServiceDetailRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServiceDetailRes */
+			if(serialize_ServiceDetailResType( (type->ServiceDetailRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServiceDetailRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServicePaymentSelectionReq)
+		{		
+					
+			/* element ID assignment of ServicePaymentSelectionReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=99;	
+
+
+			/* encode start element ServicePaymentSelectionReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServicePaymentSelectionReq */
+			if(serialize_ServicePaymentSelectionReqType( (type->ServicePaymentSelectionReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServicePaymentSelectionReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ServicePaymentSelectionRes)
+		{		
+					
+			/* element ID assignment of ServicePaymentSelectionRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=101;	
+
+
+			/* encode start element ServicePaymentSelectionRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ServicePaymentSelectionRes */
+			if(serialize_ServicePaymentSelectionResType( (type->ServicePaymentSelectionRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ServicePaymentSelectionRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.PaymentDetailsReq)
+		{		
+					
+			/* element ID assignment of PaymentDetailsReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=65;	
+
+
+			/* encode start element PaymentDetailsReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PaymentDetailsReq */
+			if(serialize_PaymentDetailsReqType( (type->PaymentDetailsReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PaymentDetailsReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.PaymentDetailsRes)
+		{		
+					
+			/* element ID assignment of PaymentDetailsRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=67;	
+
+
+			/* encode start element PaymentDetailsRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PaymentDetailsRes */
+			if(serialize_PaymentDetailsResType( (type->PaymentDetailsRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PaymentDetailsRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ContractAuthenticationReq)
+		{		
+					
+			/* element ID assignment of ContractAuthenticationReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=25;	
+
+
+			/* encode start element ContractAuthenticationReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ContractAuthenticationReq */
+			if(serialize_ContractAuthenticationReqType( (type->ContractAuthenticationReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ContractAuthenticationReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ContractAuthenticationRes)
+		{		
+					
+			/* element ID assignment of ContractAuthenticationRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=27;	
+
+
+			/* encode start element ContractAuthenticationRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ContractAuthenticationRes */
+			if(serialize_ContractAuthenticationResType( (type->ContractAuthenticationRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ContractAuthenticationRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ChargeParameterDiscoveryReq)
+		{		
+					
+			/* element ID assignment of ChargeParameterDiscoveryReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=14;	
+
+
+			/* encode start element ChargeParameterDiscoveryReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ChargeParameterDiscoveryReq */
+			if(serialize_ChargeParameterDiscoveryReqType( (type->ChargeParameterDiscoveryReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ChargeParameterDiscoveryReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ChargeParameterDiscoveryRes)
+		{		
+					
+			/* element ID assignment of ChargeParameterDiscoveryRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=16;	
+
+
+			/* encode start element ChargeParameterDiscoveryRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ChargeParameterDiscoveryRes */
+			if(serialize_ChargeParameterDiscoveryResType( (type->ChargeParameterDiscoveryRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ChargeParameterDiscoveryRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.PowerDeliveryReq)
+		{		
+					
+			/* element ID assignment of PowerDeliveryReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=70;	
+
+
+			/* encode start element PowerDeliveryReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PowerDeliveryReq */
+			if(serialize_PowerDeliveryReqType( (type->PowerDeliveryReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PowerDeliveryReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.PowerDeliveryRes)
+		{		
+					
+			/* element ID assignment of PowerDeliveryRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=72;	
+
+
+			/* encode start element PowerDeliveryRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PowerDeliveryRes */
+			if(serialize_PowerDeliveryResType( (type->PowerDeliveryRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PowerDeliveryRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ChargingStatusReq)
+		{		
+					
+			/* element ID assignment of ChargingStatusReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=21;	
+
+
+			/* encode start element ChargingStatusReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ChargingStatusReq */
+			if(serialize_ChargingStatusReqType( (type->ChargingStatusReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ChargingStatusReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.ChargingStatusRes)
+		{		
+					
+			/* element ID assignment of ChargingStatusRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=23;	
+
+
+			/* encode start element ChargingStatusRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of ChargingStatusRes */
+			if(serialize_ChargingStatusResType( (type->ChargingStatusRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of ChargingStatusRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.MeteringReceiptReq)
+		{		
+					
+			/* element ID assignment of MeteringReceiptReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=60;	
+
+
+			/* encode start element MeteringReceiptReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of MeteringReceiptReq */
+			if(serialize_MeteringReceiptReqType( (type->MeteringReceiptReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of MeteringReceiptReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.MeteringReceiptRes)
+		{		
+					
+			/* element ID assignment of MeteringReceiptRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=62;	
+
+
+			/* encode start element MeteringReceiptRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of MeteringReceiptRes */
+			if(serialize_MeteringReceiptResType( (type->MeteringReceiptRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of MeteringReceiptRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.SessionStopReq)
+		{		
+					
+			/* element ID assignment of SessionStopReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=109;	
+
+
+			/* encode start element SessionStopReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SessionStopReq */
+			if(serialize_SessionStopType( (type->SessionStopReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SessionStopReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.SessionStopRes)
+		{		
+					
+			/* element ID assignment of SessionStopRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=110;	
+
+
+			/* encode start element SessionStopRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of SessionStopRes */
+			if(serialize_SessionStopResType( (type->SessionStopRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of SessionStopRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CertificateUpdateReq)
+		{		
+					
+			/* element ID assignment of CertificateUpdateReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=10;	
+
+
+			/* encode start element CertificateUpdateReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CertificateUpdateReq */
+			if(serialize_CertificateUpdateReqType( (type->CertificateUpdateReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CertificateUpdateReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CertificateUpdateRes)
+		{		
+					
+			/* element ID assignment of CertificateUpdateRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=12;	
+
+
+			/* encode start element CertificateUpdateRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CertificateUpdateRes */
+			if(serialize_CertificateUpdateResType( (type->CertificateUpdateRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CertificateUpdateRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CertificateInstallationReq)
+		{		
+					
+			/* element ID assignment of CertificateInstallationReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=6;	
+
+
+			/* encode start element CertificateInstallationReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CertificateInstallationReq */
+			if(serialize_CertificateInstallationReqType( (type->CertificateInstallationReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CertificateInstallationReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CertificateInstallationRes)
+		{		
+					
+			/* element ID assignment of CertificateInstallationRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=8;	
+
+
+			/* encode start element CertificateInstallationRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CertificateInstallationRes */
+			if(serialize_CertificateInstallationResType( (type->CertificateInstallationRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CertificateInstallationRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CableCheckReq)
+		{		
+					
+			/* element ID assignment of CableCheckReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=2;	
+
+
+			/* encode start element CableCheckReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CableCheckReq */
+			if(serialize_CableCheckReqType( (type->CableCheckReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CableCheckReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CableCheckRes)
+		{		
+					
+			/* element ID assignment of CableCheckRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=4;	
+
+
+			/* encode start element CableCheckRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CableCheckRes */
+			if(serialize_CableCheckResType( (type->CableCheckRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CableCheckRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.PreChargeReq)
+		{		
+					
+			/* element ID assignment of PreChargeReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=74;	
+
+
+			/* encode start element PreChargeReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PreChargeReq */
+			if(serialize_PreChargeReqType( (type->PreChargeReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PreChargeReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.PreChargeRes)
+		{		
+					
+			/* element ID assignment of PreChargeRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=76;	
+
+
+			/* encode start element PreChargeRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of PreChargeRes */
+			if(serialize_PreChargeResType( (type->PreChargeRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of PreChargeRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CurrentDemandReq)
+		{		
+					
+			/* element ID assignment of CurrentDemandReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=32;	
+
+
+			/* encode start element CurrentDemandReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CurrentDemandReq */
+			if(serialize_CurrentDemandReqType( (type->CurrentDemandReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CurrentDemandReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.CurrentDemandRes)
+		{		
+					
+			/* element ID assignment of CurrentDemandRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=34;	
+
+
+			/* encode start element CurrentDemandRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of CurrentDemandRes */
+			if(serialize_CurrentDemandResType( (type->CurrentDemandRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of CurrentDemandRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.WeldingDetectionReq)
+		{		
+					
+			/* element ID assignment of WeldingDetectionReq*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=113;	
+
+
+			/* encode start element WeldingDetectionReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of WeldingDetectionReq */
+			if(serialize_WeldingDetectionReqType( (type->WeldingDetectionReq),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of WeldingDetectionReq */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+	if(type->isused.WeldingDetectionRes)
+		{		
+					
+			/* element ID assignment of WeldingDetectionRes*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=115;	
+
+
+			/* encode start element WeldingDetectionRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of WeldingDetectionRes */
+			if(serialize_WeldingDetectionResType( (type->WeldingDetectionRes),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of WeldingDetectionRes */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		}
+				
+
+	return 0;			
+}
+
+
+static int serialize_AnonType_V2G_Message(struct AnonType_V2G_Message* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of Header*/
+			service->eqn.namespaceURI=7;			
+			service->eqn.localPart=4;	
+
+
+			/* encode start element Header */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of Header */
+			if(serialize_MessageHeaderType( (type->Header),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of Header */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+			
+			/* element ID assignment of Body*/
+			service->eqn.namespaceURI=7;			
+			service->eqn.localPart=0;	
+
+
+			/* encode start element Body */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of Body */
+			if(serialize_BodyType( &(type->Body),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of Body */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+
+static int serialize_EXIDocumentType(struct EXIDocumentType* type, struct EXIService* service)
+{
+	
+			/* element ID assignment of V2G_Message*/
+			service->eqn.namespaceURI=7;			
+			service->eqn.localPart=5;	
+
+
+			/* encode start element V2G_Message */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn))) 
+			{
+					return -1;
+			}
+						
+			/* encode children of V2G_Message */
+			if(serialize_AnonType_V2G_Message( &(type->V2G_Message),service))
+			{
+				return -1;
+			}
+
+			
+			 
+			/* encode end element of V2G_Message */
+			exiEncodeEndElement(&(service->outStream), &(service->stateEncode));
+
+		
+
+	return 0;			
+}
+
+ 
+ 
+ 
+ 
+ 
+ /* marshal data to EXI stream */
+static int serialize_message(struct EXIService* service)
+ {
+	
+
+	/* encode start document */ 	
+	if (exiEncodeStartDocument(&(service->outStream), &(service->stateEncode)) ) 
+	{
+	 
+		return -1;
+	}
+
+	/* encode root element of V2G_Message */
+	if (serialize_EXIDocumentType(&(service->exiMsg), service)) 
+	{
+			 
+		return -1;
+	}
+
+
+	/* encode end document */
+	if (exiEncodeEndDocument(&(service->outStream), &(service->stateEncode))) {
+	 
+	return -1;
+	}	
+ 	
+ 	return 0;
+ 	
+ }
+
+ 
+ 
+ 

+ 851 - 0
src/service/v2g_serviceDataTypes.c

@@ -0,0 +1,851 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+#include "EXITypes.h"
+#include "v2g_serviceDataTypes.h"
+
+
+static  void init_sessionIDType(struct sessionIDType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_faultMsgType(struct faultMsgType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_NotificationType(struct NotificationType* type)
+{		
+	init_faultMsgType(&(type->FaultMsg));	
+	type->isused.FaultMsg=0;
+
+}
+
+static  void init_service_string(struct service_string* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_CanonicalizationMethodType(struct CanonicalizationMethodType* type)
+{	
+	init_service_string(&(type->attr_Algorithm));
+
+}
+
+static  void init_SignatureMethodType(struct SignatureMethodType* type)
+{	
+	init_service_string(&(type->attr_Algorithm));
+
+}
+
+static  void init_DigestMethodType(struct DigestMethodType* type)
+{	
+	init_service_string(&(type->attr_Algorithm));
+
+}
+
+static  void init_DigestValueType(struct DigestValueType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ReferenceType(struct ReferenceType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_service_string(&(type->attr_URI));	
+	type->isused.attr_URI=0;	
+	init_service_string(&(type->attr_Type));	
+	type->isused.attr_Type=0;	
+	init_DigestMethodType(&(type->DigestMethod));	
+	init_DigestValueType(&(type->DigestValue));
+
+}
+
+static  void init_SignedInfoType(struct SignedInfoType* type)
+{
+	int i_loop;
+		
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_CanonicalizationMethodType(&(type->CanonicalizationMethod));	
+	init_SignatureMethodType(&(type->SignatureMethod));	
+	for(i_loop=0; i_loop<1;i_loop++)
+	{
+		init_ReferenceType(&(type->Reference[i_loop]));
+	}
+	
+	type->arraylen.Reference=0;
+
+}
+
+static  void init_SignatureValueType(struct SignatureValueType* type)
+{	
+
+
+}
+
+static  void init_X509IssuerSerialType(struct X509IssuerSerialType* type)
+{	
+	init_service_string(&(type->X509IssuerName));	
+
+}
+
+static  void init_service_byte(struct service_byte* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_X509DataType(struct X509DataType* type)
+{	
+	init_X509IssuerSerialType(&(type->X509IssuerSerial));	
+	init_service_byte(&(type->X509SKI));	
+	init_service_string(&(type->X509SubjectName));	
+	init_service_byte(&(type->X509Certificate));	
+	init_service_byte(&(type->X509CRL));
+
+}
+
+static  void init_KeyInfoType(struct KeyInfoType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_X509DataType(&(type->X509Data));
+
+}
+
+static  void init_SignatureType(struct SignatureType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_SignedInfoType(&(type->SignedInfo));	
+	init_SignatureValueType(&(type->SignatureValue));	
+	init_KeyInfoType(&(type->KeyInfo));	
+	type->isused.KeyInfo=0;
+
+}
+
+static  void init_MessageHeaderType(struct MessageHeaderType* type)
+{	
+	init_sessionIDType(&(type->SessionID));	
+	init_NotificationType(&(type->Notification));	
+	type->isused.Notification=0;		
+	type->isused.Signature=0;
+
+}
+
+static  void init_evccIDType(struct evccIDType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionSetupReqType(struct SessionSetupReqType* type)
+{	
+	init_evccIDType(&(type->EVCCID));
+
+}
+
+static  void init_evseIDType(struct evseIDType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionSetupResType(struct SessionSetupResType* type)
+{		
+	init_evseIDType(&(type->EVSEID));		
+	type->isused.DateTimeNow=0;
+
+}
+
+static  void init_serviceScopeType(struct serviceScopeType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServiceDiscoveryReqType(struct ServiceDiscoveryReqType* type)
+{	
+	init_serviceScopeType(&(type->ServiceScope));	
+	type->isused.ServiceScope=0;		
+	type->isused.ServiceCategory=0;
+
+}
+
+static  void init_PaymentOptionsType(struct PaymentOptionsType* type)
+{
+
+		
+	type->arraylen.PaymentOption=0;
+
+}
+
+static  void init_serviceNameType(struct serviceNameType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServiceTagType(struct ServiceTagType* type)
+{		
+	init_serviceNameType(&(type->ServiceName));	
+	type->isused.ServiceName=0;		
+	type->isused.ServiceCategory=0;	
+	init_serviceScopeType(&(type->ServiceScope));	
+	type->isused.ServiceScope=0;
+
+}
+
+static  void init_ServiceChargeType(struct ServiceChargeType* type)
+{	
+	init_ServiceTagType(&(type->ServiceTag));		
+
+}
+
+static  void init_ServiceType(struct ServiceType* type)
+{	
+	init_ServiceTagType(&(type->ServiceTag));	
+
+}
+
+static  void init_ServiceTagListType(struct ServiceTagListType* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_ServiceType(&(type->Service[i_loop]));
+	}
+	
+	type->arraylen.Service=0;
+
+}
+
+static  void init_ServiceDiscoveryResType(struct ServiceDiscoveryResType* type)
+{		
+	init_PaymentOptionsType(&(type->PaymentOptions));	
+	init_ServiceChargeType(&(type->ChargeService));	
+	init_ServiceTagListType(&(type->ServiceList));	
+	type->isused.ServiceList=0;
+
+}
+
+static  void init_PhysicalValueType(struct PhysicalValueType* type)
+{			
+	type->isused.Unit=0;	
+
+}
+
+static  void init_ParameterType(struct ParameterType* type)
+{	
+	init_service_string(&(type->attr_Name));	
+	init_service_string(&(type->attr_ValueType));					
+	init_PhysicalValueType(&(type->physicalValue));	
+	init_service_string(&(type->stringValue));
+
+}
+
+static  void init_ParameterSetType(struct ParameterSetType* type)
+{
+	int i_loop;
+			
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_ParameterType(&(type->Parameter[i_loop]));
+	}
+	
+	type->arraylen.Parameter=0;
+
+}
+
+static  void init_ServiceParameterListType(struct ServiceParameterListType* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_ParameterSetType(&(type->ParameterSet[i_loop]));
+	}
+	
+	type->arraylen.ParameterSet=0;
+
+}
+
+static  void init_ServiceDetailResType(struct ServiceDetailResType* type)
+{			
+	init_ServiceParameterListType(&(type->ServiceParameterList));	
+	type->isused.ServiceParameterList=0;
+
+}
+
+static  void init_SelectedServiceType(struct SelectedServiceType* type)
+{			
+	type->isused.ParameterSetID=0;
+
+}
+
+static  void init_SelectedServiceListType(struct SelectedServiceListType* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_SelectedServiceType(&(type->SelectedService[i_loop]));
+	}
+	
+	type->arraylen.SelectedService=0;
+
+}
+
+static  void init_ServicePaymentSelectionReqType(struct ServicePaymentSelectionReqType* type)
+{		
+	init_SelectedServiceListType(&(type->SelectedServiceList));
+
+}
+
+static  void init_contractIDType(struct contractIDType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_certificateType(struct certificateType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SubCertificatesType(struct SubCertificatesType* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_certificateType(&(type->Certificate[i_loop]));
+	}
+	
+	type->arraylen.Certificate=0;
+
+}
+
+static  void init_CertificateChainType(struct CertificateChainType* type)
+{	
+	init_certificateType(&(type->Certificate));	
+	init_SubCertificatesType(&(type->SubCertificates));	
+	type->isused.SubCertificates=0;
+
+}
+
+static  void init_PaymentDetailsReqType(struct PaymentDetailsReqType* type)
+{	
+	init_contractIDType(&(type->ContractID));	
+	init_CertificateChainType(&(type->ContractSignatureCertChain));
+
+}
+
+static  void init_genChallengeType(struct genChallengeType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_PaymentDetailsResType(struct PaymentDetailsResType* type)
+{		
+	init_genChallengeType(&(type->GenChallenge));	
+
+}
+
+static  void init_ContractAuthenticationReqType(struct ContractAuthenticationReqType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	init_genChallengeType(&(type->GenChallenge));
+
+}
+
+static  void init_AC_EVChargeParameterType(struct AC_EVChargeParameterType* type)
+{		
+	init_PhysicalValueType(&(type->EAmount));	
+	init_PhysicalValueType(&(type->EVMaxVoltage));	
+	init_PhysicalValueType(&(type->EVMaxCurrent));	
+	init_PhysicalValueType(&(type->EVMinCurrent));
+
+}
+
+static  void init_DC_EVStatusType(struct DC_EVStatusType* type)
+{			
+	type->isused.EVCabinConditioning=0;		
+	type->isused.EVRESSConditioning=0;		
+
+}
+
+static  void init_DC_EVChargeParameterType(struct DC_EVChargeParameterType* type)
+{	
+	init_DC_EVStatusType(&(type->DC_EVStatus));	
+	init_PhysicalValueType(&(type->EVMaximumCurrentLimit));	
+	init_PhysicalValueType(&(type->EVMaximumPowerLimit));	
+	type->isused.EVMaximumPowerLimit=0;	
+	init_PhysicalValueType(&(type->EVMaximumVoltageLimit));	
+	init_PhysicalValueType(&(type->EVEnergyCapacity));	
+	type->isused.EVEnergyCapacity=0;	
+	init_PhysicalValueType(&(type->EVEnergyRequest));	
+	type->isused.EVEnergyRequest=0;		
+	type->isused.FullSOC=0;		
+	type->isused.BulkSOC=0;
+
+}
+
+static  void init_ChargeParameterDiscoveryReqType(struct ChargeParameterDiscoveryReqType* type)
+{			
+	type->isused.AC_EVChargeParameter=0;		
+	type->isused.DC_EVChargeParameter=0;
+
+}
+
+static  void init_RelativeTimeIntervalType(struct RelativeTimeIntervalType* type)
+{			
+	type->isused.duration=0;
+
+}
+
+static  void init_PMaxScheduleEntryType(struct PMaxScheduleEntryType* type)
+{	
+	init_RelativeTimeIntervalType(&(type->RelativeTimeInterval));	
+
+}
+
+static  void init_PMaxScheduleType(struct PMaxScheduleType* type)
+{
+	int i_loop;
+			
+	for(i_loop=0; i_loop<12;i_loop++)
+	{
+		init_PMaxScheduleEntryType(&(type->PMaxScheduleEntry[i_loop]));
+	}
+	
+	type->arraylen.PMaxScheduleEntry=0;
+
+}
+
+static  void init_tariffDescriptionType(struct tariffDescriptionType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_CostType(struct CostType* type)
+{				
+	type->isused.amountMultiplier=0;
+
+}
+
+static  void init_ConsumptionCostType(struct ConsumptionCostType* type)
+{
+	int i_loop;
+			
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_CostType(&(type->Cost[i_loop]));
+	}
+	
+	type->arraylen.Cost=0;	
+	type->isused.Cost=0;
+
+}
+
+static  void init_SalesTariffEntryType(struct SalesTariffEntryType* type)
+{
+	int i_loop;
+		
+	init_RelativeTimeIntervalType(&(type->RelativeTimeInterval));		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_ConsumptionCostType(&(type->ConsumptionCost[i_loop]));
+	}
+	
+	type->arraylen.ConsumptionCost=0;	
+	type->isused.ConsumptionCost=0;
+
+}
+
+static  void init_SalesTariffType(struct SalesTariffType* type)
+{
+	int i_loop;
+		
+	init_service_string(&(type->attr_Id));		
+	init_tariffDescriptionType(&(type->SalesTariffDescription));	
+	type->isused.SalesTariffDescription=0;		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_SalesTariffEntryType(&(type->SalesTariffEntry[i_loop]));
+	}
+	
+	type->arraylen.SalesTariffEntry=0;
+
+}
+
+static  void init_SAScheduleTupleType(struct SAScheduleTupleType* type)
+{		
+	init_PMaxScheduleType(&(type->PMaxSchedule));		
+	type->isused.SalesTariff=0;
+
+}
+
+static  void init_SAScheduleListType(struct SAScheduleListType* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<3;i_loop++)
+	{
+		init_SAScheduleTupleType(&(type->SAScheduleTuple[i_loop]));
+	}
+	
+	type->arraylen.SAScheduleTuple=0;
+
+}
+
+static  void init_AC_EVSEChargeParameterType(struct AC_EVSEChargeParameterType* type)
+{		
+	init_PhysicalValueType(&(type->EVSEMaxVoltage));	
+	init_PhysicalValueType(&(type->EVSEMaxCurrent));	
+	init_PhysicalValueType(&(type->EVSEMinCurrent));
+
+}
+
+static  void init_DC_EVSEStatusType(struct DC_EVSEStatusType* type)
+{		
+	type->isused.EVSEIsolationStatus=0;	
+
+}
+
+static  void init_DC_EVSEChargeParameterType(struct DC_EVSEChargeParameterType* type)
+{	
+	init_DC_EVSEStatusType(&(type->DC_EVSEStatus));	
+	init_PhysicalValueType(&(type->EVSEMaximumCurrentLimit));	
+	init_PhysicalValueType(&(type->EVSEMaximumPowerLimit));	
+	type->isused.EVSEMaximumPowerLimit=0;	
+	init_PhysicalValueType(&(type->EVSEMaximumVoltageLimit));	
+	init_PhysicalValueType(&(type->EVSEMinimumCurrentLimit));	
+	init_PhysicalValueType(&(type->EVSEMinimumVoltageLimit));	
+	init_PhysicalValueType(&(type->EVSECurrentRegulationTolerance));	
+	type->isused.EVSECurrentRegulationTolerance=0;	
+	init_PhysicalValueType(&(type->EVSEPeakCurrentRipple));	
+	init_PhysicalValueType(&(type->EVSEEnergyToBeDelivered));	
+	type->isused.EVSEEnergyToBeDelivered=0;
+
+}
+
+static  void init_ChargeParameterDiscoveryResType(struct ChargeParameterDiscoveryResType* type)
+{			
+	type->isused.SAScheduleList=0;		
+	type->isused.AC_EVSEChargeParameter=0;		
+	type->isused.DC_EVSEChargeParameter=0;
+
+}
+
+static  void init_ChargingProfileType(struct ChargingProfileType* type)
+{
+			
+	type->arraylen.ProfileEntry=0;
+
+}
+
+static  void init_DC_EVPowerDeliveryParameterType(struct DC_EVPowerDeliveryParameterType* type)
+{	
+	init_DC_EVStatusType(&(type->DC_EVStatus));		
+	type->isused.BulkChargingComplete=0;	
+
+}
+
+static  void init_PowerDeliveryReqType(struct PowerDeliveryReqType* type)
+{		
+	init_ChargingProfileType(&(type->ChargingProfile));	
+	type->isused.ChargingProfile=0;		
+	type->isused.DC_EVPowerDeliveryParameter=0;
+
+}
+
+static  void init_PowerDeliveryResType(struct PowerDeliveryResType* type)
+{			
+	type->isused.AC_EVSEStatus=0;		
+	type->isused.DC_EVSEStatus=0;
+
+}
+
+static  void init_meterIDType(struct meterIDType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_sigMeterReadingType(struct sigMeterReadingType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_MeterInfoType(struct MeterInfoType* type)
+{	
+	init_meterIDType(&(type->MeterID));	
+	init_PhysicalValueType(&(type->MeterReading));	
+	type->isused.MeterReading=0;	
+	init_sigMeterReadingType(&(type->SigMeterReading));	
+	type->isused.SigMeterReading=0;		
+	type->isused.MeterStatus=0;		
+	type->isused.TMeter=0;
+
+}
+
+static  void init_ChargingStatusResType(struct ChargingStatusResType* type)
+{		
+	init_evseIDType(&(type->EVSEID));		
+	type->isused.SAScheduleTupleID=0;	
+	init_PhysicalValueType(&(type->EVSEMaxCurrent));	
+	type->isused.EVSEMaxCurrent=0;	
+	init_MeterInfoType(&(type->MeterInfo));	
+	type->isused.MeterInfo=0;		
+
+}
+
+static  void init_MeteringReceiptReqType(struct MeteringReceiptReqType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_sessionIDType(&(type->SessionID));		
+	type->isused.SAScheduleTupleID=0;	
+	init_MeterInfoType(&(type->MeterInfo));
+
+}
+
+static  void init_MeteringReceiptResType(struct MeteringReceiptResType* type)
+{		
+
+}
+
+static  void init_rootCertificateIDType(struct rootCertificateIDType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ListOfRootCertificateIDsType(struct ListOfRootCertificateIDsType* type)
+{
+	int i_loop;
+		
+	for(i_loop=0; i_loop<2;i_loop++)
+	{
+		init_rootCertificateIDType(&(type->RootCertificateID[i_loop]));
+	}
+	
+	type->arraylen.RootCertificateID=0;
+
+}
+
+static  void init_dHParamsType(struct dHParamsType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_CertificateUpdateReqType(struct CertificateUpdateReqType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_CertificateChainType(&(type->ContractSignatureCertChain));	
+	init_contractIDType(&(type->ContractID));	
+	init_ListOfRootCertificateIDsType(&(type->ListOfRootCertificateIDs));	
+	init_dHParamsType(&(type->DHParams));
+
+}
+
+static  void init_privateKeyType(struct privateKeyType* type)
+{	
+	type->arraylen.data=0;
+
+}
+
+static  void init_CertificateUpdateResType(struct CertificateUpdateResType* type)
+{	
+	init_service_string(&(type->attr_Id));		
+	init_CertificateChainType(&(type->ContractSignatureCertChain));	
+	init_privateKeyType(&(type->ContractSignatureEncryptedPrivateKey));	
+	init_dHParamsType(&(type->DHParams));	
+	init_contractIDType(&(type->ContractID));	
+
+}
+
+static  void init_CertificateInstallationReqType(struct CertificateInstallationReqType* type)
+{	
+	init_service_string(&(type->attr_Id));	
+	type->isused.attr_Id=0;	
+	init_certificateType(&(type->OEMProvisioningCert));	
+	init_ListOfRootCertificateIDsType(&(type->ListOfRootCertificateIDs));	
+	init_dHParamsType(&(type->DHParams));
+
+}
+
+static  void init_CertificateInstallationResType(struct CertificateInstallationResType* type)
+{	
+	init_service_string(&(type->attr_Id));		
+	init_CertificateChainType(&(type->ContractSignatureCertChain));	
+	init_privateKeyType(&(type->ContractSignatureEncryptedPrivateKey));	
+	init_dHParamsType(&(type->DHParams));	
+	init_contractIDType(&(type->ContractID));
+
+}
+
+static  void init_CableCheckReqType(struct CableCheckReqType* type)
+{	
+	init_DC_EVStatusType(&(type->DC_EVStatus));
+
+}
+
+static  void init_CableCheckResType(struct CableCheckResType* type)
+{		
+	init_DC_EVSEStatusType(&(type->DC_EVSEStatus));
+
+}
+
+static  void init_PreChargeReqType(struct PreChargeReqType* type)
+{	
+	init_DC_EVStatusType(&(type->DC_EVStatus));	
+	init_PhysicalValueType(&(type->EVTargetVoltage));	
+	init_PhysicalValueType(&(type->EVTargetCurrent));
+
+}
+
+static  void init_PreChargeResType(struct PreChargeResType* type)
+{		
+	init_DC_EVSEStatusType(&(type->DC_EVSEStatus));	
+	init_PhysicalValueType(&(type->EVSEPresentVoltage));
+
+}
+
+static  void init_CurrentDemandReqType(struct CurrentDemandReqType* type)
+{	
+	init_DC_EVStatusType(&(type->DC_EVStatus));	
+	init_PhysicalValueType(&(type->EVTargetCurrent));	
+	init_PhysicalValueType(&(type->EVMaximumVoltageLimit));	
+	type->isused.EVMaximumVoltageLimit=0;	
+	init_PhysicalValueType(&(type->EVMaximumCurrentLimit));	
+	type->isused.EVMaximumCurrentLimit=0;	
+	init_PhysicalValueType(&(type->EVMaximumPowerLimit));	
+	type->isused.EVMaximumPowerLimit=0;		
+	type->isused.BulkChargingComplete=0;		
+	init_PhysicalValueType(&(type->RemainingTimeToFullSoC));	
+	type->isused.RemainingTimeToFullSoC=0;	
+	init_PhysicalValueType(&(type->RemainingTimeToBulkSoC));	
+	type->isused.RemainingTimeToBulkSoC=0;	
+	init_PhysicalValueType(&(type->EVTargetVoltage));
+
+}
+
+static  void init_CurrentDemandResType(struct CurrentDemandResType* type)
+{		
+	init_DC_EVSEStatusType(&(type->DC_EVSEStatus));	
+	init_PhysicalValueType(&(type->EVSEPresentVoltage));	
+	init_PhysicalValueType(&(type->EVSEPresentCurrent));				
+	init_PhysicalValueType(&(type->EVSEMaximumVoltageLimit));	
+	type->isused.EVSEMaximumVoltageLimit=0;	
+	init_PhysicalValueType(&(type->EVSEMaximumCurrentLimit));	
+	type->isused.EVSEMaximumCurrentLimit=0;	
+	init_PhysicalValueType(&(type->EVSEMaximumPowerLimit));	
+	type->isused.EVSEMaximumPowerLimit=0;
+
+}
+
+static  void init_WeldingDetectionReqType(struct WeldingDetectionReqType* type)
+{	
+	init_DC_EVStatusType(&(type->DC_EVStatus));
+
+}
+
+static  void init_WeldingDetectionResType(struct WeldingDetectionResType* type)
+{		
+	init_DC_EVSEStatusType(&(type->DC_EVSEStatus));	
+	init_PhysicalValueType(&(type->EVSEPresentVoltage));
+
+}
+
+static  void init_BodyType(struct BodyType* type)
+{		
+	type->isused.SessionSetupReq=0;		
+	type->isused.SessionSetupRes=0;		
+	type->isused.ServiceDiscoveryReq=0;		
+	type->isused.ServiceDiscoveryRes=0;		
+	type->isused.ServiceDetailReq=0;		
+	type->isused.ServiceDetailRes=0;		
+	type->isused.ServicePaymentSelectionReq=0;		
+	type->isused.ServicePaymentSelectionRes=0;		
+	type->isused.PaymentDetailsReq=0;		
+	type->isused.PaymentDetailsRes=0;		
+	type->isused.ContractAuthenticationReq=0;		
+	type->isused.ContractAuthenticationRes=0;		
+	type->isused.ChargeParameterDiscoveryReq=0;		
+	type->isused.ChargeParameterDiscoveryRes=0;		
+	type->isused.PowerDeliveryReq=0;		
+	type->isused.PowerDeliveryRes=0;		
+	type->isused.ChargingStatusReq=0;		
+	type->isused.ChargingStatusRes=0;		
+	type->isused.MeteringReceiptReq=0;		
+	type->isused.MeteringReceiptRes=0;		
+	type->isused.SessionStopReq=0;		
+	type->isused.SessionStopRes=0;		
+	type->isused.CertificateUpdateReq=0;		
+	type->isused.CertificateUpdateRes=0;		
+	type->isused.CertificateInstallationReq=0;		
+	type->isused.CertificateInstallationRes=0;		
+	type->isused.CableCheckReq=0;		
+	type->isused.CableCheckRes=0;		
+	type->isused.PreChargeReq=0;		
+	type->isused.PreChargeRes=0;		
+	type->isused.CurrentDemandReq=0;		
+	type->isused.CurrentDemandRes=0;		
+	type->isused.WeldingDetectionReq=0;		
+	type->isused.WeldingDetectionRes=0;
+
+}
+
+static  void init_AnonType_V2G_Message(struct AnonType_V2G_Message* type)
+{		
+	init_BodyType(&(type->Body));
+
+}
+
+static  void init_EXIDocumentType(struct EXIDocumentType* type)
+{	
+	init_AnonType_V2G_Message(&(type->V2G_Message));
+
+}

+ 1681 - 0
src/service/v2g_serviceDataTypes.h

@@ -0,0 +1,1681 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SERVICEDATATYPES_H
+#define SERVICEDATATYPES_H
+
+#include "EXITypes.h"
+
+
+	
+
+enum faultCodeType
+{
+	ParsingError_faultCodeType, 
+	NoTLSRootCertificatAvailable_faultCodeType, 
+	UnknownError_faultCodeType
+
+}; 
+
+enum responseCodeType
+{
+	OK_responseCodeType, 
+	OK_NewSessionEstablished_responseCodeType, 
+	OK_OldSessionJoined_responseCodeType, 
+	OK_CertificateExpiresSoon_responseCodeType, 
+	FAILED_responseCodeType, 
+	FAILED_SequenceError_responseCodeType, 
+	FAILED_ServiceIDInvalid_responseCodeType, 
+	FAILED_UnknownSession_responseCodeType, 
+	FAILED_ServiceSelectionInvalid_responseCodeType, 
+	FAILED_PaymentSelectionInvalid_responseCodeType, 
+	FAILED_CertificateExpired_responseCodeType, 
+	FAILED_SignatureError_responseCodeType, 
+	FAILED_NoCertificateAvailable_responseCodeType, 
+	FAILED_CertChainError_responseCodeType, 
+	FAILED_ChallengeInvalid_responseCodeType, 
+	FAILED_ContractCanceled_responseCodeType, 
+	FAILED_WrongChargeParameter_responseCodeType, 
+	FAILED_PowerDeliveryNotApplied_responseCodeType, 
+	FAILED_TariffSelectionInvalid_responseCodeType, 
+	FAILED_ChargingProfileInvalid_responseCodeType, 
+	FAILED_EVSEPresentVoltageToLow_responseCodeType, 
+	FAILED_MeteringSignatureNotValid_responseCodeType, 
+	FAILED_WrongEnergyTransferType_responseCodeType
+
+}; 
+
+enum serviceCategoryType
+{
+	EVCharging_serviceCategoryType, 
+	Internet_serviceCategoryType, 
+	ContractCertificate_serviceCategoryType, 
+	OtherCustom_serviceCategoryType
+
+}; 
+
+enum paymentOptionType
+{
+	Contract_paymentOptionType, 
+	ExternalPayment_paymentOptionType
+
+}; 
+
+enum EVSESupportedEnergyTransferType
+{
+	AC_single_phase_core_EVSESupportedEnergyTransferType, 
+	AC_three_phase_core_EVSESupportedEnergyTransferType, 
+	DC_core_EVSESupportedEnergyTransferType, 
+	DC_extended_EVSESupportedEnergyTransferType, 
+	DC_combo_core_EVSESupportedEnergyTransferType, 
+	DC_dual_EVSESupportedEnergyTransferType, 
+	AC_core1p_DC_extended_EVSESupportedEnergyTransferType, 
+	AC_single_DC_core_EVSESupportedEnergyTransferType, 
+	AC_single_phase_three_phase_core_DC_extended_EVSESupportedEnergyTransferType, 
+	AC_core3p_DC_extended_EVSESupportedEnergyTransferType
+
+}; 
+
+enum unitSymbolType
+{
+	h_unitSymbolType, 
+	m_unitSymbolType, 
+	s_unitSymbolType, 
+	A_unitSymbolType, 
+	Ah_unitSymbolType, 
+	V_unitSymbolType, 
+	VA_unitSymbolType, 
+	W_unitSymbolType, 
+	W_s_unitSymbolType, 
+	Wh_unitSymbolType
+
+}; 
+
+enum EVRequestedEnergyTransferType
+{
+	AC_single_phase_core_EVRequestedEnergyTransferType, 
+	AC_three_phase_core_EVRequestedEnergyTransferType, 
+	DC_core_EVRequestedEnergyTransferType, 
+	DC_extended_EVRequestedEnergyTransferType, 
+	DC_combo_core_EVRequestedEnergyTransferType, 
+	DC_unique_EVRequestedEnergyTransferType
+
+}; 
+
+enum DC_EVErrorCodeType
+{
+	NO_ERROR_DC_EVErrorCodeType, 
+	FAILED_RESSTemperatureInhibit_DC_EVErrorCodeType, 
+	FAILED_EVShiftPosition_DC_EVErrorCodeType, 
+	FAILED_ChargerConnectorLockFault_DC_EVErrorCodeType, 
+	FAILED_EVRESSMalfunction_DC_EVErrorCodeType, 
+	FAILED_ChargingCurrentdifferential_DC_EVErrorCodeType, 
+	FAILED_ChargingVoltageOutOfRange_DC_EVErrorCodeType, 
+	Reserved_A_DC_EVErrorCodeType, 
+	Reserved_B_DC_EVErrorCodeType, 
+	Reserved_C_DC_EVErrorCodeType, 
+	FAILED_ChargingSystemIncompatibility_DC_EVErrorCodeType, 
+	NoData_DC_EVErrorCodeType
+
+}; 
+
+enum costKindType
+{
+	relativePricePercentage_costKindType, 
+	RenewableGenerationPercentage_costKindType, 
+	CarbonDioxideEmission_costKindType
+
+}; 
+
+enum isolationLevelType
+{
+	Invalid_isolationLevelType, 
+	Safe_isolationLevelType, 
+	Warning_isolationLevelType, 
+	Fault_isolationLevelType
+
+}; 
+
+enum DC_EVSEStatusCodeType
+{
+	EVSE_NotReady_DC_EVSEStatusCodeType, 
+	EVSE_Ready_DC_EVSEStatusCodeType, 
+	EVSE_Shutdown_DC_EVSEStatusCodeType, 
+	EVSE_UtilityInterruptEvent_DC_EVSEStatusCodeType, 
+	EVSE_Precharge_DC_EVSEStatusCodeType, 
+	EVSE_IsolationMonitoringActive_DC_EVSEStatusCodeType, 
+	EVSE_EmergencyShutdown_DC_EVSEStatusCodeType, 
+	EVSE_Malfunction_DC_EVSEStatusCodeType, 
+	Reserved_8_DC_EVSEStatusCodeType, 
+	Reserved_9_DC_EVSEStatusCodeType, 
+	Reserved_A_DC_EVSEStatusCodeType, 
+	Reserved_B_DC_EVSEStatusCodeType, 
+	Reserved_C_DC_EVSEStatusCodeType
+
+}; 
+
+
+
+
+struct arraylen_sessionIDType
+{
+	size_t data;
+
+
+};
+
+struct sessionIDType
+{
+	uint8_t data[8];
+	struct arraylen_sessionIDType arraylen;
+
+};
+
+struct arraylen_faultMsgType
+{
+	size_t data;
+
+
+};
+
+struct faultMsgType
+{
+	uint32_t data[64];
+	struct arraylen_faultMsgType arraylen;
+
+};
+
+struct selection_NotificationType
+{
+	unsigned int FaultMsg:1;
+
+
+};
+
+struct NotificationType
+{
+	enum faultCodeType FaultCode;
+	struct faultMsgType FaultMsg;
+	struct selection_NotificationType isused;
+
+};
+
+struct selection_MessageHeaderType
+{
+	unsigned int Notification:1;
+	unsigned int Signature:1;
+
+
+};
+
+struct arraylen_service_string
+{
+	size_t data;
+
+
+};
+
+struct service_string
+{
+	uint32_t data[256];
+	struct arraylen_service_string arraylen;
+
+};
+
+struct selection_SignatureType
+{
+	unsigned int attr_Id:1;
+	unsigned int KeyInfo:1;
+
+
+};
+
+struct selection_SignedInfoType
+{
+	unsigned int attr_Id:1;
+
+
+};
+
+struct CanonicalizationMethodType
+{
+	struct service_string attr_Algorithm;
+
+
+};
+
+struct SignatureMethodType
+{
+	struct service_string attr_Algorithm;
+
+
+};
+
+struct selection_ReferenceType
+{
+	unsigned int attr_Id:1;
+	unsigned int attr_URI:1;
+	unsigned int attr_Type:1;
+
+
+};
+
+struct DigestMethodType
+{
+	struct service_string attr_Algorithm;
+
+
+};
+
+struct arraylen_DigestValueType
+{
+	size_t data;
+
+
+};
+
+struct DigestValueType
+{
+	uint8_t data[128];
+	struct arraylen_DigestValueType arraylen;
+
+};
+
+struct ReferenceType
+{
+	struct service_string attr_Id;
+	struct service_string attr_URI;
+	struct service_string attr_Type;
+	struct DigestMethodType DigestMethod;
+	struct DigestValueType DigestValue;
+	struct selection_ReferenceType isused;
+
+};
+
+struct arraylen_SignedInfoType
+{
+	size_t Reference;
+
+
+};
+
+struct SignedInfoType
+{
+	struct service_string attr_Id;
+	struct CanonicalizationMethodType CanonicalizationMethod;
+	struct SignatureMethodType SignatureMethod;
+	struct ReferenceType Reference[1];
+	struct selection_SignedInfoType isused;	struct arraylen_SignedInfoType arraylen;
+
+};
+
+struct arraylen_SignatureValueType
+{
+	size_t data;
+
+
+};
+
+struct SignatureValueType
+{
+
+
+	uint8_t data[128];
+	struct arraylen_SignatureValueType arraylen;
+
+};
+
+struct selection_KeyInfoType
+{
+	unsigned int attr_Id:1;
+
+
+};
+
+struct X509IssuerSerialType
+{
+	struct service_string X509IssuerName;
+	int64_t X509SerialNumber;
+
+
+};
+
+struct arraylen_service_byte
+{
+	size_t data;
+
+
+};
+
+struct service_byte
+{
+	uint8_t data[128];
+	struct arraylen_service_byte arraylen;
+
+};
+
+struct X509DataType
+{
+	struct X509IssuerSerialType X509IssuerSerial;
+	struct service_byte X509SKI;
+	struct service_string X509SubjectName;
+	struct service_byte X509Certificate;
+	struct service_byte X509CRL;
+
+
+};
+
+struct KeyInfoType
+{
+	struct service_string attr_Id;
+	struct X509DataType X509Data;
+	struct selection_KeyInfoType isused;
+
+};
+
+struct SignatureType
+{
+	struct service_string attr_Id;
+	struct SignedInfoType SignedInfo;
+	struct SignatureValueType SignatureValue;
+	struct KeyInfoType KeyInfo;
+	struct selection_SignatureType isused;
+
+};
+
+struct MessageHeaderType
+{
+	struct sessionIDType SessionID;
+	struct NotificationType Notification;
+	struct SignatureType* Signature;
+	struct selection_MessageHeaderType isused;
+
+};
+
+struct arraylen_evccIDType
+{
+	size_t data;
+
+
+};
+
+struct evccIDType
+{
+	uint8_t data[8];
+	struct arraylen_evccIDType arraylen;
+
+};
+
+struct SessionSetupReqType
+{
+	struct evccIDType EVCCID;
+
+
+};
+
+struct selection_BodyType
+{
+	unsigned int SessionSetupReq:1;
+	unsigned int SessionSetupRes:1;
+	unsigned int ServiceDiscoveryReq:1;
+	unsigned int ServiceDiscoveryRes:1;
+	unsigned int ServiceDetailReq:1;
+	unsigned int ServiceDetailRes:1;
+	unsigned int ServicePaymentSelectionReq:1;
+	unsigned int ServicePaymentSelectionRes:1;
+	unsigned int PaymentDetailsReq:1;
+	unsigned int PaymentDetailsRes:1;
+	unsigned int ContractAuthenticationReq:1;
+	unsigned int ContractAuthenticationRes:1;
+	unsigned int ChargeParameterDiscoveryReq:1;
+	unsigned int ChargeParameterDiscoveryRes:1;
+	unsigned int PowerDeliveryReq:1;
+	unsigned int PowerDeliveryRes:1;
+	unsigned int ChargingStatusReq:1;
+	unsigned int ChargingStatusRes:1;
+	unsigned int MeteringReceiptReq:1;
+	unsigned int MeteringReceiptRes:1;
+	unsigned int SessionStopReq:1;
+	unsigned int SessionStopRes:1;
+	unsigned int CertificateUpdateReq:1;
+	unsigned int CertificateUpdateRes:1;
+	unsigned int CertificateInstallationReq:1;
+	unsigned int CertificateInstallationRes:1;
+	unsigned int CableCheckReq:1;
+	unsigned int CableCheckRes:1;
+	unsigned int PreChargeReq:1;
+	unsigned int PreChargeRes:1;
+	unsigned int CurrentDemandReq:1;
+	unsigned int CurrentDemandRes:1;
+	unsigned int WeldingDetectionReq:1;
+	unsigned int WeldingDetectionRes:1;
+
+
+};
+
+struct arraylen_evseIDType
+{
+	size_t data;
+
+
+};
+
+struct evseIDType
+{
+	uint8_t data[32];
+	struct arraylen_evseIDType arraylen;
+
+};
+
+struct selection_SessionSetupResType
+{
+	unsigned int DateTimeNow:1;
+
+
+};
+
+struct SessionSetupResType
+{
+	enum responseCodeType ResponseCode;
+	struct evseIDType EVSEID;
+	int64_t DateTimeNow;
+	struct selection_SessionSetupResType isused;
+
+};
+
+struct arraylen_serviceScopeType
+{
+	size_t data;
+
+
+};
+
+struct serviceScopeType
+{
+	uint32_t data[32];
+	struct arraylen_serviceScopeType arraylen;
+
+};
+
+struct selection_ServiceDiscoveryReqType
+{
+	unsigned int ServiceScope:1;
+	unsigned int ServiceCategory:1;
+
+
+};
+
+struct ServiceDiscoveryReqType
+{
+	struct serviceScopeType ServiceScope;
+	enum serviceCategoryType ServiceCategory;
+	struct selection_ServiceDiscoveryReqType isused;
+
+};
+
+struct arraylen_PaymentOptionsType
+{
+	size_t PaymentOption;
+
+
+};
+
+struct PaymentOptionsType
+{
+	enum paymentOptionType PaymentOption[2];
+	struct arraylen_PaymentOptionsType arraylen;
+
+};
+
+struct arraylen_serviceNameType
+{
+	size_t data;
+
+
+};
+
+struct serviceNameType
+{
+	uint32_t data[32];
+	struct arraylen_serviceNameType arraylen;
+
+};
+
+struct selection_ServiceTagType
+{
+	unsigned int ServiceName:1;
+	unsigned int ServiceCategory:1;
+	unsigned int ServiceScope:1;
+
+
+};
+
+struct ServiceTagType
+{
+	uint16_t ServiceID;
+	struct serviceNameType ServiceName;
+	enum serviceCategoryType ServiceCategory;
+	struct serviceScopeType ServiceScope;
+	struct selection_ServiceTagType isused;
+
+};
+
+struct ServiceChargeType
+{
+	struct ServiceTagType ServiceTag;
+	int FreeService;
+	enum EVSESupportedEnergyTransferType EnergyTransferType;
+
+
+};
+
+struct ServiceType
+{
+	struct ServiceTagType ServiceTag;
+	int FreeService;
+
+
+};
+
+struct arraylen_ServiceTagListType
+{
+	size_t Service;
+
+
+};
+
+struct ServiceTagListType
+{
+	struct ServiceType Service[2];
+	struct arraylen_ServiceTagListType arraylen;
+
+};
+
+struct selection_ServiceDiscoveryResType
+{
+	unsigned int ServiceList:1;
+
+
+};
+
+struct ServiceDiscoveryResType
+{
+	enum responseCodeType ResponseCode;
+	struct PaymentOptionsType PaymentOptions;
+	struct ServiceChargeType ChargeService;
+	struct ServiceTagListType ServiceList;
+	struct selection_ServiceDiscoveryResType isused;
+
+};
+
+struct ServiceDetailReqType
+{
+	uint16_t ServiceID;
+
+
+};
+
+struct selection_PhysicalValueType
+{
+	unsigned int Unit:1;
+
+
+};
+
+struct PhysicalValueType
+{
+	int8_t Multiplier;
+	enum unitSymbolType Unit;
+	int16_t Value;
+	struct selection_PhysicalValueType isused;
+
+};
+
+struct ParameterType
+{
+	struct service_string attr_Name;
+	struct service_string attr_ValueType;
+	int boolValue;
+	int8_t byteValue;
+	int16_t shortValue;
+	int32_t intValue;
+	struct PhysicalValueType physicalValue;
+	struct service_string stringValue;
+
+
+};
+
+struct arraylen_ParameterSetType
+{
+	size_t Parameter;
+
+
+};
+
+struct ParameterSetType
+{
+	int16_t ParameterSetID;
+	struct ParameterType Parameter[2];
+	struct arraylen_ParameterSetType arraylen;
+
+};
+
+struct arraylen_ServiceParameterListType
+{
+	size_t ParameterSet;
+
+
+};
+
+struct ServiceParameterListType
+{
+	struct ParameterSetType ParameterSet[2];
+	struct arraylen_ServiceParameterListType arraylen;
+
+};
+
+struct selection_ServiceDetailResType
+{
+	unsigned int ServiceParameterList:1;
+
+
+};
+
+struct ServiceDetailResType
+{
+	enum responseCodeType ResponseCode;
+	uint16_t ServiceID;
+	struct ServiceParameterListType ServiceParameterList;
+	struct selection_ServiceDetailResType isused;
+
+};
+
+struct selection_SelectedServiceType
+{
+	unsigned int ParameterSetID:1;
+
+
+};
+
+struct SelectedServiceType
+{
+	uint16_t ServiceID;
+	int16_t ParameterSetID;
+	struct selection_SelectedServiceType isused;
+
+};
+
+struct arraylen_SelectedServiceListType
+{
+	size_t SelectedService;
+
+
+};
+
+struct SelectedServiceListType
+{
+	struct SelectedServiceType SelectedService[2];
+	struct arraylen_SelectedServiceListType arraylen;
+
+};
+
+struct ServicePaymentSelectionReqType
+{
+	enum paymentOptionType SelectedPaymentOption;
+	struct SelectedServiceListType SelectedServiceList;
+
+
+};
+
+struct ServicePaymentSelectionResType
+{
+	enum responseCodeType ResponseCode;
+
+
+};
+
+struct arraylen_contractIDType
+{
+	size_t data;
+
+
+};
+
+struct contractIDType
+{
+	uint32_t data[24];
+	struct arraylen_contractIDType arraylen;
+
+};
+
+struct arraylen_certificateType
+{
+	size_t data;
+
+
+};
+
+struct certificateType
+{
+	uint8_t data[1200];
+	struct arraylen_certificateType arraylen;
+
+};
+
+struct arraylen_SubCertificatesType
+{
+	size_t Certificate;
+
+
+};
+
+struct SubCertificatesType
+{
+	struct certificateType Certificate[4];
+	struct arraylen_SubCertificatesType arraylen;
+
+};
+
+struct selection_CertificateChainType
+{
+	unsigned int SubCertificates:1;
+
+
+};
+
+struct CertificateChainType
+{
+	struct certificateType Certificate;
+	struct SubCertificatesType SubCertificates;
+	struct selection_CertificateChainType isused;
+
+};
+
+struct PaymentDetailsReqType
+{
+	struct contractIDType ContractID;
+	struct CertificateChainType ContractSignatureCertChain;
+
+
+};
+
+struct arraylen_genChallengeType
+{
+	size_t data;
+
+
+};
+
+struct genChallengeType
+{
+	uint32_t data[256];
+	struct arraylen_genChallengeType arraylen;
+
+};
+
+struct PaymentDetailsResType
+{
+	enum responseCodeType ResponseCode;
+	struct genChallengeType GenChallenge;
+	int64_t DateTimeNow;
+
+
+};
+
+struct ContractAuthenticationReqType
+{
+	struct service_string attr_Id;
+	struct genChallengeType GenChallenge;
+
+
+};
+
+struct ContractAuthenticationResType
+{
+	enum responseCodeType ResponseCode;
+
+
+};
+
+struct AC_EVChargeParameterType
+{
+	uint32_t DepartureTime;
+	struct PhysicalValueType EAmount;
+	struct PhysicalValueType EVMaxVoltage;
+	struct PhysicalValueType EVMaxCurrent;
+	struct PhysicalValueType EVMinCurrent;
+
+
+};
+
+struct selection_ChargeParameterDiscoveryReqType
+{
+	unsigned int AC_EVChargeParameter:1;
+	unsigned int DC_EVChargeParameter:1;
+
+
+};
+
+struct selection_DC_EVStatusType
+{
+	unsigned int EVCabinConditioning:1;
+	unsigned int EVRESSConditioning:1;
+
+
+};
+
+struct DC_EVStatusType
+{
+	int EVReady;
+	int EVCabinConditioning;
+	int EVRESSConditioning;
+	enum DC_EVErrorCodeType EVErrorCode;
+	int8_t EVRESSSOC;
+	struct selection_DC_EVStatusType isused;
+
+};
+
+struct selection_DC_EVChargeParameterType
+{
+	unsigned int EVMaximumPowerLimit:1;
+	unsigned int EVEnergyCapacity:1;
+	unsigned int EVEnergyRequest:1;
+	unsigned int FullSOC:1;
+	unsigned int BulkSOC:1;
+
+
+};
+
+struct DC_EVChargeParameterType
+{
+	struct DC_EVStatusType DC_EVStatus;
+	struct PhysicalValueType EVMaximumCurrentLimit;
+	struct PhysicalValueType EVMaximumPowerLimit;
+	struct PhysicalValueType EVMaximumVoltageLimit;
+	struct PhysicalValueType EVEnergyCapacity;
+	struct PhysicalValueType EVEnergyRequest;
+	int8_t FullSOC;
+	int8_t BulkSOC;
+	struct selection_DC_EVChargeParameterType isused;
+
+};
+
+struct ChargeParameterDiscoveryReqType
+{
+	enum EVRequestedEnergyTransferType EVRequestedEnergyTransferType;
+	struct AC_EVChargeParameterType* AC_EVChargeParameter;
+	struct DC_EVChargeParameterType* DC_EVChargeParameter;
+	struct selection_ChargeParameterDiscoveryReqType isused;
+
+};
+
+struct selection_RelativeTimeIntervalType
+{
+	unsigned int duration:1;
+
+
+};
+
+struct RelativeTimeIntervalType
+{
+	uint32_t start;
+	uint32_t duration;
+	struct selection_RelativeTimeIntervalType isused;
+
+};
+
+struct PMaxScheduleEntryType
+{
+	struct RelativeTimeIntervalType RelativeTimeInterval;
+	int16_t PMax;
+
+
+};
+
+struct arraylen_PMaxScheduleType
+{
+	size_t PMaxScheduleEntry;
+
+
+};
+
+struct PMaxScheduleType
+{
+	int16_t PMaxScheduleID;
+	struct PMaxScheduleEntryType PMaxScheduleEntry[12];
+	struct arraylen_PMaxScheduleType arraylen;
+
+};
+
+struct arraylen_tariffDescriptionType
+{
+	size_t data;
+
+
+};
+
+struct tariffDescriptionType
+{
+	uint32_t data[32];
+	struct arraylen_tariffDescriptionType arraylen;
+
+};
+
+struct selection_SalesTariffType
+{
+	unsigned int SalesTariffDescription:1;
+
+
+};
+
+struct selection_CostType
+{
+	unsigned int amountMultiplier:1;
+
+
+};
+
+struct CostType
+{
+	enum costKindType costKind;
+	uint32_t amount;
+	int8_t amountMultiplier;
+	struct selection_CostType isused;
+
+};
+
+struct selection_ConsumptionCostType
+{
+	unsigned int Cost:1;
+
+
+};
+
+struct arraylen_ConsumptionCostType
+{
+	size_t Cost;
+
+
+};
+
+struct ConsumptionCostType
+{
+	uint32_t startValue;
+	struct CostType Cost[2];
+	struct selection_ConsumptionCostType isused;	struct arraylen_ConsumptionCostType arraylen;
+
+};
+
+struct selection_SalesTariffEntryType
+{
+	unsigned int ConsumptionCost:1;
+
+
+};
+
+struct arraylen_SalesTariffEntryType
+{
+	size_t ConsumptionCost;
+
+
+};
+
+struct SalesTariffEntryType
+{
+	struct RelativeTimeIntervalType RelativeTimeInterval;
+	uint8_t EPriceLevel;
+	struct ConsumptionCostType ConsumptionCost[3];
+	struct selection_SalesTariffEntryType isused;	struct arraylen_SalesTariffEntryType arraylen;
+
+};
+
+struct arraylen_SalesTariffType
+{
+	size_t SalesTariffEntry;
+
+
+};
+
+struct SalesTariffType
+{
+	struct service_string attr_Id;
+	int16_t SalesTariffID;
+	struct tariffDescriptionType SalesTariffDescription;
+	uint8_t NumEPriceLevels;
+	struct SalesTariffEntryType SalesTariffEntry[12];
+	struct selection_SalesTariffType isused;	struct arraylen_SalesTariffType arraylen;
+
+};
+
+struct selection_SAScheduleTupleType
+{
+	unsigned int SalesTariff:1;
+
+
+};
+
+struct SAScheduleTupleType
+{
+	int16_t SAScheduleTupleID;
+	struct PMaxScheduleType PMaxSchedule;
+	struct SalesTariffType* SalesTariff;
+	struct selection_SAScheduleTupleType isused;
+
+};
+
+struct arraylen_SAScheduleListType
+{
+	size_t SAScheduleTuple;
+
+
+};
+
+struct SAScheduleListType
+{
+	struct SAScheduleTupleType SAScheduleTuple[3];
+	struct arraylen_SAScheduleListType arraylen;
+
+};
+
+struct selection_ChargeParameterDiscoveryResType
+{
+	unsigned int SAScheduleList:1;
+	unsigned int AC_EVSEChargeParameter:1;
+	unsigned int DC_EVSEChargeParameter:1;
+
+
+};
+
+struct AC_EVSEStatusType
+{
+	int PowerSwitchClosed;
+	int RCD;
+	uint32_t ShutDownTime;
+	int StopCharging;
+
+
+};
+
+struct AC_EVSEChargeParameterType
+{
+	struct AC_EVSEStatusType AC_EVSEStatus;
+	struct PhysicalValueType EVSEMaxVoltage;
+	struct PhysicalValueType EVSEMaxCurrent;
+	struct PhysicalValueType EVSEMinCurrent;
+
+
+};
+
+struct selection_DC_EVSEStatusType
+{
+	unsigned int EVSEIsolationStatus:1;
+
+
+};
+
+struct DC_EVSEStatusType
+{
+	enum isolationLevelType EVSEIsolationStatus;
+	enum DC_EVSEStatusCodeType EVSEStatusCode;
+	struct selection_DC_EVSEStatusType isused;
+
+};
+
+struct selection_DC_EVSEChargeParameterType
+{
+	unsigned int EVSEMaximumPowerLimit:1;
+	unsigned int EVSECurrentRegulationTolerance:1;
+	unsigned int EVSEEnergyToBeDelivered:1;
+
+
+};
+
+struct DC_EVSEChargeParameterType
+{
+	struct DC_EVSEStatusType DC_EVSEStatus;
+	struct PhysicalValueType EVSEMaximumCurrentLimit;
+	struct PhysicalValueType EVSEMaximumPowerLimit;
+	struct PhysicalValueType EVSEMaximumVoltageLimit;
+	struct PhysicalValueType EVSEMinimumCurrentLimit;
+	struct PhysicalValueType EVSEMinimumVoltageLimit;
+	struct PhysicalValueType EVSECurrentRegulationTolerance;
+	struct PhysicalValueType EVSEPeakCurrentRipple;
+	struct PhysicalValueType EVSEEnergyToBeDelivered;
+	struct selection_DC_EVSEChargeParameterType isused;
+
+};
+
+struct ChargeParameterDiscoveryResType
+{
+	enum responseCodeType ResponseCode;
+	struct SAScheduleListType* SAScheduleList;
+	struct AC_EVSEChargeParameterType* AC_EVSEChargeParameter;
+	struct DC_EVSEChargeParameterType* DC_EVSEChargeParameter;
+	struct selection_ChargeParameterDiscoveryResType isused;
+
+};
+
+struct ProfileEntryType
+{
+	uint32_t ChargingProfileEntryStart;
+	int16_t ChargingProfileEntryMaxPower;
+
+
+};
+
+struct arraylen_ChargingProfileType
+{
+	size_t ProfileEntry;
+
+
+};
+
+struct ChargingProfileType
+{
+	int16_t SAScheduleTupleID;
+	struct ProfileEntryType ProfileEntry[24];
+	struct arraylen_ChargingProfileType arraylen;
+
+};
+
+struct selection_PowerDeliveryReqType
+{
+	unsigned int ChargingProfile:1;
+	unsigned int DC_EVPowerDeliveryParameter:1;
+
+
+};
+
+struct selection_DC_EVPowerDeliveryParameterType
+{
+	unsigned int BulkChargingComplete:1;
+
+
+};
+
+struct DC_EVPowerDeliveryParameterType
+{
+	struct DC_EVStatusType DC_EVStatus;
+	int BulkChargingComplete;
+	int ChargingComplete;
+	struct selection_DC_EVPowerDeliveryParameterType isused;
+
+};
+
+struct PowerDeliveryReqType
+{
+	int ReadyToChargeState;
+	struct ChargingProfileType ChargingProfile;
+	struct DC_EVPowerDeliveryParameterType* DC_EVPowerDeliveryParameter;
+	struct selection_PowerDeliveryReqType isused;
+
+};
+
+struct selection_PowerDeliveryResType
+{
+	unsigned int AC_EVSEStatus:1;
+	unsigned int DC_EVSEStatus:1;
+
+
+};
+
+struct PowerDeliveryResType
+{
+	enum responseCodeType ResponseCode;
+	struct AC_EVSEStatusType* AC_EVSEStatus;
+	struct DC_EVSEStatusType* DC_EVSEStatus;
+	struct selection_PowerDeliveryResType isused;
+
+};
+
+struct ChargingStatusReqType
+{
+
+ 
+	int NO_MEMBER:1;
+	
+};
+
+struct selection_ChargingStatusResType
+{
+	unsigned int SAScheduleTupleID:1;
+	unsigned int EVSEMaxCurrent:1;
+	unsigned int MeterInfo:1;
+
+
+};
+
+struct arraylen_meterIDType
+{
+	size_t data;
+
+
+};
+
+struct meterIDType
+{
+	uint32_t data[32];
+	struct arraylen_meterIDType arraylen;
+
+};
+
+struct selection_MeterInfoType
+{
+	unsigned int MeterReading:1;
+	unsigned int SigMeterReading:1;
+	unsigned int MeterStatus:1;
+	unsigned int TMeter:1;
+
+
+};
+
+struct arraylen_sigMeterReadingType
+{
+	size_t data;
+
+
+};
+
+struct sigMeterReadingType
+{
+	uint8_t data[32];
+	struct arraylen_sigMeterReadingType arraylen;
+
+};
+
+struct MeterInfoType
+{
+	struct meterIDType MeterID;
+	struct PhysicalValueType MeterReading;
+	struct sigMeterReadingType SigMeterReading;
+	int16_t MeterStatus;
+	int64_t TMeter;
+	struct selection_MeterInfoType isused;
+
+};
+
+struct ChargingStatusResType
+{
+	enum responseCodeType ResponseCode;
+	struct evseIDType EVSEID;
+	int16_t SAScheduleTupleID;
+	struct PhysicalValueType EVSEMaxCurrent;
+	struct MeterInfoType MeterInfo;
+	int ReceiptRequired;
+	struct AC_EVSEStatusType AC_EVSEStatus;
+	struct selection_ChargingStatusResType isused;
+
+};
+
+struct selection_MeteringReceiptReqType
+{
+	unsigned int attr_Id:1;
+	unsigned int SAScheduleTupleID:1;
+
+
+};
+
+struct MeteringReceiptReqType
+{
+	struct service_string attr_Id;
+	struct sessionIDType SessionID;
+	int16_t SAScheduleTupleID;
+	struct MeterInfoType MeterInfo;
+	struct selection_MeteringReceiptReqType isused;
+
+};
+
+struct MeteringReceiptResType
+{
+	enum responseCodeType ResponseCode;
+	struct AC_EVSEStatusType AC_EVSEStatus;
+
+
+};
+
+struct SessionStopType
+{
+
+ 
+	int NO_MEMBER:1;
+	
+};
+
+struct SessionStopResType
+{
+	enum responseCodeType ResponseCode;
+
+
+};
+
+struct selection_CertificateUpdateReqType
+{
+	unsigned int attr_Id:1;
+
+
+};
+
+struct arraylen_rootCertificateIDType
+{
+	size_t data;
+
+
+};
+
+struct rootCertificateIDType
+{
+	uint32_t data[40];
+	struct arraylen_rootCertificateIDType arraylen;
+
+};
+
+struct arraylen_ListOfRootCertificateIDsType
+{
+	size_t RootCertificateID;
+
+
+};
+
+struct ListOfRootCertificateIDsType
+{
+	struct rootCertificateIDType RootCertificateID[20];
+	struct arraylen_ListOfRootCertificateIDsType arraylen;
+
+};
+
+struct arraylen_dHParamsType
+{
+	size_t data;
+
+
+};
+
+struct dHParamsType
+{
+	uint8_t data[256];
+	struct arraylen_dHParamsType arraylen;
+
+};
+
+struct CertificateUpdateReqType
+{
+	struct service_string attr_Id;
+	struct CertificateChainType ContractSignatureCertChain;
+	struct contractIDType ContractID;
+	struct ListOfRootCertificateIDsType ListOfRootCertificateIDs;
+	struct dHParamsType DHParams;
+	struct selection_CertificateUpdateReqType isused;
+
+};
+
+struct arraylen_privateKeyType
+{
+	size_t data;
+
+
+};
+
+struct privateKeyType
+{
+	uint8_t data[128];
+	struct arraylen_privateKeyType arraylen;
+
+};
+
+struct CertificateUpdateResType
+{
+	struct service_string attr_Id;
+	enum responseCodeType ResponseCode;
+	struct CertificateChainType ContractSignatureCertChain;
+	struct privateKeyType ContractSignatureEncryptedPrivateKey;
+	struct dHParamsType DHParams;
+	struct contractIDType ContractID;
+	int16_t RetryCounter;
+
+
+};
+
+struct selection_CertificateInstallationReqType
+{
+	unsigned int attr_Id:1;
+
+
+};
+
+struct CertificateInstallationReqType
+{
+	struct service_string attr_Id;
+	struct certificateType OEMProvisioningCert;
+	struct ListOfRootCertificateIDsType ListOfRootCertificateIDs;
+	struct dHParamsType DHParams;
+	struct selection_CertificateInstallationReqType isused;
+
+};
+
+struct CertificateInstallationResType
+{
+	struct service_string attr_Id;
+	enum responseCodeType ResponseCode;
+	struct CertificateChainType ContractSignatureCertChain;
+	struct privateKeyType ContractSignatureEncryptedPrivateKey;
+	struct dHParamsType DHParams;
+	struct contractIDType ContractID;
+
+
+};
+
+struct CableCheckReqType
+{
+	struct DC_EVStatusType DC_EVStatus;
+
+
+};
+
+struct CableCheckResType
+{
+	enum responseCodeType ResponseCode;
+	struct DC_EVSEStatusType DC_EVSEStatus;
+
+
+};
+
+struct PreChargeReqType
+{
+	struct DC_EVStatusType DC_EVStatus;
+	struct PhysicalValueType EVTargetVoltage;
+	struct PhysicalValueType EVTargetCurrent;
+
+
+};
+
+struct PreChargeResType
+{
+	enum responseCodeType ResponseCode;
+	struct DC_EVSEStatusType DC_EVSEStatus;
+	struct PhysicalValueType EVSEPresentVoltage;
+
+
+};
+
+struct selection_CurrentDemandReqType
+{
+	unsigned int EVMaximumVoltageLimit:1;
+	unsigned int EVMaximumCurrentLimit:1;
+	unsigned int EVMaximumPowerLimit:1;
+	unsigned int BulkChargingComplete:1;
+	unsigned int RemainingTimeToFullSoC:1;
+	unsigned int RemainingTimeToBulkSoC:1;
+
+
+};
+
+struct CurrentDemandReqType
+{
+	struct DC_EVStatusType DC_EVStatus;
+	struct PhysicalValueType EVTargetCurrent;
+	struct PhysicalValueType EVMaximumVoltageLimit;
+	struct PhysicalValueType EVMaximumCurrentLimit;
+	struct PhysicalValueType EVMaximumPowerLimit;
+	int BulkChargingComplete;
+	int ChargingComplete;
+	struct PhysicalValueType RemainingTimeToFullSoC;
+	struct PhysicalValueType RemainingTimeToBulkSoC;
+	struct PhysicalValueType EVTargetVoltage;
+	struct selection_CurrentDemandReqType isused;
+
+};
+
+struct selection_CurrentDemandResType
+{
+	unsigned int EVSEMaximumVoltageLimit:1;
+	unsigned int EVSEMaximumCurrentLimit:1;
+	unsigned int EVSEMaximumPowerLimit:1;
+
+
+};
+
+struct CurrentDemandResType
+{
+	enum responseCodeType ResponseCode;
+	struct DC_EVSEStatusType DC_EVSEStatus;
+	struct PhysicalValueType EVSEPresentVoltage;
+	struct PhysicalValueType EVSEPresentCurrent;
+	int EVSECurrentLimitAchieved;
+	int EVSEVoltageLimitAchieved;
+	int EVSEPowerLimitAchieved;
+	struct PhysicalValueType EVSEMaximumVoltageLimit;
+	struct PhysicalValueType EVSEMaximumCurrentLimit;
+	struct PhysicalValueType EVSEMaximumPowerLimit;
+	struct selection_CurrentDemandResType isused;
+
+};
+
+struct WeldingDetectionReqType
+{
+	struct DC_EVStatusType DC_EVStatus;
+
+
+};
+
+struct WeldingDetectionResType
+{
+	enum responseCodeType ResponseCode;
+	struct DC_EVSEStatusType DC_EVSEStatus;
+	struct PhysicalValueType EVSEPresentVoltage;
+
+
+};
+
+struct BodyType
+{
+	struct SessionSetupReqType* SessionSetupReq;
+	struct SessionSetupResType* SessionSetupRes;
+	struct ServiceDiscoveryReqType* ServiceDiscoveryReq;
+	struct ServiceDiscoveryResType* ServiceDiscoveryRes;
+	struct ServiceDetailReqType* ServiceDetailReq;
+	struct ServiceDetailResType* ServiceDetailRes;
+	struct ServicePaymentSelectionReqType* ServicePaymentSelectionReq;
+	struct ServicePaymentSelectionResType* ServicePaymentSelectionRes;
+	struct PaymentDetailsReqType* PaymentDetailsReq;
+	struct PaymentDetailsResType* PaymentDetailsRes;
+	struct ContractAuthenticationReqType* ContractAuthenticationReq;
+	struct ContractAuthenticationResType* ContractAuthenticationRes;
+	struct ChargeParameterDiscoveryReqType* ChargeParameterDiscoveryReq;
+	struct ChargeParameterDiscoveryResType* ChargeParameterDiscoveryRes;
+	struct PowerDeliveryReqType* PowerDeliveryReq;
+	struct PowerDeliveryResType* PowerDeliveryRes;
+	struct ChargingStatusReqType* ChargingStatusReq;
+	struct ChargingStatusResType* ChargingStatusRes;
+	struct MeteringReceiptReqType* MeteringReceiptReq;
+	struct MeteringReceiptResType* MeteringReceiptRes;
+	struct SessionStopType* SessionStopReq;
+	struct SessionStopResType* SessionStopRes;
+	struct CertificateUpdateReqType* CertificateUpdateReq;
+	struct CertificateUpdateResType* CertificateUpdateRes;
+	struct CertificateInstallationReqType* CertificateInstallationReq;
+	struct CertificateInstallationResType* CertificateInstallationRes;
+	struct CableCheckReqType* CableCheckReq;
+	struct CableCheckResType* CableCheckRes;
+	struct PreChargeReqType* PreChargeReq;
+	struct PreChargeResType* PreChargeRes;
+	struct CurrentDemandReqType* CurrentDemandReq;
+	struct CurrentDemandResType* CurrentDemandRes;
+	struct WeldingDetectionReqType* WeldingDetectionReq;
+	struct WeldingDetectionResType* WeldingDetectionRes;
+	struct selection_BodyType isused;
+
+};
+
+struct AnonType_V2G_Message
+{
+	struct MessageHeaderType* Header;
+	struct BodyType Body;
+
+
+};
+
+struct EXIDocumentType
+{
+	struct AnonType_V2G_Message V2G_Message;
+
+
+};
+
+enum responseMessages
+{
+	SESSIONSETUPRES,
+	SERVICEDISCOVERYRES,
+	SERVICEDETAILRES,
+	SERVICEPAYMENTSELECTIONRES,
+	PAYMENTDETAILSRES,
+	CONTRACTAUTHENTICATIONRES,
+	CHARGEPARAMETERDISCOVERYRES,
+	POWERDELIVERYRES,
+	CHARGINGSTATUSRES,
+	METERINGRECEIPTRES,
+	SESSIONSTOPRES,
+	CERTIFICATEUPDATERES,
+	CERTIFICATEINSTALLATIONRES,
+	CABLECHECKRES,
+	PRECHARGERES,
+	CURRENTDEMANDRES,
+	WELDINGDETECTIONRES
+};
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 2551 - 0
src/service/v2g_serviceDispatcher.c

@@ -0,0 +1,2551 @@
+
+
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+
+#include "v2g_service.h"
+#include "v2g_serviceDispatcher.h"
+#include "v2g_serviceDataTypes.h"
+#include "v2g_serviceDataTypes.c"
+#include "v2g_serviceMethods.h"
+#include "v2g_serviceDataSerialization.c"
+#include "EXITypes.h"
+#include "EXIDecoder.h"
+#include "EXIEncoder.h"
+#include "StringTable.h"
+#include <string.h>
+
+
+static int deserializeMessage(struct EXIService* service);
+
+
+static int _setUInt32Value(integer_t* iv, uint32_t* uint32) {
+	int errn = 0;
+	switch(iv->type) {
+	/* Unsigned Integer */
+	case EXI_UNSIGNED_INTEGER_8:
+		*uint32 = iv->val.uint8;
+		break;
+	case EXI_UNSIGNED_INTEGER_16:
+		*uint32 = iv->val.uint16;
+		break;
+	case EXI_UNSIGNED_INTEGER_32:
+		if (iv->val.uint32 <= 2147483647) {
+			*uint32 = iv->val.uint32;
+		} else {
+			errn = -1;
+		}
+		break;
+	case EXI_UNSIGNED_INTEGER_64:
+		errn = -1;
+		break;
+	/* (Signed) Integer */
+	case EXI_INTEGER_8:
+		*uint32 = iv->val.int8;
+		break;
+	case EXI_INTEGER_16:
+		*uint32 = iv->val.int16;
+		break;
+	case EXI_INTEGER_32:
+		*uint32 = iv->val.int32;
+		break;
+	case EXI_INTEGER_64:
+		errn = -1;
+	}
+	return errn;
+}
+
+
+
+static int _setInt16Value(integer_t* iv, int16_t* int16) {
+	int errn = 0;
+	switch(iv->type) {
+	/* Unsigned Integer */
+	case EXI_UNSIGNED_INTEGER_8:
+		*int16 = iv->val.uint8;
+		break;
+	case EXI_UNSIGNED_INTEGER_16:
+		errn = -1;
+		break;
+	case EXI_UNSIGNED_INTEGER_32:
+			errn = -1;
+		break;
+	case EXI_UNSIGNED_INTEGER_64:
+		errn = -1;
+		break;
+	/* (Signed) Integer */
+	case EXI_INTEGER_8:
+		*int16 = iv->val.int8;
+		break;
+	case EXI_INTEGER_16:
+		*int16 = iv->val.int16;
+		break;
+	case EXI_INTEGER_32:
+		errn = -1;;
+		break;
+	case EXI_INTEGER_64:
+		errn = -1;
+	}
+	return errn;
+}
+
+/**
+ * Deserialize an element value of the EXI stream and assign it to the
+ * service data structure 
+ */
+static int deserializeElementAttributeCharacter(struct EXIService* service)
+{
+
+	switch(service->eqn.namespaceURI) {
+		case 0:
+			switch(service->eqn.localPart) {
+				case 0: /*attr_Algorithm*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						if( service->idPath.id[4] == 0)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.CanonicalizationMethod.attr_Algorithm.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.CanonicalizationMethod.attr_Algorithm.arraylen.data = service->val.string.len;
+
+						} else if(service->idPath.id[4] == 43)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.SignatureMethod.attr_Algorithm.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.SignatureMethod.attr_Algorithm.arraylen.data = service->val.string.len;
+
+						} else if(service->idPath.id[5] == 5)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].DigestMethod.attr_Algorithm.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].DigestMethod.attr_Algorithm.arraylen.data = service->val.string.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 2: /*attr_Id*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						if( service->idPath.id[2] == 42)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Signature->isused.attr_Id=1;
+
+						} else if(service->idPath.id[2] == 25)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.ContractAuthenticationReq->attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.ContractAuthenticationReq->attr_Id.arraylen.data = service->val.string.len;
+
+						} else if(service->idPath.id[2] == 60)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.MeteringReceiptReq->attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->isused.attr_Id=1;
+
+						} else if(service->idPath.id[2] == 10)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateUpdateReq->attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.CertificateUpdateReq->attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Body.CertificateUpdateReq->isused.attr_Id=1;
+
+						} else if(service->idPath.id[2] == 6)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateInstallationReq->attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.CertificateInstallationReq->attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Body.CertificateInstallationReq->isused.attr_Id=1;
+
+						} else if(service->idPath.id[3] == 52)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.isused.attr_Id=1;
+
+						} else if(service->idPath.id[3] == 50)
+						{
+
+						} else if(service->idPath.id[3] == 14)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->KeyInfo.attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.isused.attr_Id=1;
+
+						} else if(service->idPath.id[4] == 34)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].attr_Id.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].attr_Id.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].isused.attr_Id=1;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 7: /*attr_URI*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].attr_URI.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].attr_URI.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].isused.attr_URI=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 6: /*attr_Type*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].attr_Type.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].attr_Type.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].isused.attr_Type=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;	
+			} /* close switch(service->eqn.localPart) */	
+		break;
+		case 4:
+			switch(service->eqn.localPart) {
+				case 7: /*DigestValue*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].DigestValue.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Header->Signature->SignedInfo.Reference[service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference].DigestValue.arraylen.data = service->val.binary.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 50: /*SignatureValue*/
+
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64)
+							{
+								memcpy(service->exiMsg.V2G_Message.Header->Signature->SignatureValue.data, service->val.binary.data,service->val.binary.len);
+								service->exiMsg.V2G_Message.Header->Signature->SignatureValue.arraylen.data = service->val.binary.len;
+
+
+							}
+							else
+							{
+								return -1; /* wrong data type */
+							}
+
+
+							break;
+
+
+
+				case 62: /*X509IssuerName*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509IssuerSerial.X509IssuerName.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509IssuerSerial.X509IssuerName.arraylen.data = service->val.string.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 66: /*X509SerialNumber*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509IssuerSerial.X509SerialNumber = service->val.integer.val.int64;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 65: /*X509SKI*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509SKI.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509SKI.arraylen.data = service->val.binary.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 67: /*X509SubjectName*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509SubjectName.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509SubjectName.arraylen.data = service->val.string.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 59: /*X509Certificate*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509Certificate.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509Certificate.arraylen.data = service->val.binary.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 58: /*X509CRL*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509CRL.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Header->Signature->KeyInfo.X509Data.X509CRL.arraylen.data = service->val.binary.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;	
+			} /* close switch(service->eqn.localPart) */	
+		break;
+		case 5:
+			switch(service->eqn.localPart) {
+				case 40: /*EVCCID*/
+		if(service->val.type == EXI_DATATYPE_BINARY_HEX) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Body.SessionSetupReq->EVCCID.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.SessionSetupReq->EVCCID.arraylen.data = service->val.binary.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 103: /*ServiceScope*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq->ServiceScope.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq->ServiceScope.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq->isused.ServiceScope=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 87: /*ServiceCategory*/
+		if(service->val.type == EXI_DATATYPE_ENUMERATION) 
+					{
+						service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq->ServiceCategory = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq->isused.ServiceCategory=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 96: /*ServiceID*/
+		if(service->val.type == EXI_DATATYPE_UNSIGNED_INTEGER) 
+					{
+						if( service->idPath.id[2] == 88)
+						{
+							service->exiMsg.V2G_Message.Body.ServiceDetailReq->ServiceID = service->val.integer.val.uint16;
+
+						} else if(service->idPath.id[4] == 123)
+						{
+							service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.SelectedService[service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.arraylen.SelectedService].ServiceID = service->val.integer.val.uint16;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 85: /*SelectedPaymentOption*/
+		if(service->val.type == EXI_DATATYPE_ENUMERATION) 
+					{
+						service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedPaymentOption = service->val.enumeration;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 29: /*ContractID*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						if( service->idPath.id[2] == 65)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractID.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractID.arraylen.data = service->val.string.len;
+
+						} else if(service->idPath.id[2] == 10)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractID.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractID.arraylen.data = service->val.string.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 57: /*GenChallenge*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Body.ContractAuthenticationReq->GenChallenge.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.ContractAuthenticationReq->GenChallenge.arraylen.data = service->val.string.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 44: /*EVRequestedEnergyTransferType*/
+		if(service->val.type == EXI_DATATYPE_ENUMERATION) 
+					{
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->EVRequestedEnergyTransferType = service->val.enumeration;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 78: /*ReadyToChargeState*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ReadyToChargeState = service->val.boolean;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 104: /*SessionID*/
+		if(service->val.type == EXI_DATATYPE_BINARY_HEX) 
+					{
+						if( service->idPath.id[1] == 4)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->SessionID.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Header->SessionID.arraylen.data = service->val.binary.len;
+
+						} else if(service->idPath.id[2] == 60)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.MeteringReceiptReq->SessionID.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->SessionID.arraylen.data = service->val.binary.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 84: /*SAScheduleTupleID*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+
+						_setInt16Value( &(service->val.integer),&(service->val.integer.val.int16));
+						if( service->idPath.id[2] == 60)
+						{
+							service->exiMsg.V2G_Message.Body.MeteringReceiptReq->SAScheduleTupleID = service->val.integer.val.int16;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->isused.SAScheduleTupleID=1;
+
+						} else if(service->idPath.id[3] == 20)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.SAScheduleTupleID = service->val.integer.val.int16;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 38: /*DHParams*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						if( service->idPath.id[2] == 10)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateUpdateReq->DHParams.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.CertificateUpdateReq->DHParams.arraylen.data = service->val.binary.len;
+
+						} else if(service->idPath.id[2] == 6)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateInstallationReq->DHParams.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.CertificateInstallationReq->DHParams.arraylen.data = service->val.binary.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 64: /*OEMProvisioningCert*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Body.CertificateInstallationReq->OEMProvisioningCert.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.CertificateInstallationReq->OEMProvisioningCert.arraylen.data = service->val.binary.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 1: /*BulkChargingComplete*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->BulkChargingComplete = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.BulkChargingComplete=1;
+
+						} else if(service->idPath.id[3] == 21)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->BulkChargingComplete = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->isused.BulkChargingComplete=1;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 19: /*ChargingComplete*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->ChargingComplete = service->val.boolean;
+
+						} else if(service->idPath.id[3] == 21)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->ChargingComplete = service->val.boolean;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;	
+			} /* close switch(service->eqn.localPart) */	
+		break;
+		case 6:
+			switch(service->eqn.localPart) {
+				case 74: /*FaultCode*/
+		if(service->val.type == EXI_DATATYPE_ENUMERATION) 
+					{
+						service->exiMsg.V2G_Message.Header->Notification.FaultCode = service->val.enumeration;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 75: /*FaultMsg*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Header->Notification.FaultMsg.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Header->Notification.FaultMsg.arraylen.data = service->val.string.len;
+						service->exiMsg.V2G_Message.Header->Notification.isused.FaultMsg=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 84: /*Multiplier*/
+		if(service->val.type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) 
+					{
+
+
+						if( service->idPath.id[3] == 56 && service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetVoltage.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 55 && service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetCurrent.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 55 && service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetCurrent.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 43)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumVoltageLimit.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 41)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumCurrentLimit.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 42)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumPowerLimit.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 81)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToFullSoC.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 80)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToBulkSoC.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[3] == 56 && service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetVoltage.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 31)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EAmount.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 40)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxVoltage.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 39)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxCurrent.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 44)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMinCurrent.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 41)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumCurrentLimit.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 42)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumPowerLimit.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 43)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumVoltageLimit.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 36)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyCapacity.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 37)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyRequest.Multiplier = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[4] == 82)
+						{
+							service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterReading.Multiplier = service->val.integer.val.int8;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 145: /*Unit*/
+		if(service->val.type == EXI_DATATYPE_ENUMERATION) 
+					{
+						if( service->idPath.id[3] == 56 && service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetVoltage.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetVoltage.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 55 && service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetCurrent.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetCurrent.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 55 && service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetCurrent.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetCurrent.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 43)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumVoltageLimit.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumVoltageLimit.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 41)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumCurrentLimit.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumCurrentLimit.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 42)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumPowerLimit.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumPowerLimit.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 81)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToFullSoC.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToFullSoC.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 80)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToBulkSoC.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToBulkSoC.isused.Unit=1;
+
+						} else if(service->idPath.id[3] == 56 && service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetVoltage.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetVoltage.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 31)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EAmount.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EAmount.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 40)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxVoltage.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxVoltage.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 39)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxCurrent.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxCurrent.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 44)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMinCurrent.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMinCurrent.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 41)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumCurrentLimit.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumCurrentLimit.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 42)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumPowerLimit.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumPowerLimit.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 43)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumVoltageLimit.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumVoltageLimit.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 36)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyCapacity.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyCapacity.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 37)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyRequest.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyRequest.isused.Unit=1;
+
+						} else if(service->idPath.id[4] == 82)
+						{
+							service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterReading.Unit = service->val.enumeration;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterReading.isused.Unit=1;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 146: /*Value*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+						_setInt16Value( &(service->val.integer),&(service->val.integer.val.int16));
+
+						if( service->idPath.id[3] == 56 && service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetVoltage.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 55 && service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->EVTargetCurrent.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 55 && service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetCurrent.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 43)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumVoltageLimit.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 41)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumCurrentLimit.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 42)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVMaximumPowerLimit.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 81)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToFullSoC.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 80)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->RemainingTimeToBulkSoC.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[3] == 56 && service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->EVTargetVoltage.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 31)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EAmount.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 40)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxVoltage.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 39)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMaxCurrent.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 44)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->EVMinCurrent.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 41)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumCurrentLimit.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 42)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumPowerLimit.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 43)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVMaximumVoltageLimit.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 36)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyCapacity.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 37)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->EVEnergyRequest.Value = service->val.integer.val.int16;
+
+						} else if(service->idPath.id[4] == 82)
+						{
+							service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterReading.Value = service->val.integer.val.int16;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 130: /*ServiceID*/
+		if(service->val.type == EXI_DATATYPE_UNSIGNED_INTEGER) 
+					{
+
+						if( service->idPath.id[2] == 88)
+						{
+							service->exiMsg.V2G_Message.Body.ServiceDetailReq->ServiceID = service->val.integer.val.uint16;
+
+						} else if(service->idPath.id[4] == 123)
+						{
+							service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.SelectedService[service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.arraylen.SelectedService].ServiceID = service->val.integer.val.uint16;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 96: /*ParameterSetID*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+						service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.SelectedService[service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.arraylen.SelectedService].ParameterSetID = service->val.integer.val.int16;
+						service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.SelectedService[service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.arraylen.SelectedService].isused.ParameterSetID=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 8: /*Certificate*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						if( service->idPath.id[3] == 30)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.Certificate.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.Certificate.arraylen.data = service->val.binary.len;
+
+						} else if(service->idPath.id[2] == 65)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractSignatureCertChain.SubCertificates.Certificate[service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractSignatureCertChain.SubCertificates.arraylen.Certificate].data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractSignatureCertChain.SubCertificates.Certificate[service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractSignatureCertChain.SubCertificates.arraylen.Certificate].arraylen.data = service->val.binary.len;
+
+						} else if(service->idPath.id[2] == 10)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.SubCertificates.Certificate[service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.SubCertificates.arraylen.Certificate].data, service->val.binary.data,service->val.binary.len);
+							service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.SubCertificates.Certificate[service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.SubCertificates.arraylen.Certificate].arraylen.data = service->val.binary.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 30: /*DepartureTime*/
+		if(service->val.type == EXI_DATATYPE_UNSIGNED_INTEGER) 
+					{
+						_setUInt32Value( &(service->val.integer),&(service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->AC_EVChargeParameter->DepartureTime));
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 49: /*EVReady*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 2)
+						{
+							service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.EVReady = service->val.boolean;
+
+						} else if(service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.EVReady = service->val.boolean;
+
+						} else if(service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.EVReady = service->val.boolean;
+
+						} else if(service->idPath.id[2] == 113)
+						{
+							service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.EVReady = service->val.boolean;
+
+						} else if(service->idPath.id[2] == 14)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.EVReady = service->val.boolean;
+
+						} else if(service->idPath.id[2] == 70)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.EVReady = service->val.boolean;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 33: /*EVCabinConditioning*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 2)
+						{
+							service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.EVCabinConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.isused.EVCabinConditioning=1;
+
+						} else if(service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.EVCabinConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.isused.EVCabinConditioning=1;
+
+						} else if(service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.EVCabinConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.isused.EVCabinConditioning=1;
+
+						} else if(service->idPath.id[2] == 113)
+						{
+							service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.EVCabinConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.isused.EVCabinConditioning=1;
+
+						} else if(service->idPath.id[2] == 14)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.EVCabinConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.isused.EVCabinConditioning=1;
+
+						} else if(service->idPath.id[2] == 70)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.EVCabinConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.isused.EVCabinConditioning=1;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 47: /*EVRESSConditioning*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 2)
+						{
+							service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.EVRESSConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.isused.EVRESSConditioning=1;
+
+						} else if(service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.EVRESSConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.isused.EVRESSConditioning=1;
+
+						} else if(service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.EVRESSConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.isused.EVRESSConditioning=1;
+
+						} else if(service->idPath.id[2] == 113)
+						{
+							service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.EVRESSConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.isused.EVRESSConditioning=1;
+
+						} else if(service->idPath.id[2] == 14)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.EVRESSConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.isused.EVRESSConditioning=1;
+
+						} else if(service->idPath.id[2] == 70)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.EVRESSConditioning = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.isused.EVRESSConditioning=1;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 38: /*EVErrorCode*/
+		if(service->val.type == EXI_DATATYPE_ENUMERATION) 
+					{
+						if( service->idPath.id[2] == 2)
+						{
+							service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.EVErrorCode = service->val.enumeration;
+
+						} else if(service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.EVErrorCode = service->val.enumeration;
+
+						} else if(service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.EVErrorCode = service->val.enumeration;
+
+						} else if(service->idPath.id[2] == 113)
+						{
+							service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.EVErrorCode = service->val.enumeration;
+
+						} else if(service->idPath.id[2] == 14)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.EVErrorCode = service->val.enumeration;
+
+						} else if(service->idPath.id[2] == 70)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.EVErrorCode = service->val.enumeration;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 48: /*EVRESSSOC*/
+		if(service->val.type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) 
+					{
+						if( service->idPath.id[2] == 2)
+						{
+							service->exiMsg.V2G_Message.Body.CableCheckReq->DC_EVStatus.EVRESSSOC = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[2] == 74)
+						{
+							service->exiMsg.V2G_Message.Body.PreChargeReq->DC_EVStatus.EVRESSSOC = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->DC_EVStatus.EVRESSSOC = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[2] == 113)
+						{
+							service->exiMsg.V2G_Message.Body.WeldingDetectionReq->DC_EVStatus.EVRESSSOC = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[2] == 14)
+						{
+							service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->DC_EVStatus.EVRESSSOC = service->val.integer.val.int8;
+
+						} else if(service->idPath.id[2] == 70)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->DC_EVStatus.EVRESSSOC = service->val.integer.val.int8;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 77: /*FullSOC*/
+		if(service->val.type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) 
+					{
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->FullSOC = service->val.integer.val.int8;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->isused.FullSOC=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 7: /*BulkSOC*/
+		if(service->val.type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) 
+					{
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->BulkSOC = service->val.integer.val.int8;
+						service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->isused.BulkSOC=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 12: /*ChargingProfileEntryStart*/
+		if(service->val.type == EXI_DATATYPE_UNSIGNED_INTEGER) 
+					{
+						_setUInt32Value( &(service->val.integer),&(service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.ProfileEntry[service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.arraylen.ProfileEntry].ChargingProfileEntryStart));
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 11: /*ChargingProfileEntryMaxPower*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+
+			_setInt16Value( &(service->val.integer),&(service->val.integer.val.int16));
+						service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.ProfileEntry[service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.arraylen.ProfileEntry].ChargingProfileEntryMaxPower = service->val.integer.val.int16;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 113: /*SAScheduleTupleID*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+						_setInt16Value( &(service->val.integer),&(service->val.integer.val.int16));
+						if( service->idPath.id[2] == 60)
+						{
+							service->exiMsg.V2G_Message.Body.MeteringReceiptReq->SAScheduleTupleID = service->val.integer.val.int16;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->isused.SAScheduleTupleID=1;
+
+						} else if(service->idPath.id[3] == 20)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.SAScheduleTupleID = service->val.integer.val.int16;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 6: /*BulkChargingComplete*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->BulkChargingComplete = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.BulkChargingComplete=1;
+
+						} else if(service->idPath.id[3] == 21)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->BulkChargingComplete = service->val.boolean;
+						service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->isused.BulkChargingComplete=1;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 10: /*ChargingComplete*/
+		if(service->val.type == EXI_DATATYPE_BOOLEAN) 
+					{
+						if( service->idPath.id[2] == 32)
+						{
+							service->exiMsg.V2G_Message.Body.CurrentDemandReq->ChargingComplete = service->val.boolean;
+
+						} else if(service->idPath.id[3] == 21)
+						{
+							service->exiMsg.V2G_Message.Body.PowerDeliveryReq->DC_EVPowerDeliveryParameter->ChargingComplete = service->val.boolean;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 80: /*MeterID*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterID.data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterID.arraylen.data = service->val.string.len;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 139: /*SigMeterReading*/
+		if(service->val.type == EXI_DATATYPE_BINARY_BASE64) 
+					{
+						memcpy(service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.SigMeterReading.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.SigMeterReading.arraylen.data = service->val.binary.len;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.isused.SigMeterReading=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 83: /*MeterStatus*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+						_setInt16Value( &(service->val.integer),&(service->val.integer.val.int16));
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.MeterStatus = service->val.integer.val.int16;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.isused.MeterStatus=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 143: /*TMeter*/
+		if(service->val.type == EXI_DATATYPE_INTEGER) 
+					{
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.TMeter = service->val.integer.val.int64;
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.isused.TMeter=1;
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;
+				case 108: /*RootCertificateID*/
+		if(service->val.type == EXI_DATATYPE_STRING) 
+					{
+						if( service->idPath.id[2] == 10)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ListOfRootCertificateIDs.RootCertificateID[service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ListOfRootCertificateIDs.arraylen.RootCertificateID].data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+						service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ListOfRootCertificateIDs.RootCertificateID[service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ListOfRootCertificateIDs.arraylen.RootCertificateID].arraylen.data = service->val.string.len;
+
+						} else if(service->idPath.id[2] == 6)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.CertificateInstallationReq->ListOfRootCertificateIDs.RootCertificateID[service->exiMsg.V2G_Message.Body.CertificateInstallationReq->ListOfRootCertificateIDs.arraylen.RootCertificateID].data, service->val.string.codepoints,service->val.string.len*sizeof(uint32_t));
+																	service->exiMsg.V2G_Message.Body.CertificateInstallationReq->ListOfRootCertificateIDs.RootCertificateID[service->exiMsg.V2G_Message.Body.CertificateInstallationReq->ListOfRootCertificateIDs.arraylen.RootCertificateID].arraylen.data = service->val.string.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;	
+			} /* close switch(service->eqn.localPart) */	
+		break;
+		case 8:
+			switch(service->eqn.localPart) {
+				case 2: /*SessionID*/
+		if(service->val.type == EXI_DATATYPE_BINARY_HEX) 
+					{
+						if( service->idPath.id[1] == 4)
+						{
+							memcpy(service->exiMsg.V2G_Message.Header->SessionID.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Header->SessionID.arraylen.data = service->val.binary.len;
+
+						} else if(service->idPath.id[2] == 60)
+						{
+							memcpy(service->exiMsg.V2G_Message.Body.MeteringReceiptReq->SessionID.data, service->val.binary.data,service->val.binary.len);
+						service->exiMsg.V2G_Message.Body.MeteringReceiptReq->SessionID.arraylen.data = service->val.binary.len;
+						}
+
+
+					} 
+					else
+					{
+						return -1; /* wrong data type */
+					}
+
+				break;	
+			} /* close switch(service->eqn.localPart) */	
+		break;
+	
+	} /* close switch(service->eqn.namespaceURI) */
+	return 0;
+}
+
+/**
+ * Depending on the current EXI event a message element is deserialized or a
+ * defined service method is called in here
+ */
+static int deserializeElementOrServiceCall(struct EXIService* service)
+{
+
+	switch(service->eqn.namespaceURI) {
+		case 0:
+			switch(service->eqn.localPart) {
+			}
+		break;
+		case 4:
+			switch(service->eqn.localPart) {
+				case 34:/* Reference */	
+	
+ 					service->exiMsg.V2G_Message.Header->Signature->SignedInfo.arraylen.Reference++;
+
+				break;
+				case 14:/* KeyInfo */	
+	
+ 					service->exiMsg.V2G_Message.Header->Signature->isused.KeyInfo=1;
+
+				break;
+				case 42:/* Signature */	
+	
+ 					service->exiMsg.V2G_Message.Header->isused.Signature=1;
+
+				break;
+			}
+		break;
+		case 5:
+			switch(service->eqn.localPart) {
+				case 20:/* ChargingProfile */	
+	
+ 					service->exiMsg.V2G_Message.Body.PowerDeliveryReq->isused.ChargingProfile=1;
+
+				break;
+				case 43:/* EVMaximumVoltageLimit */	
+	
+ 					service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.EVMaximumVoltageLimit=1;
+
+				break;
+				case 41:/* EVMaximumCurrentLimit */	
+	
+ 					service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.EVMaximumCurrentLimit=1;
+
+				break;
+				case 42:/* EVMaximumPowerLimit */	
+	
+ 					service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.EVMaximumPowerLimit=1;
+
+				break;
+				case 81:/* RemainingTimeToFullSoC */	
+	
+ 					service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.RemainingTimeToFullSoC=1;
+
+				break;
+				case 80:/* RemainingTimeToBulkSoC */	
+	
+ 					service->exiMsg.V2G_Message.Body.CurrentDemandReq->isused.RemainingTimeToBulkSoC=1;
+
+				break;
+				case 105:/* SessionSetupReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					sessionSetup((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.SessionSetupReq), (service->exiMsg.V2G_Message.Body.SessionSetupRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.SessionSetupRes=1;
+					service->exiMsg.V2G_Message.Body.isused.SessionSetupReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 92:/* ServiceDiscoveryReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					serviceDiscovery((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq), (service->exiMsg.V2G_Message.Body.ServiceDiscoveryRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.ServiceDiscoveryRes=1;
+					service->exiMsg.V2G_Message.Body.isused.ServiceDiscoveryReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 88:/* ServiceDetailReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					serviceDetail((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.ServiceDetailReq), (service->exiMsg.V2G_Message.Body.ServiceDetailRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.ServiceDetailRes=1;
+					service->exiMsg.V2G_Message.Body.isused.ServiceDetailReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 99:/* ServicePaymentSelectionReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					servicePaymentSelection((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq), (service->exiMsg.V2G_Message.Body.ServicePaymentSelectionRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.ServicePaymentSelectionRes=1;
+					service->exiMsg.V2G_Message.Body.isused.ServicePaymentSelectionReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 65:/* PaymentDetailsReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					paymentDetails((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.PaymentDetailsReq), (service->exiMsg.V2G_Message.Body.PaymentDetailsRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.PaymentDetailsRes=1;
+					service->exiMsg.V2G_Message.Body.isused.PaymentDetailsReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 25:/* ContractAuthenticationReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					contractAuthentication((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.ContractAuthenticationReq), (service->exiMsg.V2G_Message.Body.ContractAuthenticationRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.ContractAuthenticationRes=1;
+					service->exiMsg.V2G_Message.Body.isused.ContractAuthenticationReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 14:/* ChargeParameterDiscoveryReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					chargeParameterDiscovery((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq), (service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.ChargeParameterDiscoveryRes=1;
+					service->exiMsg.V2G_Message.Body.isused.ChargeParameterDiscoveryReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 70:/* PowerDeliveryReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					powerDelivery((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.PowerDeliveryReq), (service->exiMsg.V2G_Message.Body.PowerDeliveryRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.PowerDeliveryRes=1;
+					service->exiMsg.V2G_Message.Body.isused.PowerDeliveryReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 21:/* ChargingStatusReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					chargingStatus((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.ChargingStatusReq), (service->exiMsg.V2G_Message.Body.ChargingStatusRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.ChargingStatusRes=1;
+					service->exiMsg.V2G_Message.Body.isused.ChargingStatusReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 60:/* MeteringReceiptReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					meteringReceipt((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.MeteringReceiptReq), (service->exiMsg.V2G_Message.Body.MeteringReceiptRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.MeteringReceiptRes=1;
+					service->exiMsg.V2G_Message.Body.isused.MeteringReceiptReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 109:/* SessionStopReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					sessionStop((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.SessionStopReq), (service->exiMsg.V2G_Message.Body.SessionStopRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.SessionStopRes=1;
+					service->exiMsg.V2G_Message.Body.isused.SessionStopReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 10:/* CertificateUpdateReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					certificateUpdate((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.CertificateUpdateReq), (service->exiMsg.V2G_Message.Body.CertificateUpdateRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.CertificateUpdateRes=1;
+					service->exiMsg.V2G_Message.Body.isused.CertificateUpdateReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 6:/* CertificateInstallationReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					certificateInstallation((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.CertificateInstallationReq), (service->exiMsg.V2G_Message.Body.CertificateInstallationRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.CertificateInstallationRes=1;
+					service->exiMsg.V2G_Message.Body.isused.CertificateInstallationReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 2:/* CableCheckReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					cableCheck((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.CableCheckReq), (service->exiMsg.V2G_Message.Body.CableCheckRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.CableCheckRes=1;
+					service->exiMsg.V2G_Message.Body.isused.CableCheckReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 74:/* PreChargeReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					preCharge((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.PreChargeReq), (service->exiMsg.V2G_Message.Body.PreChargeRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.PreChargeRes=1;
+					service->exiMsg.V2G_Message.Body.isused.PreChargeReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 32:/* CurrentDemandReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					currentDemand((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.CurrentDemandReq), (service->exiMsg.V2G_Message.Body.CurrentDemandRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.CurrentDemandRes=1;
+					service->exiMsg.V2G_Message.Body.isused.CurrentDemandReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+				case 113:/* WeldingDetectionReq */	
+	
+ 		
+			
+							
+					/* test, if data length is unequal to the expected payload  */
+					/*if((service->inStream.size)!= *(service->inStream.pos))
+					{
+						service->errorCode = EXI_NON_VALID_MESSAGE;
+						return -1;
+					}	*/		
+			
+					/* service call */
+					weldingDetection((service->exiMsg.V2G_Message.Header),(service->exiMsg.V2G_Message.Body.WeldingDetectionReq), (service->exiMsg.V2G_Message.Body.WeldingDetectionRes));
+							
+					/* signalize the response message */
+					service->exiMsg.V2G_Message.Body.isused.WeldingDetectionRes=1;
+					service->exiMsg.V2G_Message.Body.isused.WeldingDetectionReq=0;
+					
+					/* serialize the response data */
+					if(serialize_message(service))
+					{
+						/* serializiation error*/
+						service->errorCode= EXI_SERIALIZATION_FAILED;
+					} 
+
+			
+		
+				break;
+			}
+		break;
+		case 6:
+			switch(service->eqn.localPart) {
+				case 123:/* SelectedService */	
+	
+ 					service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq->SelectedServiceList.arraylen.SelectedService++;
+
+				break;
+				case 141:/* SubCertificates */	
+	
+ 		if( service->idPath.id[2] == 65)
+				{
+								service->exiMsg.V2G_Message.Body.PaymentDetailsReq->ContractSignatureCertChain.isused.SubCertificates=1;
+
+				} else if(service->idPath.id[2] == 10)
+				{
+								service->exiMsg.V2G_Message.Body.CertificateUpdateReq->ContractSignatureCertChain.isused.SubCertificates=1;
+				}
+
+				break;
+				case 42:/* EVMaximumPowerLimit */	
+	
+ 					service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->isused.EVMaximumPowerLimit=1;
+
+				break;
+				case 36:/* EVEnergyCapacity */	
+	
+ 					service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->isused.EVEnergyCapacity=1;
+
+				break;
+				case 37:/* EVEnergyRequest */	
+	
+ 					service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->DC_EVChargeParameter->isused.EVEnergyRequest=1;
+
+				break;
+				case 0:/* AC_EVChargeParameter */	
+	
+ 					service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->isused.AC_EVChargeParameter=1;
+
+				break;
+				case 18:/* DC_EVChargeParameter */	
+	
+ 					service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq->isused.DC_EVChargeParameter=1;
+
+				break;
+				case 103:/* ProfileEntry */	
+	
+ 					service->exiMsg.V2G_Message.Body.PowerDeliveryReq->ChargingProfile.arraylen.ProfileEntry++;
+
+				break;
+				case 21:/* DC_EVPowerDeliveryParameter */	
+	
+ 					service->exiMsg.V2G_Message.Body.PowerDeliveryReq->isused.DC_EVPowerDeliveryParameter=1;
+
+				break;
+				case 82:/* MeterReading */	
+	
+ 					service->exiMsg.V2G_Message.Body.MeteringReceiptReq->MeterInfo.isused.MeterReading=1;
+
+				break;
+			}
+		break;
+		case 8:
+			switch(service->eqn.localPart) {
+				case 1:/* Notification */	
+	
+ 					service->exiMsg.V2G_Message.Header->isused.Notification=1;
+
+				break;
+			}
+		break;
+		
+
+	}
+	return 0;
+}
+
+static int deserializeSessionSetupReqMsg(struct EXIService* service)
+{
+	struct SessionSetupReqType reqMsg;
+	struct SessionSetupResType resMsg;
+	service->exiMsg.V2G_Message.Body.SessionSetupReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.SessionSetupRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeServiceDiscoveryReqMsg(struct EXIService* service)
+{
+	struct ServiceDiscoveryReqType reqMsg;
+	struct ServiceDiscoveryResType resMsg;
+	init_ServiceDiscoveryReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.ServiceDiscoveryReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.ServiceDiscoveryRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeServiceDetailReqMsg(struct EXIService* service)
+{
+	struct ServiceDetailReqType reqMsg;
+	struct ServiceDetailResType resMsg;
+	service->exiMsg.V2G_Message.Body.ServiceDetailReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.ServiceDetailRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeServicePaymentSelectionReqMsg(struct EXIService* service)
+{
+	struct ServicePaymentSelectionReqType reqMsg;
+	struct ServicePaymentSelectionResType resMsg;
+	init_ServicePaymentSelectionReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.ServicePaymentSelectionReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.ServicePaymentSelectionRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializePaymentDetailsReqMsg(struct EXIService* service)
+{
+	struct PaymentDetailsReqType reqMsg;
+	struct PaymentDetailsResType resMsg;
+	init_PaymentDetailsReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.PaymentDetailsReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.PaymentDetailsRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeContractAuthenticationReqMsg(struct EXIService* service)
+{
+	struct ContractAuthenticationReqType reqMsg;
+	struct ContractAuthenticationResType resMsg;
+	service->exiMsg.V2G_Message.Body.ContractAuthenticationReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.ContractAuthenticationRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeChargeParameterDiscoveryReqMsg(struct EXIService* service)
+{
+	struct ChargeParameterDiscoveryReqType reqMsg;
+	struct ChargeParameterDiscoveryResType resMsg;
+	struct DC_EVChargeParameterType dc_pev;
+	struct AC_EVChargeParameterType ac_pev;
+	struct DC_EVSEChargeParameterType dc_evse;
+	struct AC_EVSEChargeParameterType ac_evse;
+	struct SAScheduleListType tuple;
+	struct SalesTariffType sales1;
+	struct SalesTariffType sales2;
+
+	init_AC_EVChargeParameterType(&ac_pev);
+
+	init_ChargeParameterDiscoveryReqType(&reqMsg);
+	init_DC_EVSEChargeParameterType(&dc_evse);
+	init_AC_EVSEChargeParameterType(&ac_evse);
+	init_DC_EVChargeParameterType(&dc_pev);
+	init_SAScheduleListType(&tuple);
+	init_SalesTariffType(&sales1);
+	init_SalesTariffType(&sales2);
+
+	reqMsg.AC_EVChargeParameter = &ac_pev;
+	reqMsg.DC_EVChargeParameter = &dc_pev;
+	resMsg.AC_EVSEChargeParameter = &ac_evse;
+	resMsg.DC_EVSEChargeParameter= &dc_evse;
+
+	service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.ChargeParameterDiscoveryRes = &resMsg;
+
+	tuple.SAScheduleTuple[0].SalesTariff = &sales1;
+	tuple.SAScheduleTuple[1].SalesTariff =  &sales2;
+	resMsg.SAScheduleList = &tuple;
+
+
+	
+	return deserializeMessage(service);
+}
+
+static int deserializePowerDeliveryReqMsg(struct EXIService* service)
+{
+	struct PowerDeliveryReqType reqMsg;
+	struct PowerDeliveryResType resMsg;
+	struct DC_EVPowerDeliveryParameterType EVPowerDelivery;
+
+	struct DC_EVSEStatusType dc_evse;
+	struct AC_EVSEStatusType ac_evse;
+
+	init_DC_EVPowerDeliveryParameterType(&EVPowerDelivery);
+	init_PowerDeliveryReqType(&reqMsg);
+
+
+	resMsg.AC_EVSEStatus = &ac_evse;
+	resMsg.DC_EVSEStatus = &dc_evse;
+
+	reqMsg.DC_EVPowerDeliveryParameter = &EVPowerDelivery;
+
+	service->exiMsg.V2G_Message.Body.PowerDeliveryReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.PowerDeliveryRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeChargingStatusReqMsg(struct EXIService* service)
+{
+	struct ChargingStatusReqType reqMsg;
+	struct ChargingStatusResType resMsg;
+	service->exiMsg.V2G_Message.Body.ChargingStatusReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.ChargingStatusRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeMeteringReceiptReqMsg(struct EXIService* service)
+{
+	struct MeteringReceiptReqType reqMsg;
+	struct MeteringReceiptResType resMsg;
+	init_MeteringReceiptReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.MeteringReceiptReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.MeteringReceiptRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeCertificateUpdateReqMsg(struct EXIService* service)
+{
+	struct CertificateUpdateReqType reqMsg;
+	struct CertificateUpdateResType resMsg;
+	init_CertificateUpdateReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.CertificateUpdateReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.CertificateUpdateRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeCertificateInstallationReqMsg(struct EXIService* service)
+{
+	struct CertificateInstallationReqType reqMsg;
+	struct CertificateInstallationResType resMsg;
+	init_CertificateInstallationReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.CertificateInstallationReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.CertificateInstallationRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeCableCheckReqMsg(struct EXIService* service)
+{
+	struct CableCheckReqType reqMsg;
+	struct CableCheckResType resMsg;
+	service->exiMsg.V2G_Message.Body.CableCheckReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.CableCheckRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializePreChargeReqMsg(struct EXIService* service)
+{
+	struct PreChargeReqType reqMsg;
+	struct PreChargeResType resMsg;
+	init_PreChargeReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.PreChargeReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.PreChargeRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeCurrentDemandReqMsg(struct EXIService* service)
+{
+	struct CurrentDemandReqType reqMsg;
+	struct CurrentDemandResType resMsg;
+	init_CurrentDemandReqType(&reqMsg);
+	
+	service->exiMsg.V2G_Message.Body.CurrentDemandReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.CurrentDemandRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeWeldingDetectionReqMsg(struct EXIService* service)
+{
+	struct WeldingDetectionReqType reqMsg;
+	struct WeldingDetectionResType resMsg;
+	service->exiMsg.V2G_Message.Body.WeldingDetectionReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.WeldingDetectionRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+static int deserializeSessionStopReqMsg(struct EXIService* service)
+{
+	struct SessionStopType reqMsg;
+	struct SessionStopResType resMsg;
+	service->exiMsg.V2G_Message.Body.SessionStopReq = &reqMsg;
+	service->exiMsg.V2G_Message.Body.SessionStopRes = &resMsg;
+	
+	return deserializeMessage(service);
+}
+
+/** 
+ * Deserialize the EXI stream
+ * @return 0 = 0K; -1 = ERROR
+ */
+static int deserializeMessage(struct EXIService* service)
+{
+	int noEndOfDocument = 1; /* true */
+	int returnCode=0;
+
+
+	do {
+			exiDecodeNextEvent(&(service->inStream), &(service->stateDecode), &(service->event));
+			if (returnCode) 
+			{
+				
+				if(service->errorCode==0) 
+				{
+					service->errorCode= EXI_NON_VALID_MESSAGE;
+				}
+			
+				return returnCode;
+			}
+
+			switch (service->event) {
+			case EXI_EVENT_START_DOCUMENT:
+
+				returnCode = exiDecodeStartDocument(&(service->inStream), &(service->stateDecode));
+
+				break;
+			case EXI_EVENT_END_DOCUMENT:
+
+				returnCode = exiDecodeEndDocument(&(service->inStream), &(service->stateDecode));
+				noEndOfDocument = 0; /* false */
+				break;
+			case EXI_EVENT_START_ELEMENT:
+				returnCode = exiDecodeStartElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				service->idPath.id[service->idPath.pos++]=service->eqn.localPart;
+				 
+				 /* setup the request context*/
+				 if(service->eqn.localPart==105 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeSessionSetupReqMsg(service);
+				   } else if(service->eqn.localPart==92 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeServiceDiscoveryReqMsg(service);
+				   } else if(service->eqn.localPart==88 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeServiceDetailReqMsg(service);
+				   } else if(service->eqn.localPart==99 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeServicePaymentSelectionReqMsg(service);
+				   } else if(service->eqn.localPart==65 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializePaymentDetailsReqMsg(service);
+				   } else if(service->eqn.localPart==25 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeContractAuthenticationReqMsg(service);
+				   } else if(service->eqn.localPart==14 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeChargeParameterDiscoveryReqMsg(service);
+				   } else if(service->eqn.localPart==70 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializePowerDeliveryReqMsg(service);
+				   } else if(service->eqn.localPart==21 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeChargingStatusReqMsg(service);
+				   } else if(service->eqn.localPart==60 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeMeteringReceiptReqMsg(service);
+				   } else if(service->eqn.localPart==109 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeSessionStopReqMsg(service);
+				   } else if(service->eqn.localPart==10 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeCertificateUpdateReqMsg(service);
+				   } else if(service->eqn.localPart==6 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeCertificateInstallationReqMsg(service);
+				   } else if(service->eqn.localPart==2 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeCableCheckReqMsg(service);
+				   } else if(service->eqn.localPart==74 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializePreChargeReqMsg(service);
+				   } else if(service->eqn.localPart==32 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeCurrentDemandReqMsg(service);
+				   } else if(service->eqn.localPart==113 && service->eqn.namespaceURI==5)
+				  {
+				 	return deserializeWeldingDetectionReqMsg(service);
+				   } 				 
+				 
+				 
+				break;
+			case EXI_EVENT_END_ELEMENT:
+
+				returnCode = exiDecodeEndElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				returnCode = deserializeElementOrServiceCall(service);
+				service->idPath.pos--;
+				 
+				break;
+			case EXI_EVENT_CHARACTERS:
+				/* decode */
+				returnCode = exiDecodeCharacters(&(service->inStream), &(service->stateDecode), &(service->val));
+				 
+				/* assign data to the EXI message structure */
+				returnCode = deserializeElementAttributeCharacter(service);
+				break;
+			case EXI_EVENT_ATTRIBUTE:
+				/* decode */
+				returnCode = exiDecodeAttribute(&(service->inStream), &(service->stateDecode), &(service->eqn), &(service->val));
+				returnCode = deserializeElementAttributeCharacter(service);
+				break;
+			case EXI_EVENT_START_ELEMENT_GENERIC:
+				break;
+			case EXI_EVENT_START_ELEMENT_GENERIC_UNDECLARED:
+				break;
+			case EXI_EVENT_END_ELEMENT_UNDECLARED:
+				break;
+			case EXI_EVENT_CHARACTERS_GENERIC:
+				break;
+			case EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED:
+				break;
+			case EXI_EVENT_ATTRIBUTE_GENERIC:
+				break;
+			case EXI_EVENT_ATTRIBUTE_INVALID_VALUE:
+				break;
+			case EXI_EVENT_ATTRIBUTE_ANY_INVALID_VALUE:
+				break;
+			case EXI_EVENT_ATTRIBUTE_GENERIC_UNDECLARED:
+				break;
+			default:
+				/* ERROR */
+				return -1;
+			}
+
+		} while (noEndOfDocument);
+
+	return 0;
+}
+
+
+/** 
+ * \brief Takes the EXI stream, invokes the called service method, and provides the response EXI stream
+ * \param	service   struct EXIService* Represent the service data structure
+ * \param	inStream   uint8_t* EXI in stream
+ * \param	sizeInStream   uint16_t Length of the inStream
+ * \param	outStream   uint8_t* Represent the out stream
+ * \param	sizeOutStream   uint16_t Size of the out stream
+ * \param	outStreamLength   uint16_t* Length of the stream
+ * \return  0 = 0K; -1 = ERROR
+ */
+int messageDispatcher(struct EXIService* service, uint8_t* inStream, uint16_t sizeInStream, uint8_t* outStream, uint16_t sizeOutStream, uint16_t* outStreamLength)
+{
+	struct MessageHeaderType header;	
+	struct SignatureType signature;
+
+	uint32_t inPos, outPos;
+	
+	exi_name_table_runtime_t runtimeTableDecode;
+	exi_name_table_runtime_t runtimeTableEncode;
+	
+	/* assign inStream data to service EXI structure */
+	inPos = service->transportHeaderOffset;
+	service->inStream.data = inStream;
+	service->inStream.size = sizeInStream+inPos;
+	service->inStream.pos = &inPos;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+
+	
+	/* assign outStream data to service EXI structure */
+	outPos=service->transportHeaderOffset;
+	service->outStream.data = outStream;
+	service->outStream.size = sizeOutStream;
+	service->outStream.pos = &outPos;
+	service->outStream.buffer=0;
+	service->outStream.capacity=8;
+	
+	/* clear error code */
+	service->errorCode = 0;
+	
+	/* init decoder (read header, set initial state) */
+	/* init runtime table */
+	exiInitNameTableRuntime(&runtimeTableDecode);
+	exiInitDecoder(&(service->inStream), &(service->stateDecode), runtimeTableDecode);
+	
+	/* init encoder (write header, set initial state) */
+	exiInitNameTableRuntime(&runtimeTableEncode);
+	exiInitEncoder(&(service->outStream), &(service->stateEncode), runtimeTableEncode);
+
+	/* init uniqueID stack */
+	service->idPath.pos=0;
+
+	init_MessageHeaderType(&header);
+	service->exiMsg.V2G_Message.Header = &header;
+	init_SignatureType(&signature);
+	service->exiMsg.V2G_Message.Header->Signature=&signature;
+
+	/* init EXI message */
+	init_EXIDocumentType(&(service->exiMsg));
+
+	/* deserialize the input stream and call the corresponding service */
+	if(deserializeMessage(service))
+	{
+		return -1; /* something went wrong */
+	}
+
+	/* determine payload size (without transport offset) */	
+	outPos -= service->transportHeaderOffset;
+	*outStreamLength = outPos;
+
+	
+	return 0;
+}
+
+/** 
+ * \brief Init the v2g service data structure
+ * \param	service   struct EXIService* Service data structure
+ * \param	bytes   bytes_t setted up byte data structure
+ * \param	string_ucs_t   setted up string data structure
+ * \param	transportHeaderOffset uint16_t Transport protocol offset
+ * \return  0 = 0K; -1 = ERROR
+ */
+int init_v2gservice(struct EXIService* service, bytes_t bytes, string_ucs_t string, uint16_t transportHeaderOffset)
+{
+
+	/* init byte array */
+	 service->val.binary = bytes;
+
+	/* init string array */
+	 service->val.string = string;
+
+	/* init offset for transport protocoll */
+	 service->transportHeaderOffset=transportHeaderOffset;
+
+	return 0;
+}

+ 43 - 0
src/service/v2g_serviceDispatcher.h

@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2007-2010 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2GSERVER_H_
+#define V2GSERVER_H_
+
+#include "v2g_serviceDataTypes.h"
+
+
+int init_v2gservice(struct EXIService* service,bytes_t bytes, string_ucs_t string, uint16_t transportHeaderOffset);
+int messageDispatcher(struct EXIService* service, uint8_t* inStream, uint16_t sizeInStream, uint8_t* outStream, uint16_t sizeOutStream, uint16_t* outPos);
+
+#endif /* V2GSERVER_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 87 - 0
src/service/v2g_serviceMethods.h

@@ -0,0 +1,87 @@
+
+
+
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXISeGen</p>
+ *
+ ********************************************************************/
+
+ 
+ #ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SERVICEMETHODS_H
+#define SERVICEMETHODS_H
+
+#include "v2g_serviceDataTypes.h"
+#include "EXITypes.h"
+
+/* This service methods has to be implemented by the EVSE server */
+int	sessionSetup(struct MessageHeaderType* header, struct SessionSetupReqType* param, struct SessionSetupResType* result);
+					
+int	serviceDiscovery(struct MessageHeaderType* header, struct ServiceDiscoveryReqType* param, struct ServiceDiscoveryResType* result);
+					
+int	serviceDetail(struct MessageHeaderType* header, struct ServiceDetailReqType* param, struct ServiceDetailResType* result);
+					
+int	servicePaymentSelection(struct MessageHeaderType* header, struct ServicePaymentSelectionReqType* param, struct ServicePaymentSelectionResType* result);
+					
+int	paymentDetails(struct MessageHeaderType* header, struct PaymentDetailsReqType* param, struct PaymentDetailsResType* result);
+					
+int	contractAuthentication(struct MessageHeaderType* header, struct ContractAuthenticationReqType* param, struct ContractAuthenticationResType* result);
+					
+int	chargeParameterDiscovery(struct MessageHeaderType* header, struct ChargeParameterDiscoveryReqType* param, struct ChargeParameterDiscoveryResType* result);
+					
+int	powerDelivery(struct MessageHeaderType* header, struct PowerDeliveryReqType* param, struct PowerDeliveryResType* result);
+					
+int	chargingStatus(struct MessageHeaderType* header, struct ChargingStatusReqType* param, struct ChargingStatusResType* result);
+					
+int	meteringReceipt(struct MessageHeaderType* header, struct MeteringReceiptReqType* param, struct MeteringReceiptResType* result);
+					
+int	sessionStop(struct MessageHeaderType* header, struct SessionStopType* param, struct SessionStopResType* result);
+					
+int	certificateUpdate(struct MessageHeaderType* header, struct CertificateUpdateReqType* param, struct CertificateUpdateResType* result);
+					
+int	certificateInstallation(struct MessageHeaderType* header, struct CertificateInstallationReqType* param, struct CertificateInstallationResType* result);
+					
+int	cableCheck(struct MessageHeaderType* header, struct CableCheckReqType* param, struct CableCheckResType* result);
+					
+int	preCharge(struct MessageHeaderType* header, struct PreChargeReqType* param, struct PreChargeResType* result);
+					
+int	currentDemand(struct MessageHeaderType* header, struct CurrentDemandReqType* param, struct CurrentDemandResType* result);
+					
+int	weldingDetection(struct MessageHeaderType* header, struct WeldingDetectionReqType* param, struct WeldingDetectionResType* result);
+						
+	
+
+	
+	
+	
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 185 - 0
src/test/evse_server.c

@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @@version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+
+
+/* includes for the application handshake protocol */
+#include "appHand_service.h"
+#include "appHand_dataTypes.h"
+
+#include "evse_server.h"
+#include "v2g_service.h"
+#include "v2g_serviceDispatcher.h"
+#include "v2gtp.h"
+
+#define MAX_BYTE_SIZE 64
+#define MAX_STRING_SIZE 64
+#define MAX_STREAM_SIZE 100
+
+
+static int appHandshakeHandler(struct EXIDatabinder* appHandService, uint8_t* inStream, uint16_t sizeInStream, uint8_t* outStream, uint16_t* outStreamLength);
+static void printASCIIString(uint32_t* string, uint32_t len);
+
+int testV2GService(uint8_t* inStream, uint16_t inStreamLength, uint8_t* outStream, uint16_t* outStreamLength)
+{
+	static uint8_t byte_array[MAX_BYTE_SIZE]; /* define MAX_BYTE_SIZE before*/
+	static uint32_t string_array[MAX_STRING_SIZE]; /* define MAX_STRING_SIZE before*/
+	uint16_t exiMsgLength;
+
+	struct EXIDatabinder appHandService;
+	struct EXIService service;
+
+	static uint8_t isHandshake = 1;
+
+	/* BINARY memory setup */
+	bytes_t bytes = { MAX_BYTE_SIZE, byte_array, 0 };
+
+	/* STRING memory setup */
+	string_ucs_t string = { MAX_STRING_SIZE, string_array, 0 };
+
+	/**********************************************
+	 * Init V2G server and initialize array types *
+	 * for the EXI decoding	as well as the offset *
+	 * for the transportation header			  *
+	 **********************************************/
+
+	init_v2gservice(&service, bytes, string, V2GTP_HEADER_LENGTH);
+
+	/* check, if the DoIP header is correct and determine payload */
+	if(read_v2gtpHeader(inStream,inStreamLength, &exiMsgLength))
+	{
+		/* v2gtp header not correct */
+		return -1;
+	}
+
+	/* Here, it is assumed the first message is always the application handshake protocol.
+	 * The successor messages are 15118 charging based messages and handled by the message
+	 * dispatcher. */
+
+	if(isHandshake)
+	{
+
+
+
+		/* init the de- / serializer */
+		init_appHandDeserializer(&appHandService,bytes,string,V2GTP_HEADER_LENGTH);
+		init_appHandSerializer(&appHandService,bytes,string,MAX_STREAM_SIZE,V2GTP_HEADER_LENGTH);
+
+		if(appHandshakeHandler(&appHandService, inStream,inStreamLength,outStream,outStreamLength))
+		{
+			return -1; /* an error occured */
+		}
+
+		isHandshake = 0; /* here: next time a charging message is expected */
+	}
+	else
+	{
+
+
+		/****************************************************************************
+		 * Pass the received EXI message stream (inStream + exiMsgLength) to the    *
+		 * v2g message dispatcher. 	The outStream contains the response message     *
+		 * stream.  																*
+		 ****************************************************************************/
+
+		if(messageDispatcher(&service, inStream, exiMsgLength, outStream, MAX_STREAM_SIZE, outStreamLength))
+		{
+			/* an error occured */
+			return -1;
+		}
+
+	}
+
+
+	/* write v2gtp header */
+	write_v2gtpHeader(outStream, outStreamLength, V2GTP_EXI_TYPE);
+
+
+
+	return 0;
+
+}
+
+/** Example implementation of the app handshake protocol for the EVSE side  */
+static int appHandshakeHandler(struct EXIDatabinder* appHandService, uint8_t* inStream, uint16_t sizeInStream, uint8_t* outStream, uint16_t* outStreamLength)
+{
+	struct EXIDocumentType_appHand exiDoc;
+	struct AnonType_supportedAppProtocolReq handshake;
+	struct AnonType_supportedAppProtocolRes resultHandshake;
+	size_t i;
+
+	init_AnonType_supportedAppProtocolReq(&handshake);
+	init_EXIDocumentType_appHand(&exiDoc);
+
+	/* we expect a supportedAppProtocolReq */
+	exiDoc.supportedAppProtocolReq = &handshake;
+
+
+	if(deserialize_appHand(appHandService,inStream,sizeInStream,&exiDoc))
+	{
+		/* an error occured */
+		return -1;
+	}
+
+	printf("EVSE side: List of application handshake protocols of the EV \n");
+
+	for(i=0;i<handshake.arraylen.AppProtocol;i++)
+	{
+		printf("\tProtocol entry #=%d\n",(i+1));
+		printf("\t\tProtocolNamespace=");
+		printASCIIString(handshake.AppProtocol[i].ProtocolNamespace.data,handshake.AppProtocol[i].ProtocolNamespace.arraylen.data);
+		printf("\t\tVersion=%d.%d\n", handshake.AppProtocol[i].VersionNumberMajor,handshake.AppProtocol[i].VersionNumberMinor);
+		printf("\t\tSchemaID=%d\n", handshake.AppProtocol[i].SchemaID);
+		printf("\t\tPriority=%d\n", handshake.AppProtocol[i].Priority);
+	}
+
+	/* prepare response handshake response:
+	 * it is assumed, we support the 15118 1.0 version :-) */
+	resultHandshake.ResponseCode=OK_SuccessfulNegotiation_responseCodeType;
+	resultHandshake.SchemaID=handshake.AppProtocol[0].SchemaID; /* signal the protocol by the provided schema id*/
+	resultHandshake.isused.SchemaID=1;
+
+	/* assign the response message to the exiDoc */
+	init_EXIDocumentType_appHand(&exiDoc);
+	exiDoc.supportedAppProtocolRes=&resultHandshake;
+	exiDoc.isused.supportedAppProtocolRes=1;
+
+	if(serialize_appHand(appHandService, outStream,outStreamLength, &exiDoc))
+	{
+		return -1;
+	}
+
+
+	return 0;
+}
+
+static void printASCIIString(uint32_t* string, uint32_t len) {
+	unsigned int i;
+	for(i=0; i<len; i++) {
+		printf("%c",(char)string[i]);
+	}
+	printf("\n");
+}
+

+ 33 - 0
src/test/evse_server.h

@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @@version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifndef V2G_SERVER_H_
+#define V2G_SERVER_H_
+
+#include "EXITypes.h"
+
+int testV2GService(uint8_t* inStream, uint16_t inStreamLength, uint8_t* outStream,uint16_t* outStreamLength);
+
+#endif /* V2G_SERVER_H_ */

+ 647 - 0
src/test/evse_serviceMethods.c

@@ -0,0 +1,647 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#include "v2g_serviceMethods.h"
+#include "v2g_serviceDataTypes.h"
+#include <stdio.h>
+
+static void printBinaryArray(uint8_t* byte, uint32_t len);
+
+int	sessionSetup(struct MessageHeaderType* header, struct SessionSetupReqType* param, struct SessionSetupResType* result)
+{
+
+	printf("EVSE side: sessionSetup called\n"  );
+	printf("\tReceived data:\n");
+	printf("\tHeader SessionID=");
+	printBinaryArray(header->SessionID.data,header->SessionID.arraylen.data );
+	printf("\t\t EVCCID=%d\n",param->EVCCID.data[0]);
+
+	/* generate an unique sessionID */
+	header->SessionID.data[0] = 0;
+	header->SessionID.data[1] = 0;
+	header->SessionID.data[2] = 0;
+	header->SessionID.data[3] = 0;
+	header->SessionID.data[4] = 0;
+	header->SessionID.data[5] = 0;
+	header->SessionID.data[6] = 0;
+	header->SessionID.data[7] = 10;
+	header->SessionID.arraylen.data=8;
+
+	/* Prepare data for EV */
+	result->ResponseCode = OK_responseCodeType;
+	result->EVSEID.data[0]=1;
+	result->EVSEID.arraylen.data=1;
+	result->DateTimeNow=123456789;
+	result->isused.DateTimeNow=1;
+
+	return 0;
+
+}
+
+int	serviceDiscovery(struct MessageHeaderType* header, struct ServiceDiscoveryReqType* param, struct ServiceDiscoveryResType* result)
+{
+	printf("EVSE side: serviceDiscovery called\n"  );
+	printf("\tReceived data:\n");
+	printf("\tHeader SessionID=");
+	printBinaryArray(header->SessionID.data,header->SessionID.arraylen.data );
+
+	printf("\t\t ServiceCategory=%d\n", param->ServiceCategory);
+
+	result->isused.ServiceList=0; /* we do not provide VAS */
+	result->ResponseCode= OK_responseCodeType;
+
+
+	result->ChargeService.EnergyTransferType = AC_single_DC_core_EVSESupportedEnergyTransferType;
+	result->ChargeService.ServiceTag.ServiceID=1; /* ID of the charge service */
+	result->ChargeService.ServiceTag.ServiceName.data[0]='A';
+	result->ChargeService.ServiceTag.ServiceName.data[1]='C';
+	result->ChargeService.ServiceTag.ServiceName.data[2]='_';
+	result->ChargeService.ServiceTag.ServiceName.data[3]='D';
+	result->ChargeService.ServiceTag.ServiceName.data[4]='C';
+	result->ChargeService.ServiceTag.ServiceName.arraylen.data=5;
+	result->ChargeService.ServiceTag.isused.ServiceName=1;
+	result->ChargeService.ServiceTag.isused.ServiceCategory=0;
+	result->ChargeService.ServiceTag.isused.ServiceScope=0;
+
+	result->ChargeService.FreeService = 1;
+	result->PaymentOptions.PaymentOption[0] = ExternalPayment_paymentOptionType; /* EVSE handles the payment */
+	result->PaymentOptions.arraylen.PaymentOption=1;
+
+
+	result->ServiceList.Service[0].FreeService=1;
+	result->ServiceList.Service[0].ServiceTag.ServiceID=22; /* ID of the charge service */
+	result->ServiceList.Service[0].ServiceTag.ServiceName.data[0]='W';
+	result->ServiceList.Service[0].ServiceTag.ServiceName.data[1]='W';
+	result->ServiceList.Service[0].ServiceTag.ServiceName.data[2]='W';
+	result->ServiceList.Service[0].ServiceTag.ServiceName.arraylen.data=3;
+	result->ServiceList.Service[0].ServiceTag.ServiceCategory=Internet_serviceCategoryType;
+	result->ServiceList.Service[0].ServiceTag.isused.ServiceName=1;
+	result->ServiceList.Service[0].ServiceTag.isused.ServiceCategory=1;
+	result->ServiceList.Service[0].ServiceTag.isused.ServiceScope=0;
+
+	result->ServiceList.arraylen.Service=1;
+	result->isused.ServiceList=1;
+
+	return 0;
+}
+
+int	servicePaymentSelection(struct MessageHeaderType* header, struct ServicePaymentSelectionReqType* param, struct ServicePaymentSelectionResType* result)
+{
+	printf("EVSE side: servicePaymentSelection called\n"  );
+	printf("\tReceived data:\n");
+	printf("\tHeader SessionID=");
+	printBinaryArray(header->SessionID.data,header->SessionID.arraylen.data );
+
+	if(param->SelectedPaymentOption == ExternalPayment_paymentOptionType)
+		printf("\t\t SelectedPaymentOption=ExternalPayment\n");
+
+	printf("\t\t ServiceID=%d\n",param->SelectedServiceList.SelectedService[0].ServiceID);
+
+	result->ResponseCode = OK_responseCodeType;
+
+	return 0;
+}
+
+int	paymentDetails(struct MessageHeaderType* header, struct PaymentDetailsReqType* param, struct PaymentDetailsResType* result)
+{
+	return 0;
+}
+
+int	chargeParameterDiscovery(struct MessageHeaderType* header, struct ChargeParameterDiscoveryReqType* param, struct ChargeParameterDiscoveryResType* result)
+{
+	struct PhysicalValueType f;
+
+	printf("EVSE side: chargeParameterDiscovery called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t EVRequestedEnergyTransferType=%d\n",param->EVRequestedEnergyTransferType);
+
+	/* check,if DC or AC is requested */
+	if(param->EVRequestedEnergyTransferType==DC_core_EVRequestedEnergyTransferType || param->isused.DC_EVChargeParameter==1)
+	{
+
+		printf("\t\t EVStatus:\n");
+		printf("\t\t\t EVReady=%d\n", param->DC_EVChargeParameter->DC_EVStatus.EVReady);
+		printf("\t\t\t EVRESSSOC=%d\n", param->DC_EVChargeParameter->DC_EVStatus.EVRESSSOC);
+		printf("\t\t\t EVErrorCode=%d\n", param->DC_EVChargeParameter->DC_EVStatus.EVErrorCode);
+		printf("\t\t\t EVRESSConditioning=%d\n", param->DC_EVChargeParameter->DC_EVStatus.EVRESSConditioning);
+		printf("\t\t\t EVCabinConditioning=%d\n", param->DC_EVChargeParameter->DC_EVStatus.EVCabinConditioning);
+
+
+		printf("\t\t EVMaximumCurrentLimit=%d\n", param->DC_EVChargeParameter->EVMaximumCurrentLimit.Value);
+		printf("\t\t EVMaximumPowerLimit=%d\n", param->DC_EVChargeParameter->EVMaximumPowerLimit.Value);
+		printf("\t\t EVMaximumVoltageLimit=%d\n", param->DC_EVChargeParameter->EVMaximumVoltageLimit.Value);
+		printf("\t\t EVEnergyCapacity=%d\n", param->DC_EVChargeParameter->EVEnergyCapacity.Value);
+		printf("\t\t EVEnergyRequest=%d\n", param->DC_EVChargeParameter->EVEnergyRequest.Value);
+		printf("\t\t FullSOC=%d\n", param->DC_EVChargeParameter->FullSOC);
+		printf("\t\t BulkSOC=%d\n", param->DC_EVChargeParameter->BulkSOC);
+
+		result->ResponseCode = OK_responseCodeType;
+		result->isused.SAScheduleList=0;
+
+
+		result->isused.DC_EVSEChargeParameter = 1;
+		result->isused.AC_EVSEChargeParameter = 0;
+		result->DC_EVSEChargeParameter->DC_EVSEStatus.EVSEStatusCode = EVSE_Ready_DC_EVSEStatusCodeType;
+		result->DC_EVSEChargeParameter->DC_EVSEStatus.EVSEIsolationStatus = Safe_isolationLevelType;
+		result->DC_EVSEChargeParameter->DC_EVSEStatus.isused.EVSEIsolationStatus = 1;
+
+
+		f.Multiplier = 0;
+		f.Unit = A_unitSymbolType;
+		f.Value = 50;
+
+		result->DC_EVSEChargeParameter->EVSEMaximumCurrentLimit=f;
+
+		f.Unit = W_unitSymbolType;
+		f.Value = 20000;
+
+		result->DC_EVSEChargeParameter->EVSEMaximumPowerLimit=f;
+		result->DC_EVSEChargeParameter->isused.EVSEMaximumPowerLimit=1;
+
+		f.Unit = V_unitSymbolType;
+		f.Value = 400;
+
+		result->DC_EVSEChargeParameter->EVSEMaximumVoltageLimit=f;
+
+		f.Unit = A_unitSymbolType;
+		f.Value = 5;
+
+		result->DC_EVSEChargeParameter->EVSEMinimumCurrentLimit=f;
+
+		f.Unit = V_unitSymbolType;
+		f.Value = 200;
+
+		result->DC_EVSEChargeParameter->EVSEMinimumVoltageLimit=f;
+
+		f.Unit = A_unitSymbolType;
+		f.Value = 2;
+
+		result->DC_EVSEChargeParameter->EVSECurrentRegulationTolerance=f;
+		result->DC_EVSEChargeParameter->isused.EVSECurrentRegulationTolerance=1;
+
+		f.Unit = A_unitSymbolType;
+		f.Value = 1;
+
+		result->DC_EVSEChargeParameter->EVSEPeakCurrentRipple=f;
+
+		f.Unit = W_unitSymbolType;
+		f.Value = 5000;
+
+		result->DC_EVSEChargeParameter->EVSEEnergyToBeDelivered=f;
+		result->DC_EVSEChargeParameter->isused.EVSEEnergyToBeDelivered=1;
+
+		/* set up a PMax schedule */
+		result->isused.SAScheduleList=1;
+		result->SAScheduleList->SAScheduleTuple[0].SAScheduleTupleID=10;
+		result->SAScheduleList->SAScheduleTuple[0].isused.SalesTariff=0; /* no tariffs */
+
+		/* set up two PMax entries */
+		result->SAScheduleList->SAScheduleTuple[0].PMaxSchedule.PMaxScheduleID=20;
+		result->SAScheduleList->SAScheduleTuple[0].PMaxSchedule.PMaxScheduleEntry[0].PMax=20000;
+		result->SAScheduleList->SAScheduleTuple[0].PMaxSchedule.PMaxScheduleEntry[0].RelativeTimeInterval.start=0;
+
+		result->SAScheduleList->SAScheduleTuple[0].PMaxSchedule.PMaxScheduleEntry[1].PMax=0;
+		result->SAScheduleList->SAScheduleTuple[0].PMaxSchedule.PMaxScheduleEntry[1].RelativeTimeInterval.start=1200; /* 20 min */
+
+		result->SAScheduleList->SAScheduleTuple[0].PMaxSchedule.arraylen.PMaxScheduleEntry=2; /* we set up two time entries */
+
+
+		/* set up two PMax entries */
+		result->SAScheduleList->SAScheduleTuple[1].SAScheduleTupleID=15;
+		result->SAScheduleList->SAScheduleTuple[1].PMaxSchedule.PMaxScheduleID=30;
+		result->SAScheduleList->SAScheduleTuple[1].PMaxSchedule.PMaxScheduleEntry[0].PMax=10000;
+		result->SAScheduleList->SAScheduleTuple[1].PMaxSchedule.PMaxScheduleEntry[0].RelativeTimeInterval.start=0;
+
+		result->SAScheduleList->SAScheduleTuple[1].PMaxSchedule.PMaxScheduleEntry[1].PMax=0;
+		result->SAScheduleList->SAScheduleTuple[1].PMaxSchedule.PMaxScheduleEntry[1].RelativeTimeInterval.start=1800; /* 30 min */
+
+		result->SAScheduleList->SAScheduleTuple[1].PMaxSchedule.arraylen.PMaxScheduleEntry=2; /* we set up two time entries */
+
+		result->SAScheduleList->arraylen.SAScheduleTuple=2; /* we used only 1 tuple */
+
+	} else { /* AC related */
+
+		printf("\t\t DepartureTime=%d\n", param->AC_EVChargeParameter->DepartureTime);
+		printf("\t\t EAmount=%d\n", param->AC_EVChargeParameter->EAmount.Value);
+		printf("\t\t EVMaxCurrent=%d\n", param->AC_EVChargeParameter->EVMaxCurrent.Value);
+		printf("\t\t EVMaxVoltage=%d\n", param->AC_EVChargeParameter->EVMaxVoltage.Value);
+		printf("\t\t EVMinCurrent=%d\n", param->AC_EVChargeParameter->EVMinCurrent.Value);
+
+
+		result->ResponseCode = OK_responseCodeType;
+
+
+		result->isused.AC_EVSEChargeParameter = 1;
+		result->isused.DC_EVSEChargeParameter = 0;
+		result->isused.SAScheduleList = 0;
+
+
+		result->AC_EVSEChargeParameter->AC_EVSEStatus.PowerSwitchClosed=1;
+		result->AC_EVSEChargeParameter->AC_EVSEStatus.RCD=1;
+		result->AC_EVSEChargeParameter->AC_EVSEStatus.ShutDownTime=12345;
+		result->AC_EVSEChargeParameter->AC_EVSEStatus.StopCharging=0;
+
+
+		f.Multiplier = 0;
+		f.Unit = A_unitSymbolType;
+		f.Value = 100;
+
+		result->AC_EVSEChargeParameter->EVSEMaxCurrent=f;
+
+		f.Unit = V_unitSymbolType;
+		f.Value = 200;
+		result->AC_EVSEChargeParameter->EVSEMaxVoltage=f;
+
+		f.Unit = A_unitSymbolType;
+		f.Value = 300;
+		result->AC_EVSEChargeParameter->EVSEMinCurrent=f;
+
+		/* no sales schedule used */
+		result->isused.SAScheduleList=0;
+	}
+
+
+
+	return 0;
+}
+
+int	powerDelivery(struct MessageHeaderType* header, struct PowerDeliveryReqType* param, struct PowerDeliveryResType* result)
+{
+	size_t i;
+
+	printf("EVSE side: powerDelivery called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t\t ReadyToChargeState=%d\n", param->ReadyToChargeState);
+
+
+
+	if(param->isused.DC_EVPowerDeliveryParameter)
+	{
+
+		printf("\t\t EVStatus:\n");
+		printf("\t\t\t EVReady=%d\n", param->DC_EVPowerDeliveryParameter->DC_EVStatus.EVReady);
+		printf("\t\t\t EVRESSSOC=%d\n", param->DC_EVPowerDeliveryParameter->DC_EVStatus.EVRESSSOC);
+		printf("\t\t\t EVErrorCode=%d\n", param->DC_EVPowerDeliveryParameter->DC_EVStatus.EVErrorCode);
+		printf("\t\t\t EVRESSConditioning=%d\n", param->DC_EVPowerDeliveryParameter->DC_EVStatus.EVRESSConditioning);
+		printf("\t\t\t EVCabinConditioning=%d\n", param->DC_EVPowerDeliveryParameter->DC_EVStatus.EVCabinConditioning);
+
+
+		if(param->isused.ChargingProfile)
+		{
+			printf("\t\t\tChargingProfile:\n");
+			printf("\t\t\t SAScheduleTupleID=%d\n",param->ChargingProfile.SAScheduleTupleID );
+			for(i=0;i<param->ChargingProfile.arraylen.ProfileEntry;i++)
+			{
+				printf("\t\t\t Entry#%d\n",i);
+				printf("\t\t\t\t ChargingProfileEntryMaxPower=%d\n", param->ChargingProfile.ProfileEntry[i].ChargingProfileEntryMaxPower);
+				printf("\t\t\t\t ChargingProfileEntryStart=%d\n", param->ChargingProfile.ProfileEntry[i].ChargingProfileEntryStart);
+
+			}
+
+
+		}
+
+
+		result->ResponseCode = OK_responseCodeType;
+		result->DC_EVSEStatus->EVSEIsolationStatus =1;
+		result->DC_EVSEStatus->isused.EVSEIsolationStatus = 1;
+		result->DC_EVSEStatus->EVSEStatusCode = EVSE_Ready_DC_EVSEStatusCodeType;
+		result->isused.DC_EVSEStatus=1;
+		result->isused.AC_EVSEStatus=0;
+
+
+
+
+
+	} else {
+
+
+		result->ResponseCode = OK_responseCodeType;
+		result->AC_EVSEStatus->PowerSwitchClosed=1;
+		result->AC_EVSEStatus->RCD=1;
+		result->AC_EVSEStatus->ShutDownTime=12345;
+		result->AC_EVSEStatus->StopCharging=1;
+
+
+		result->isused.AC_EVSEStatus=1;
+		result->isused.DC_EVSEStatus=0;
+
+	}
+
+	return 0;
+}
+
+int	chargingStatus(struct MessageHeaderType* header, struct ChargingStatusReqType* param, struct ChargingStatusResType* result)
+{
+	printf("EVSE side: chargingStatus called\n"  );
+
+
+
+	result->ResponseCode=OK_responseCodeType;
+	result->EVSEID.data[0]=1;
+	result->EVSEID.arraylen.data=1;
+	result->AC_EVSEStatus.PowerSwitchClosed=1;
+	result->AC_EVSEStatus.RCD=1;
+	result->AC_EVSEStatus.ShutDownTime=12345;
+	result->AC_EVSEStatus.StopCharging=1;
+	result->ReceiptRequired=0;
+	result->EVSEMaxCurrent.Multiplier = 2;
+	result->EVSEMaxCurrent.Unit = A_unitSymbolType;
+	result->EVSEMaxCurrent.isused.Unit=1;
+	result->EVSEMaxCurrent.Value = 400;
+	result->isused.EVSEMaxCurrent=1;
+	result->SAScheduleTupleID=10;
+	result->isused.SAScheduleTupleID=1;
+
+	result->isused.MeterInfo=1;
+	result->MeterInfo.MeterID.arraylen.data=1;
+	result->MeterInfo.MeterID.data[0]=2;
+	result->MeterInfo.MeterReading.Multiplier = 0;
+	result->MeterInfo.MeterReading.Unit = A_unitSymbolType;
+	result->MeterInfo.MeterReading.Value = 500;
+	result->MeterInfo.MeterStatus = 4321;
+	result->MeterInfo.TMeter =123456789;
+	result->MeterInfo.isused.MeterReading = 1;
+	result->MeterInfo.isused.MeterStatus=1;
+	result->MeterInfo.isused.TMeter=1;
+	result->MeterInfo.isused.SigMeterReading=0;
+
+	return 0;
+}
+
+int	meteringReceipt(struct MessageHeaderType* header, struct MeteringReceiptReqType* param, struct MeteringReceiptResType* result)
+{
+
+	printf("EVSE side: meteringReceipt called\n"  );
+	printf("\tReceived data:\n");
+
+	printf("\t\t SAScheduleTupleID=%d\n", param->SAScheduleTupleID);
+	printf("\t\t MeterInfo.MeterStatus=%d\n", param->MeterInfo.MeterStatus);
+	printf("\t\t MeterInfo.MeterID=%d\n",		param->MeterInfo.MeterID.data[0]);
+	printf("\t\t MeterInfo.isused.MeterReading=%d\n", param->MeterInfo.isused.MeterReading);
+	printf("\t\t MeterReading.Value=%d\n",		param->MeterInfo.MeterReading.Value);
+	printf("\t\t MeterInfo.TMeter=%d\n",		param->MeterInfo.TMeter);
+
+	result->ResponseCode = OK_responseCodeType;
+
+	result->AC_EVSEStatus.PowerSwitchClosed=1;
+	result->AC_EVSEStatus.RCD=1;
+	result->AC_EVSEStatus.ShutDownTime=12345;
+	result->AC_EVSEStatus.StopCharging=1;
+
+	return 0;
+}
+
+int	cableCheck(struct MessageHeaderType* header, struct CableCheckReqType* param, struct CableCheckResType* result)
+{
+	printf("EVSE side: cableCheck called\n"  );
+	printf("\tReceived data:\n");
+
+
+	printf("\t\t EVStatus:\n");
+	printf("\t\t\t EVReady=%d\n", param->DC_EVStatus.EVReady);
+	printf("\t\t\t EVRESSSOC=%d\n", param->DC_EVStatus.EVRESSSOC);
+	printf("\t\t\t EVErrorCode=%d\n", param->DC_EVStatus.EVErrorCode);
+	printf("\t\t\t EVRESSConditioning=%d\n", param->DC_EVStatus.EVRESSConditioning);
+	printf("\t\t\t EVCabinConditioning=%d\n", param->DC_EVStatus.EVCabinConditioning);
+
+
+	result->ResponseCode = OK_responseCodeType;
+	result->DC_EVSEStatus.EVSEIsolationStatus= Safe_isolationLevelType;
+	result->DC_EVSEStatus.isused.EVSEIsolationStatus = 1;
+	result->DC_EVSEStatus.EVSEStatusCode = EVSE_Ready_DC_EVSEStatusCodeType;
+
+	return 0;
+}
+
+
+int	preCharge(struct MessageHeaderType* header, struct PreChargeReqType* param, struct PreChargeResType* result)
+{
+	struct PhysicalValueType float_type;
+
+
+	printf("EVSE side: preCharge called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t EVStatus:\n");
+	printf("\t\t\t EVReady=%d\n", param->DC_EVStatus.EVReady);
+	printf("\t\t\t EVRESSSOC=%d\n", param->DC_EVStatus.EVRESSSOC);
+	printf("\t\t\t EVErrorCode=%d\n", param->DC_EVStatus.EVErrorCode);
+	printf("\t\t\t EVRESSConditioning=%d\n", param->DC_EVStatus.EVRESSConditioning);
+	printf("\t\t\t EVCabinConditioning=%d\n", param->DC_EVStatus.EVCabinConditioning);
+
+	result->ResponseCode = OK_responseCodeType;
+	result->DC_EVSEStatus.EVSEIsolationStatus= Safe_isolationLevelType;
+	result->DC_EVSEStatus.isused.EVSEIsolationStatus = 1;
+	result->DC_EVSEStatus.EVSEStatusCode = EVSE_Ready_DC_EVSEStatusCodeType;
+
+	float_type.Multiplier = 0;
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 100;
+	result->EVSEPresentVoltage = float_type;
+
+
+
+
+	return 0;
+
+
+}
+
+int	currentDemand(struct MessageHeaderType* header, struct CurrentDemandReqType* param, struct CurrentDemandResType* result)
+{
+
+	struct PhysicalValueType f;
+
+	printf("EVSE side: currentDemand called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t EVStatus:\n");
+	printf("\t\t\t EVReady=%d\n", param->DC_EVStatus.EVReady);
+	printf("\t\t\t EVRESSSOC=%d\n", param->DC_EVStatus.EVRESSSOC);
+	printf("\t\t\t EVErrorCode=%d\n", param->DC_EVStatus.EVErrorCode);
+	printf("\t\t\t EVRESSConditioning=%d\n", param->DC_EVStatus.EVRESSConditioning);
+	printf("\t\t\t EVCabinConditioning=%d\n", param->DC_EVStatus.EVCabinConditioning);
+
+	printf("\t\t EVTargetCurrent=%d\n", param->EVTargetCurrent.Value);
+	printf("\t\t EVMaximumVoltageLimit=%d\n", param->EVMaximumVoltageLimit.Value);
+	printf("\t\t EVMaximumPowerLimit=%d\n", param->EVMaximumPowerLimit.Value);
+	printf("\t\t EVMaximumCurrentLimit=%d\n", param->EVMaximumCurrentLimit.Value);
+	printf("\t\t BulkChargingComplete=%d\n", param->BulkChargingComplete);
+	printf("\t\t ChargingComplete=%d\n", param->ChargingComplete);
+	printf("\t\t RemainingTimeToFullSoC=%d\n", param->RemainingTimeToFullSoC.Value);
+	printf("\t\t RemainingTimeToBulkSoC=%d\n", param->RemainingTimeToBulkSoC.Value);
+
+	printf("\t\t EVTargetVoltage=%d\n", param->EVTargetVoltage.Value);
+
+
+	result->ResponseCode = OK_responseCodeType;
+	result->DC_EVSEStatus.EVSEIsolationStatus= Safe_isolationLevelType;
+	result->DC_EVSEStatus.isused.EVSEIsolationStatus = 1;
+	result->DC_EVSEStatus.EVSEStatusCode = EVSE_Ready_DC_EVSEStatusCodeType;
+
+	f.Multiplier = 0;
+	f.Unit = V_unitSymbolType;
+	f.Value = 400;
+
+	result->EVSEPresentVoltage=f;
+
+	f.Unit = A_unitSymbolType;
+	f.Value = 45;
+
+	result->EVSEPresentCurrent=f;
+
+	result->EVSECurrentLimitAchieved=0;
+
+	result->EVSEVoltageLimitAchieved=1;
+
+	result->EVSEPowerLimitAchieved=0;
+
+	f.Unit = V_unitSymbolType;
+	f.Value = 400;
+
+	result->EVSEMaximumVoltageLimit=f;
+	result->isused.EVSEMaximumVoltageLimit=1;
+
+	f.Unit = A_unitSymbolType;
+	f.Value = 50;
+
+	result->EVSEMaximumCurrentLimit=f;
+	result->isused.EVSEMaximumCurrentLimit=1;
+
+	f.Unit = W_unitSymbolType;
+	f.Value = 20000;
+
+	result->EVSEMaximumPowerLimit=f;
+	result->isused.EVSEMaximumPowerLimit=1;
+
+	return 0;
+}
+
+int	weldingDetection(struct MessageHeaderType* header, struct WeldingDetectionReqType* param, struct WeldingDetectionResType* result)
+{
+
+	printf("EVSE side: weldingDetection called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t EVStatus:\n");
+	printf("\t\t\t EVReady=%d\n", param->DC_EVStatus.EVReady);
+	printf("\t\t\t EVRESSSOC=%d\n", param->DC_EVStatus.EVRESSSOC);
+	printf("\t\t\t EVErrorCode=%d\n", param->DC_EVStatus.EVErrorCode);
+	printf("\t\t\t EVRESSConditioning=%d\n", param->DC_EVStatus.EVRESSConditioning);
+	printf("\t\t\t EVCabinConditioning=%d\n", param->DC_EVStatus.EVCabinConditioning);
+
+	result->ResponseCode = OK_responseCodeType;
+	result->DC_EVSEStatus.EVSEIsolationStatus= Safe_isolationLevelType;
+	result->DC_EVSEStatus.isused.EVSEIsolationStatus = 1;
+	result->DC_EVSEStatus.EVSEStatusCode = EVSE_Ready_DC_EVSEStatusCodeType;
+	result->EVSEPresentVoltage.Value = 123;
+	result->EVSEPresentVoltage.Unit = V_unitSymbolType;
+	result->EVSEPresentVoltage.Multiplier = 0;
+
+	return 0;
+}
+
+int	sessionStop(struct MessageHeaderType* header, struct SessionStopType* param, struct SessionStopResType* result)
+{
+
+
+	printf("EVSE side: sessionStop called\n"  );
+
+
+	result->ResponseCode = OK_responseCodeType;
+
+
+
+	return 0;
+
+}
+
+int	serviceDetail(struct MessageHeaderType* header, struct ServiceDetailReqType* param, struct ServiceDetailResType* result)
+{
+	return 0;
+}
+
+int	contractAuthentication(struct MessageHeaderType* header, struct ContractAuthenticationReqType* param, struct ContractAuthenticationResType* result)
+{
+	return 0;
+}
+
+int	certificateUpdate(struct MessageHeaderType* header, struct CertificateUpdateReqType* param, struct CertificateUpdateResType* result)
+{
+	return 0;
+}
+
+int	certificateInstallation(struct MessageHeaderType* header, struct CertificateInstallationReqType* param, struct CertificateInstallationResType* result)
+{
+
+	printf("EVSE: certificateInstallation called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t\t OEMProvisioningCert=%d\n", param->OEMProvisioningCert.data[0]);
+	printf("\t\t\t RootCertificateID[0]=%d\n", param->ListOfRootCertificateIDs.RootCertificateID[0].data[0]);
+	printf("\t\t\t DHParams[0]=%d\n", param->DHParams.data[0]);
+
+
+
+
+/*	result->ContractEncryptionEncryptedPrivateKey.data[0]=200;
+	result->ContractEncryptionEncryptedPrivateKey.arraylen.data=1;
+*/
+
+	result->ContractID.data[0]=50;
+	result->ContractID.arraylen.data=1;
+
+	result->ContractSignatureEncryptedPrivateKey.data[0]=12;
+	result->ContractSignatureEncryptedPrivateKey.arraylen.data=1;
+
+
+
+	result->ContractSignatureCertChain.Certificate.data[0]=40;
+	result->ContractSignatureCertChain.Certificate.arraylen.data=1;
+
+	result->ContractSignatureCertChain.SubCertificates.arraylen.Certificate=2;
+	result->ContractSignatureCertChain.SubCertificates.Certificate[0].data[0]=20;
+	result->ContractSignatureCertChain.SubCertificates.Certificate[0].arraylen.data=1;
+	result->ContractSignatureCertChain.SubCertificates.Certificate[1].data[0]=40;
+	result->ContractSignatureCertChain.SubCertificates.Certificate[1].arraylen.data=1;
+	result->ContractSignatureCertChain.isused.SubCertificates=1;
+
+	result->DHParams.data[0]=99;
+	result->DHParams.arraylen.data=1;
+
+	result->attr_Id.data[0]=33;
+	result->attr_Id.arraylen.data=1;
+
+	result->ResponseCode = OK_responseCodeType;
+
+	return 0;
+}
+
+static void printBinaryArray(uint8_t* byte, uint32_t len) {
+	unsigned int i;
+	for(i=0; i<len; i++) {
+		printf("%d ",byte[i]);
+	}
+	printf("\n");
+}
+
+

+ 538 - 0
src/test/main_codec.c

@@ -0,0 +1,538 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 0.6 
+ * @contact Joerg.Heuer@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ ********************************************************************/
+
+
+
+/*******************************************************************
+ *
+ * <p>Sample program to illustrate how to read an EXI stream and
+ *  directly write it again to an output</p>
+ *
+ *  <p>e.g., data/test/sessionSetupReq.xml.exi out/test/sessionSetupReq.xml.exi</p>
+ ********************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "EXIDecoder.h"
+#include "StringTable.h"
+#include "EXIEncoder.h"
+#include "EXITypes.h"
+#include "ByteStream.h"
+
+#if EXI_STREAM == BYTE_ARRAY
+/* 64 kilobytes = 65 536 bytes */
+/* 1 megabyte = 1 048 576 bytes*/
+#define BUFFER_SIZE 1048576
+uint8_t bufferIn[BUFFER_SIZE];
+uint8_t bufferOut[BUFFER_SIZE];
+#endif /* EXI_STREAM == BYTE_ARRAY */
+
+/* avoids warning: initializer element is not computable at load time */
+#define ARRAY_SIZE_BYTES 300
+uint8_t bytesData[ARRAY_SIZE_BYTES];
+#define ARRAY_SIZE_STRINGS 30000
+uint32_t codepoints[ARRAY_SIZE_STRINGS];
+#define ARRAY_SIZE_STRINGS_ASCII 150
+char charsNamespaceURI[ARRAY_SIZE_STRINGS_ASCII];
+char charsLocalName[ARRAY_SIZE_STRINGS_ASCII];
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+static void debugValue(exi_value_t* val);
+#endif /*EXI_DEBUG*/
+
+
+int xmain(int argc, char *argv[]) {
+
+	int errn = 0;
+
+	unsigned int k;
+
+	bitstream_t iStream, oStream;
+	uint32_t posDecode;
+	uint32_t posEncode;
+
+	/* EXI set-up */
+	exi_state_t stateDecode;
+	exi_state_t stateEncode;
+	exi_event_t event;
+	eqname_t eqn; /* efficient qname */
+	qname_t qn; /* ascii qname */
+	exi_value_t val;
+
+	exi_name_table_runtime_t runtimeTableDecode;
+	exi_name_table_runtime_t runtimeTableEncode;
+
+	/* BINARY memory setup */
+	bytes_t bytes = { ARRAY_SIZE_BYTES, bytesData, 0 };
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+	const char * localName;
+	const char * namespaceURI;
+#endif /*EXI_DEBUG*/
+	int noEndOfDocument = 1; /* true */
+
+	/* STRING memory setup */
+	string_ucs_t string = { ARRAY_SIZE_STRINGS, codepoints, 0 };
+	string_ascii_t stringNamespaceURI = { ARRAY_SIZE_STRINGS_ASCII,
+			charsNamespaceURI };
+	string_ascii_t stringLocalName =
+			{ ARRAY_SIZE_STRINGS_ASCII, charsLocalName };
+	qn.namespaceURI = stringNamespaceURI;
+	qn.localName = stringLocalName;
+
+	if (argc != 3) {
+		printf("Usage: %s exiInput exiOutput\n", argv[0]);
+		return -1;
+	}
+
+	/* input pos */
+	posDecode = 0;
+
+#if EXI_STREAM == BYTE_ARRAY
+	/* parse EXI stream to internal byte structures  */
+	errn = readBytesFromFile(argv[1], bufferIn, BUFFER_SIZE, posDecode);
+	if (errn < 0) {
+		printf("Problems while reading file into buffer\n");
+		return errn;
+	}
+#endif /* EXI_STREAM == BYTE_ARRAY */
+
+	/* setup input stream */
+#if EXI_STREAM == BYTE_ARRAY
+	iStream.size = BUFFER_SIZE;
+	iStream.data = bufferIn;
+	iStream.pos = &posDecode;
+#endif /* EXI_STREAM == BYTE_ARRAY */
+#if EXI_STREAM == FILE_STREAM
+	iStream.file = fopen(argv[1], "rb");
+#endif /* EXI_STREAM == FILE_STREAM */
+
+	iStream.buffer = 0;
+	iStream.capacity = 0;
+
+	/* setup output stream */
+	posEncode = 0;
+#if EXI_STREAM == BYTE_ARRAY
+	oStream.size = BUFFER_SIZE;
+	oStream.data = bufferOut;
+	oStream.pos = &posEncode;
+#endif
+#if EXI_STREAM == FILE_STREAM
+	oStream.file = fopen(argv[2], "wb");
+#endif /* EXI_STREAM == FILE_STREAM */
+	oStream.buffer = 0;
+	oStream.capacity = 8;
+
+	val.binary = bytes;
+	val.string = string;
+
+	/* init decoder (read header, set initial state) */
+	/* init runtime table */
+	errn = exiInitNameTableRuntime(&runtimeTableDecode);
+	exiInitDecoder(&iStream, &stateDecode, runtimeTableDecode);
+
+	/* init encoder (write header, set initial state) */
+	errn = exiInitNameTableRuntime(&runtimeTableEncode);
+	exiInitEncoder(&oStream, &stateEncode, runtimeTableEncode);
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+	printf("[DECODE] >>> EXI  >>> [ENCODE] \n");
+#endif /*EXI_DEBUG*/
+
+	do {
+		if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf("[Encode-ERROR] %d \n", errn);
+#endif /*EXI_DEBUG*/
+			return errn;
+		}
+
+		errn = exiDecodeNextEvent(&iStream, &stateDecode,
+				&event);
+		if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf("[Decode-ERROR] %d \n", errn);
+#endif /*EXI_DEBUG*/
+			return errn;
+		}
+
+		switch (event) {
+		case EXI_EVENT_START_DOCUMENT:
+			/* decode */
+			errn = exiDecodeStartDocument(&iStream,
+					&stateDecode);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-SD] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf(">> START_DOCUMENT \n");
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeStartDocument(&oStream,
+					&stateEncode);
+			break;
+		case EXI_EVENT_END_DOCUMENT:
+			/* decode */
+			errn = exiDecodeEndDocument(&iStream,
+					&stateDecode);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-ED] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf(">> END_DOCUMENT \n");
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeEndDocument(&oStream,
+					&stateEncode);
+			/* signalize end of document */
+			noEndOfDocument = 0; /* false */
+			break;
+		case EXI_EVENT_START_ELEMENT:
+			/* decode */
+			errn = exiDecodeStartElement(&iStream,
+					&stateDecode, &eqn);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-SE] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			exiGetLocalName(&(stateDecode.nameTablePrepopulated),
+					&(stateDecode.nameTableRuntime), eqn.namespaceURI,
+					eqn.localPart, &localName);
+			exiGetUri(&(stateDecode.nameTablePrepopulated),
+					&(stateDecode.nameTableRuntime), eqn.namespaceURI,
+					&namespaceURI);
+			printf(">> SE_{%s}%s \n", namespaceURI,
+					localName);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeStartElement(&oStream,
+					&stateEncode, &eqn);
+			break;
+		case EXI_EVENT_START_ELEMENT_GENERIC:
+			/* decode */
+			errn = exiDecodeStartElementGeneric(&iStream,
+					&stateDecode, &qn);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-SEgen] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf(">> SE_Gen {%s}%s \n", stringNamespaceURI.chars,
+					stringLocalName.chars);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeStartElementGeneric(&oStream,
+					&stateEncode, &stringNamespaceURI, &stringLocalName);
+			break;
+		case EXI_EVENT_END_ELEMENT:
+			/* decode */
+			errn = exiDecodeEndElement(&iStream,
+					&stateDecode, &eqn);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-EE] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf("<< EE \n");
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn
+					= exiEncodeEndElement(&oStream,
+							&stateEncode);
+			break;
+		case EXI_EVENT_END_ELEMENT_UNDECLARED:
+			/* decode */
+			errn = exiDecodeEndElementUndeclared(&iStream,
+					&stateDecode, &eqn);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-EE-Undecl] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf("<< EEundecl \n");
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn
+					= exiEncodeEndElement(&oStream,
+							&stateEncode);
+			break;
+		case EXI_EVENT_CHARACTERS:
+			/* decode */
+			errn = exiDecodeCharacters(&iStream,
+					&stateDecode, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-CH] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			debugValue(&val);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeCharacters(&oStream,
+						&stateEncode, &val);
+
+			/* list value: special behavior */
+			if (val.type == EXI_DATATYPE_LIST) {
+				for(k=0; k<val.list.len; k++) {
+					errn = exiDecodeListValue(&iStream, &val, val.list);
+					if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+						printf("[Decode-ERROR-CH_LIST] %d \n", errn);
+#endif /*EXI_DEBUG*/
+						return errn;
+					}
+#if EXI_DEBUG == EXI_DEBUG_ON
+					debugValue(&val);
+#endif /*EXI_DEBUG*/
+					/* encode list value */
+					errn = exiEncodeListValue(&oStream,
+									&val, val.list);
+				}
+			}
+			break;
+		case EXI_EVENT_CHARACTERS_GENERIC:
+			/* decode */
+			errn = exiDecodeCharactersGeneric(&iStream,
+					&stateDecode, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-CHgen] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			debugValue(&val);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeCharacters(&oStream,
+					&stateEncode, &val);
+			break;
+		case EXI_EVENT_CHARACTERS_GENERIC_UNDECLARED:
+			/* decode */
+			errn = exiDecodeCharactersGenericUndeclared(
+					&iStream, &stateDecode, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-CHgenUndecl] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			debugValue(&val);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeCharacters(&oStream,
+					&stateEncode, &val);
+			break;
+		case EXI_EVENT_ATTRIBUTE:
+			/* decode */
+			errn = exiDecodeAttribute(&iStream, &stateDecode,
+					&eqn, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-AT] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			exiGetLocalName(&(stateDecode.nameTablePrepopulated),
+					&(stateDecode.nameTableRuntime), eqn.namespaceURI,
+					eqn.localPart, &localName);
+			exiGetUri(&(stateDecode.nameTablePrepopulated),
+					&(stateDecode.nameTableRuntime), eqn.namespaceURI,
+					&namespaceURI);
+			printf(" AT {%s}%s \n", namespaceURI, localName);
+			debugValue(&val);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeAttribute(&oStream, &stateEncode,
+					&eqn, &val);
+			break;
+		case EXI_EVENT_ATTRIBUTE_XSI_NIL:
+			/* decode */
+			errn = exiDecodeAttributeXsiNil(&iStream,
+					&stateDecode, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-AT-NIL] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf(" AT {xsi}nil == %i \n", val.boolean);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeAttributeXsiNil(&oStream,
+					&stateEncode, &val);
+			break;
+		case EXI_EVENT_ATTRIBUTE_XSI_TYPE:
+			/* decode */
+			errn = exiDecodeAttributeXsiType(&iStream,
+					&stateDecode, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-AT-TYPE] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			exiGetLocalName(&(stateDecode.nameTablePrepopulated),
+					&(stateDecode.nameTableRuntime), val.eqname.namespaceURI,
+					val.eqname.localPart, &localName);
+			exiGetUri(&(stateDecode.nameTablePrepopulated),
+					&(stateDecode.nameTableRuntime), val.eqname.namespaceURI,
+					&namespaceURI);
+			printf(" AT {type}type == {%s}%s \n", namespaceURI, localName);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeAttributeXsiType(&oStream,
+					&stateEncode, &val);
+			break;
+		case EXI_EVENT_ATTRIBUTE_GENERIC_UNDECLARED:
+			/* decode */
+			errn = exiDecodeAttributeGenericUndeclared(
+					&iStream, &stateDecode, &qn, &val);
+			if (errn < 0) {
+#if EXI_DEBUG == EXI_DEBUG_ON
+				printf("[Decode-ERROR-ATgenUnd] %d \n", errn);
+#endif /*EXI_DEBUG*/
+				return errn;
+			}
+#if EXI_DEBUG == EXI_DEBUG_ON
+			/* exiGetLocalName(&(stateDecode.nameTablePrepopulated), &(stateDecode.nameTableRuntime), eqn.namespaceURI, eqn.localPart, &localName);
+			 exiGetUri(&(stateDecode.nameTablePrepopulated), &(stateDecode.nameTableRuntime), eqn.namespaceURI, &namespaceURI); */
+			printf(" AT {%s}%s \n", qn.namespaceURI.chars, qn.localName.chars);
+			debugValue(&val);
+#endif /*EXI_DEBUG*/
+			/* encode */
+			errn = exiEncodeAttribute(&oStream, &stateEncode,
+					&eqn, &val);
+			break;
+		default:
+			/* ERROR */
+#if EXI_DEBUG == EXI_DEBUG_ON
+			printf("[Unknown-Event] %d \n", event);
+#endif /*EXI_DEBUG*/
+			return EXI_ERROR_UNKOWN_EVENT;
+		}
+
+	} while (noEndOfDocument);
+
+#if EXI_STREAM == BYTE_ARRAY
+	/* write to file */
+	writeBytesToFile(oStream.data, posEncode, argv[2]);
+#endif
+#if EXI_STREAM == FILE_STREAM
+	fclose(iStream.file);
+	fclose(oStream.file);
+#endif
+
+	return 0;
+}
+
+
+
+#if EXI_DEBUG == EXI_DEBUG_ON
+static void debugValue(exi_value_t* val) {
+	int i;
+	switch (val->type) {
+	case EXI_DATATYPE_INTEGER:
+		switch (val->integer.type) {
+		/* Unsigned Integer */
+		case EXI_UNSIGNED_INTEGER_8:
+			printf(" Value uint8 : %d \n", val->integer.val.uint8);
+			break;
+		case EXI_UNSIGNED_INTEGER_16:
+			printf(" Value uint16 : %d \n", val->integer.val.uint16);
+			break;
+		case EXI_UNSIGNED_INTEGER_32:
+			printf(" Value uint32 : %d \n", val->integer.val.uint32);
+			break;
+		case EXI_UNSIGNED_INTEGER_64:
+			printf(" Value uint64 : %ld \n",
+					(long unsigned int) val->integer.val.uint64);
+			break;
+			/* (Signed) Integer */
+		case EXI_INTEGER_8:
+			printf(" Value int8 : %d \n", val->integer.val.int8);
+			break;
+		case EXI_INTEGER_16:
+			printf(" Value int16 : %d \n", val->integer.val.int16);
+			break;
+		case EXI_INTEGER_32:
+			printf(" Value int32 : %d \n", val->integer.val.int32);
+			break;
+		case EXI_INTEGER_64:
+			printf(" Value int64 : %ld \n", (long int) val->integer.val.int64);
+			break;
+		}
+		break;
+	case EXI_DATATYPE_BINARY_BASE64:
+	case EXI_DATATYPE_BINARY_HEX:
+		printf(" Value Binary (len == %d) : ", val->binary.len);
+		for (i = 0; i < val->binary.len; i++) {
+			printf(" [%d]", val->binary.data[i]);
+		}
+		printf("\n");
+		break;
+	case EXI_DATATYPE_BOOLEAN:
+		printf(" Value Boolean : %d \n", val->boolean);
+		break;
+	case EXI_DATATYPE_STRING:
+		printf(" Value String (len==%d) : '", val->string.len);
+		for (i = 0; i < val->string.len; i++) {
+			printf("%c", (char) val->string.codepoints[i]);
+		}
+		printf("'\n");
+		break;
+	case EXI_DATATYPE_LIST:
+		printf(" Value List (len==%d) \n", val->list.len);
+		break;
+	default:
+		printf(" Value ?? \n");
+	}
+}
+#endif /*EXI_DEBUG*/
+

+ 1504 - 0
src/test/pev_service.c

@@ -0,0 +1,1504 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+/* includes of the 15118 messaging */
+#include "v2g_service.h"
+#include "v2g_serviceDataTypes.h"
+#include "v2g_serviceClientStubs.h"
+#include "EXITypes.h"
+
+/* includes for the application handshake protocol */
+#include "appHand_service.h"
+#include "appHand_dataTypes.h"
+
+
+
+/* includes V2GTP */
+#include "v2gtp.h"
+
+/* includes for example data transmitter */
+#include "v2g_serviceClientDataTransmitter.h"
+
+
+#include <stdio.h>
+
+#define MAX_BYTE_SIZE 128
+#define MAX_STRING_SIZE 256
+#define MAX_STREAM_SIZE 100
+
+
+static void printErrorMessage(struct EXIService* service);
+static void printDCEVSEStatus(struct DC_EVSEStatusType* status);
+static void printACEVSEStatus(struct AC_EVSEStatusType* status);
+static void printASCIIString(uint32_t* string, uint32_t len);
+static void printBinaryArray(uint8_t* byte, uint32_t len);
+static int writeStringToEXIString(char* string, uint32_t* exiString);
+
+/** Example implementation of the handshake protocol (EV side) */
+static int appHandshake()
+{
+	static uint8_t byte_array[MAX_BYTE_SIZE]; /* define MAX_BYTE_SIZE before*/
+	static uint32_t string_array[MAX_STRING_SIZE]; /* define MAX_STRING_SIZE before*/
+
+	/* define in and out byte stream */
+	uint8_t inStream[MAX_STREAM_SIZE]; /* define MAX_STREAM_SIZE before */
+	uint8_t outStream[MAX_STREAM_SIZE]; /* define MAX_STREAM_SIZE before */
+
+	/* BINARY memory setup */
+	bytes_t bytes = { MAX_BYTE_SIZE, byte_array, 0 };
+
+	/* STRING memory setup */
+	string_ucs_t string = { MAX_STRING_SIZE, string_array, 0 };
+
+	struct EXIDatabinder appHandService;
+	struct EXIDocumentType_appHand exiDoc;
+	struct AnonType_supportedAppProtocolReq handshake;
+	struct AnonType_supportedAppProtocolRes resultHandshake;
+	uint16_t length, payloadLength;
+
+	/* init the app handshake serializer.
+	 * Important: also provide the offset of the V2GTP header length */
+	init_appHandSerializer(&appHandService,bytes,string,MAX_STREAM_SIZE, V2GTP_HEADER_LENGTH);
+
+	init_EXIDocumentType_appHand(&exiDoc);
+
+	printf("EV side: setup data for the supported application handshake request message\n");
+
+	/* set up ISO/IEC 15118 Version 1.0 information */
+	length = writeStringToEXIString("urn:iso:15118:2:2010:MsgDef", handshake.AppProtocol[0].ProtocolNamespace.data);
+	handshake.AppProtocol[0].ProtocolNamespace.arraylen.data = length; /* length of the string */
+	handshake.AppProtocol[0].SchemaID=1;
+	handshake.AppProtocol[0].VersionNumberMajor=1;
+	handshake.AppProtocol[0].VersionNumberMinor=0;
+	handshake.AppProtocol[0].Priority=1;
+
+	handshake.arraylen.AppProtocol=1; /* we have only one protocol implemented */
+
+	/* assign handshake request structure to the exiDoc and signal it */
+	exiDoc.supportedAppProtocolReq = &handshake;
+	exiDoc.isused.supportedAppProtocolReq=1;
+
+	payloadLength=0;
+	if(serialize_appHand(&appHandService, outStream,&payloadLength, &exiDoc))
+	{
+
+		/* an error occured */
+		return -1;
+	}
+
+	printf("EV side: send message to the EVSE\n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, payloadLength+V2GTP_HEADER_LENGTH, inStream);
+
+	/* Init deserializer
+	 * Provide here also the offset of the transport protocol */
+	init_appHandDeserializer(&appHandService,bytes,string,V2GTP_HEADER_LENGTH);
+
+	/* setup the */
+	init_EXIDocumentType_appHand(&exiDoc);
+	exiDoc.supportedAppProtocolRes=&resultHandshake;
+	exiDoc.isused.supportedAppProtocolRes=1;
+
+	if(deserialize_appHand(&appHandService,inStream,100,&exiDoc))
+	{
+		/* an error occurred */
+		return -1;
+	}
+
+	printf("EV side: Response of the EVSE \n");
+	if(resultHandshake.ResponseCode==OK_SuccessfulNegotiation_responseCodeType)
+	{
+		printf("\t\tResponseCode=OK_SuccessfulNegotiation\n");
+		printf("\t\tSchemaID=%d\n",resultHandshake.SchemaID );
+	}
+
+	return 0;
+
+}
+
+static int ac_charging()
+{
+
+
+	static uint8_t byte_array[MAX_BYTE_SIZE]; /* define MAX_BYTE_SIZE before*/
+	static uint32_t string_array[MAX_STRING_SIZE]; /* define MAX_STRING_SIZE before*/
+
+	/* define in and out byte stream */
+	uint8_t inStream[MAX_STREAM_SIZE]; /* define MAX_STREAM_SIZE before */
+	uint8_t outStream[MAX_STREAM_SIZE]; /* define MAX_STREAM_SIZE before */
+
+
+
+	/* define offset variable for transport header data */
+	uint16_t transportHeaderOffset;
+
+
+	/* service data structure for AC*/
+	struct EXIService service;
+	struct MessageHeaderType v2gHeader;
+	struct SessionSetupReqType sessionSetup;
+	struct SessionSetupResType resultSessionSetup;
+	struct ServiceDiscoveryReqType serviceDiscovery;
+	struct ServiceDiscoveryResType resultServiceDiscovery;
+	struct ServicePaymentSelectionReqType servicePayment;
+	struct ServicePaymentSelectionResType resultServicePayment;
+	struct ChargeParameterDiscoveryReqType powerDiscovery;
+	struct ChargeParameterDiscoveryResType resultPowerDiscovery;
+	struct PowerDeliveryReqType powerDelivery;
+	struct PowerDeliveryResType resultPowerDelivery;
+	struct ChargingStatusResType resultChargingStatus;
+	struct MeteringReceiptReqType meteringReceipt;
+	struct MeteringReceiptResType resultMeteringReceipt;
+	struct SessionStopResType resultSessionStop;
+
+	struct AC_EVSEStatusType evseStatus;
+	struct AC_EVChargeParameterType EVChargeParameter;
+	struct AC_EVSEChargeParameterType evseChargeParameter;
+
+	struct SAScheduleListType scheduleInfo;
+	struct SalesTariffType sales;
+
+	struct PhysicalValueType float_type;
+
+	enum responseMessages resMsg;
+
+	uint32_t outPayloadLength;
+
+
+	/* BINARY memory setup */
+	bytes_t bytes = { MAX_BYTE_SIZE, byte_array, 0 };
+
+	/* STRING memory setup */
+	string_ucs_t string = { MAX_STRING_SIZE, string_array, 0 };
+
+	/* setup offset for DoIP header (otherwise set
+	 * transportHeaderOffset=0 if no transfer protocol is used)*/
+	transportHeaderOffset = V2GTP_HEADER_LENGTH;
+
+
+	/*******************
+	 * Init V2G Client *
+	 *******************/
+
+	init_v2gServiceClient(&service,bytes,string,inStream,MAX_STREAM_SIZE, outStream, MAX_STREAM_SIZE, &outPayloadLength, transportHeaderOffset);
+
+
+	/*******************************
+	 * Setup data for sessionSetup *
+	 *******************************/
+
+	/* setup header information */
+	v2gHeader.SessionID.data[0] = 0; /* sessionID is always '0' at the beginning (the response contains the valid sessionID)*/
+	v2gHeader.SessionID.data[1] = 0;
+	v2gHeader.SessionID.data[2] = 0;
+	v2gHeader.SessionID.data[3] = 0;
+	v2gHeader.SessionID.data[4] = 0;
+	v2gHeader.SessionID.data[5] = 0;
+	v2gHeader.SessionID.data[6] = 0;
+	v2gHeader.SessionID.data[7] = 0;
+	v2gHeader.SessionID.arraylen.data = 8; /* length of the byte session array is always 8*/
+
+	v2gHeader.isused.Notification=0; /* no notification */
+	v2gHeader.isused.Signature=0; /* no security */
+
+	/* setup sessionSetup parameter */
+	sessionSetup.EVCCID.data[0]=10;
+	sessionSetup.EVCCID.arraylen.data=1;
+
+
+	printf("EV side: prepare EVSE sessionSetup\n");
+
+	/************************
+	 * Prepare sessionSetup *
+	 ************************/
+
+	prepare_sessionSetup(&service,&v2gHeader, &sessionSetup,&resultSessionSetup);
+
+	printf("EV side: call EVSE sessionSetup\n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream */
+	if(	determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the sessionSetup response message */
+	if(resMsg==SESSIONSETUPRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup */
+		printf("EV side: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\tResponseCode=%d\n",resultSessionSetup.ResponseCode);
+		printf("\tEVSEID=%d\n",	resultSessionSetup.EVSEID.data[0]);
+		printf("\tDateTimeNow=%d\n",resultSessionSetup.DateTimeNow);
+	}
+
+	/*******************************************
+	 * Setup data for serviceDiscovery *
+	 *******************************************/
+
+	serviceDiscovery.isused.ServiceCategory=1;
+	serviceDiscovery.ServiceCategory = 	EVCharging_serviceCategoryType;
+	serviceDiscovery.isused.ServiceScope=0;
+
+
+	printf("\n\nEV side: prepare EVSE serviceDiscovery\n");
+
+	/****************************
+	 * Prepare serviceDiscovery *
+	 ****************************/
+
+	prepare_serviceDiscovery(&service,&v2gHeader, &serviceDiscovery,&resultServiceDiscovery);
+
+	printf("EV side: call EVSE serviceDiscovery\n ");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the serviceDiscovery response message */
+	if(resMsg==SERVICEDISCOVERYRES)
+	{
+		/* show result of the answer message of EVSE serviceDiscovery */
+		printf("EV side: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\t ResponseCode=%d\n",resultServiceDiscovery.ResponseCode);
+		printf("\t ServiceID=%d\n",	resultServiceDiscovery.ChargeService.ServiceTag.ServiceID);
+		printf("\t ServiceName=");
+		printASCIIString(resultServiceDiscovery.ChargeService.ServiceTag.ServiceName.data,(uint32_t)resultServiceDiscovery.ChargeService.ServiceTag.ServiceName.arraylen.data );
+		if(	resultServiceDiscovery.PaymentOptions.PaymentOption[0]==ExternalPayment_paymentOptionType)
+		printf("\t PaymentOption=ExternalPayment\n");
+		if(resultServiceDiscovery.ChargeService.EnergyTransferType==AC_single_DC_core_EVSESupportedEnergyTransferType)
+		printf("\t EnergyTransferType=AC_single_DC_core\n");
+		printf("\t Value added service list:\n");
+		printf("\t\t ServiceID=%d\n",	resultServiceDiscovery.ServiceList.Service[0].ServiceTag.ServiceID);
+		printf("\t\t ServiceName=");
+		printASCIIString(resultServiceDiscovery.ServiceList.Service[0].ServiceTag.ServiceName.data,(uint32_t)resultServiceDiscovery.ServiceList.Service[0].ServiceTag.ServiceName.arraylen.data );
+		if(resultServiceDiscovery.ServiceList.Service[0].ServiceTag.ServiceCategory==Internet_serviceCategoryType)
+		printf("\t\t ServiceCategory=Internet\n");
+
+	}
+
+
+	/*******************************************
+	 * Setup data for ServicePaymentSelection *
+	 *******************************************/
+
+	servicePayment.SelectedPaymentOption = ExternalPayment_paymentOptionType;
+	servicePayment.SelectedServiceList.SelectedService[0].ServiceID=1; /* charge server ID */
+	servicePayment.SelectedServiceList.SelectedService[0].isused.ParameterSetID=0; /* is not used */
+	servicePayment.SelectedServiceList.arraylen.SelectedService=1; /* only one service was selected */
+
+	printf("\n\nEV side: prepare EVSE servicePaymentSelection\n");
+
+	/***********************************
+	 * Prepare ServicePaymentSelection *
+	 ***********************************/
+
+	if(prepare_servicePaymentSelection(&service,&v2gHeader, &servicePayment,&resultServicePayment))
+	{
+		printErrorMessage(&service);
+		return 0;
+	}
+
+	printf("EV side: call EVSE ServicePaymentSelection \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the servicePaymentSelection response message */
+	if(resMsg==SERVICEPAYMENTSELECTIONRES)
+	{
+		/* show result of the answer message of EVSE servicePaymentSelection */
+		printf("EV side: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\t ResponseCode=%d\n",resultServicePayment.ResponseCode);
+	}
+
+
+
+
+
+
+
+	/*******************************************
+	 * Setup data for chargeParameterDiscovery *
+	 *******************************************/
+	printf("\n\nEV side: prepare EVSE chargeParameterDiscovery\n");
+
+	powerDiscovery.EVRequestedEnergyTransferType = AC_three_phase_core_EVRequestedEnergyTransferType;
+
+	EVChargeParameter.DepartureTime = 12345;
+
+	float_type.Multiplier = 0;
+	float_type.Unit = W_unitSymbolType;
+	float_type.isused.Unit=1;
+	float_type.Value = 100;
+
+	EVChargeParameter.EAmount = float_type;
+
+	float_type.Unit = A_unitSymbolType;
+	float_type.Value = 200;
+
+	EVChargeParameter.EVMaxCurrent= float_type;
+
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 400;
+
+	EVChargeParameter.EVMaxVoltage=float_type;
+
+	float_type.Unit = A_unitSymbolType;
+	float_type.Value = 500;
+
+	EVChargeParameter.EVMinCurrent=float_type;
+
+	powerDiscovery.AC_EVChargeParameter = &EVChargeParameter;
+	powerDiscovery.isused.AC_EVChargeParameter = 1; /* we use here DC based charging parameters */
+	powerDiscovery.isused.DC_EVChargeParameter = 0;
+
+	resultPowerDiscovery.AC_EVSEChargeParameter = &evseChargeParameter; /* we expect AC-based parameters from the evse*/
+	resultPowerDiscovery.SAScheduleList = &scheduleInfo; /* EVSE may send a schedule for us; should be always assigned here! */
+	resultPowerDiscovery.SAScheduleList->SAScheduleTuple[0].SalesTariff = &sales;
+
+	prepare_chargeParameterDiscovery(&service,&v2gHeader,&powerDiscovery,&resultPowerDiscovery);
+
+
+	printf("EV side: call EVSE chargeParameterDiscovery\n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the chargeParameterDiscovery response message */
+	if(resMsg==CHARGEPARAMETERDISCOVERYRES)
+
+	{
+
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\tResponseCode=%d\n",resultPowerDiscovery.ResponseCode);
+		printACEVSEStatus(&(resultPowerDiscovery.AC_EVSEChargeParameter->AC_EVSEStatus));
+
+		printf("\t EVSEMaxCurrent=%d\n",resultPowerDiscovery.AC_EVSEChargeParameter->EVSEMaxCurrent.Value);
+		printf("\t EVSEMaxVoltage=%d\n",resultPowerDiscovery.AC_EVSEChargeParameter->EVSEMaxVoltage.Value);
+		printf("\t EVSEMinimumCurrentLimit=%d\n",resultPowerDiscovery.AC_EVSEChargeParameter->EVSEMinCurrent.Value);
+	}
+
+
+	/*********************************
+	 * Setup data for powerDelivery *
+	 *********************************/
+
+	printf("\n\nEV side: prepare EVSE powerDelivery\n");
+
+	powerDelivery.ReadyToChargeState = 1;
+	powerDelivery.isused.ChargingProfile= 0;
+	powerDelivery.isused.DC_EVPowerDeliveryParameter=0; /* only used for DC charging */
+	resultPowerDelivery.AC_EVSEStatus = &evseStatus; /* we expect an evse status */
+
+	prepare_powerDelivery(&service,&v2gHeader,&powerDelivery,&resultPowerDelivery);
+
+	printf("EV side: call EVSE powerDelivery \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the powerDelivery response message */
+	if(resMsg==POWERDELIVERYRES)
+	{
+
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		printf("\tResponseCode=%d\n",resultPowerDelivery.ResponseCode);
+		printACEVSEStatus(&evseStatus);
+	}
+
+
+	/*********************************
+	 * Setup data for chargingStatus *
+	 *********************************/
+
+	printf("\n\nEV side: prepare EVSE chargingStatus\n");
+
+	/***************************
+	 * Prepare chargingStatus  *
+	 ***************************/
+
+	if(prepare_chargingStatus(&service,&v2gHeader,&resultChargingStatus))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE chargingStatus \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the chargingStatus response message */
+	if(resMsg==CHARGINGSTATUSRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultSessionStop.ResponseCode);
+		printACEVSEStatus(&evseStatus);
+		printf("\tReceiptRequired=%d\n",resultChargingStatus.ReceiptRequired);
+		printf("\tSAScheduleTupleID=%d\n",resultChargingStatus.SAScheduleTupleID);
+		printf("\tEVSEID=%d\n",resultChargingStatus.EVSEID.data[0]);
+		printf("\tEVSEMaxCurrent=%d\n",resultChargingStatus.EVSEMaxCurrent.Value);
+		printf("\tisused.MeterInfo=%d\n",		resultChargingStatus.isused.MeterInfo);
+		printf("\t\tMeterInfo.MeterID=%d\n",		resultChargingStatus.MeterInfo.MeterID.data[0]);
+		printf("\t\tMeterInfo.MeterReading.Value=%d\n",		resultChargingStatus.MeterInfo.MeterReading.Value);
+		printf("\t\tMeterInfo.MeterStatus=%d\n",		resultChargingStatus.MeterInfo.MeterStatus);
+		printf("\t\tMeterInfo.TMeter=%d\n",		resultChargingStatus.MeterInfo.TMeter);
+	}
+
+
+
+
+
+
+	/***********************************
+	 * Setup data for meteringReceipt *
+	 ***********************************/
+
+
+	meteringReceipt.SessionID = v2gHeader.SessionID;
+	meteringReceipt.SAScheduleTupleID = 12;
+	meteringReceipt.isused.SAScheduleTupleID=1;
+	meteringReceipt.MeterInfo.MeterStatus = 2;
+	meteringReceipt.MeterInfo.isused.MeterStatus = 1;
+	meteringReceipt.MeterInfo.MeterID.arraylen.data=1;
+	meteringReceipt.MeterInfo.MeterID.data[0]=3;
+
+	meteringReceipt.MeterInfo.MeterReading.Multiplier = 0;
+	meteringReceipt.MeterInfo.MeterReading.Unit = A_unitSymbolType;
+	meteringReceipt.MeterInfo.MeterReading.Value = 100;
+	meteringReceipt.MeterInfo.isused.MeterReading = 1;
+	meteringReceipt.MeterInfo.isused.SigMeterReading = 0;
+
+	meteringReceipt.MeterInfo.TMeter =123456789;
+	meteringReceipt.MeterInfo.isused.TMeter = 1;
+
+	meteringReceipt.isused.attr_Id=0; /* message is not signed */
+
+	printf("\n\nEV side: prepare EVSE meteringReceipt\n");
+
+	/****************************
+	 * Prepare meteringReceipt  *
+	 ****************************/
+
+	if(prepare_meteringReceipt(&service,&v2gHeader,&meteringReceipt,&resultMeteringReceipt))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE meteringReceipt \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the meteringReceipt response message */
+	if(resMsg==METERINGRECEIPTRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultSessionStop.ResponseCode);
+		printACEVSEStatus(&evseStatus);
+	}
+
+
+	/***********************************
+	 * Setup data for stopSession *
+	 ***********************************/
+
+	printf("\n\nEV side: prepare EVSE stopSession\n");
+
+	/************************
+	 * Prepare stopSession  *
+	 ************************/
+
+	if(prepare_sessionStop(&service,&v2gHeader,&resultSessionStop))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE stopSession \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the stopSession response message */
+	if(resMsg==SESSIONSTOPRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultSessionStop.ResponseCode);
+	}
+
+
+	return 0;
+}
+
+static int dc_charging()
+{
+
+
+
+	static uint8_t byte_array[MAX_BYTE_SIZE]; /* define MAX_BYTE_SIZE before*/
+	static uint32_t string_array[MAX_STRING_SIZE]; /* define MAX_STRING_SIZE before*/
+
+	/* define in and out byte stream */
+	uint8_t inStream[MAX_STREAM_SIZE]; /* define MAX_STREAM_SIZE before */
+	uint8_t outStream[MAX_STREAM_SIZE]; /* define MAX_STREAM_SIZE before */
+
+
+
+	/* define offset variable for transport header data */
+	uint16_t transportHeaderOffset;
+
+
+	/* service data structure for DC*/
+	struct EXIService service;
+	struct MessageHeaderType v2gHeader;
+	struct SessionSetupReqType sessionSetup;
+	struct SessionSetupResType resultSessionSetup;
+	struct ServiceDiscoveryReqType serviceDiscovery;
+	struct ServiceDiscoveryResType resultServiceDiscovery;
+	struct ServicePaymentSelectionReqType servicePayment;
+	struct ServicePaymentSelectionResType resultServicePayment;
+	struct ChargeParameterDiscoveryReqType powerDiscovery;
+	struct ChargeParameterDiscoveryResType resultPowerDiscovery;
+	struct CableCheckReqType cableCheck;
+	struct CableCheckResType resultCableCheck;
+	struct PowerDeliveryReqType powerDelivery;
+	struct PowerDeliveryResType resultPowerDelivery;
+	struct PreChargeReqType preCharge;
+	struct PreChargeResType resultPreCharge;
+	struct CurrentDemandReqType currentDemand;
+	struct CurrentDemandResType resultCurrentDemand;
+	struct WeldingDetectionReqType weldingDetection;
+	struct WeldingDetectionResType resultWeldingDetection;
+	struct SessionStopResType resultSessionStop;
+
+	struct DC_EVStatusType EVStatus;
+	struct DC_EVSEStatusType evseStatus;
+	struct DC_EVChargeParameterType EVChargeParameter;
+	struct DC_EVSEChargeParameterType evseChargeParameter;
+	struct DC_EVPowerDeliveryParameterType EVPowerDelivery;
+
+	struct SAScheduleListType pmaxScheduleList;
+
+	enum responseMessages resMsg;
+
+	struct PhysicalValueType float_type;
+
+	uint32_t outPayloadLength;
+
+
+	size_t i, j;
+
+	/* BINARY memory setup */
+	bytes_t bytes = { MAX_BYTE_SIZE, byte_array, 0 };
+
+	/* STRING memory setup */
+	string_ucs_t string = { MAX_STRING_SIZE, string_array, 0 };
+
+	/* setup offset for DoIP header (otherwise set
+	 * transportHeaderOffset=0 if no transfer protocol is used)*/
+	transportHeaderOffset = V2GTP_HEADER_LENGTH;
+
+
+
+
+	/*******************
+	 * Init V2G Client *
+	 *******************/
+
+	init_v2gServiceClient(&service,bytes,string,inStream,MAX_STREAM_SIZE, outStream, MAX_STREAM_SIZE, &outPayloadLength, transportHeaderOffset);
+
+
+	/*******************************
+	 * Setup data for sessionSetup *
+	 *******************************/
+
+	/* setup header information */
+	v2gHeader.SessionID.data[0] = 0; /* sessionID is always '0' at the beginning (the response message contains the valid sessionID)*/
+	v2gHeader.SessionID.data[1] = 0;
+	v2gHeader.SessionID.data[2] = 0;
+	v2gHeader.SessionID.data[3] = 0;
+	v2gHeader.SessionID.data[4] = 0;
+	v2gHeader.SessionID.data[5] = 0;
+	v2gHeader.SessionID.data[6] = 0;
+	v2gHeader.SessionID.data[7] = 0;
+	v2gHeader.SessionID.arraylen.data = 8; /* length of the byte session array is always 8*/
+
+	v2gHeader.isused.Notification=0; /* no notification */
+	v2gHeader.isused.Signature=0; /* no security */
+
+	/* setup sessionSetup parameter */
+	sessionSetup.EVCCID.data[0]=10;
+	sessionSetup.EVCCID.arraylen.data=1;
+
+	printf("EV side: prepare EVSE sessionSetup\n");
+
+	/************************
+	 * Prepare sessionSetup *
+	 ************************/
+
+	prepare_sessionSetup(&service,&v2gHeader, &sessionSetup,&resultSessionSetup);
+
+	printf("EV side: call EVSE sessionSetup\n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the sessionSetup response message */
+	if(resMsg==SESSIONSETUPRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup */
+		printf("EV: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\tResponseCode=%d\n",resultSessionSetup.ResponseCode);
+		printf("\tEVSEID=%d\n",	resultSessionSetup.EVSEID.data[0]);
+		printf("\tDateTimeNow=%d\n",resultSessionSetup.DateTimeNow);
+	}
+
+	/*******************************************
+	 * Setup data for serviceDiscovery *
+	 *******************************************/
+
+	serviceDiscovery.isused.ServiceCategory=1;
+	serviceDiscovery.ServiceCategory = 	EVCharging_serviceCategoryType;
+	serviceDiscovery.isused.ServiceScope=0;
+
+
+	printf("\n\nEV side: prepare EVSE serviceDiscovery\n");
+
+	/****************************
+	 * Prepare serviceDiscovery *
+	 ****************************/
+
+	prepare_serviceDiscovery(&service,&v2gHeader, &serviceDiscovery,&resultServiceDiscovery);
+
+	printf("EV side: call EVSE serviceDiscovery \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the serviceDiscovery response message */
+	if(resMsg==SERVICEDISCOVERYRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup */
+		printf("\nEV side: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\t ResponseCode=%d\n",resultServiceDiscovery.ResponseCode);
+		printf("\t ServiceID=%d\n",	resultServiceDiscovery.ChargeService.ServiceTag.ServiceID);
+		printf("\t ServiceName=");
+		printASCIIString(resultServiceDiscovery.ChargeService.ServiceTag.ServiceName.data,(uint32_t)resultServiceDiscovery.ChargeService.ServiceTag.ServiceName.arraylen.data );
+		if(	resultServiceDiscovery.PaymentOptions.PaymentOption[0]==ExternalPayment_paymentOptionType)
+		printf("\t PaymentOption=ExternalPayment\n");
+		if(resultServiceDiscovery.ChargeService.EnergyTransferType==AC_single_DC_core_EVSESupportedEnergyTransferType)
+		printf("\t EnergyTransferType=AC_single_DC_core\n");
+	}
+
+
+	/*******************************************
+	 * Setup data for ServicePaymentSelection *
+	 *******************************************/
+
+	servicePayment.SelectedPaymentOption = ExternalPayment_paymentOptionType;
+	servicePayment.SelectedServiceList.SelectedService[0].ServiceID=1; /* charge server ID */
+	servicePayment.SelectedServiceList.SelectedService[0].isused.ParameterSetID=0; /* is not used */
+	servicePayment.SelectedServiceList.arraylen.SelectedService=1; /* only one service was selected */
+
+	printf("\n\nEV side: prepare EVSE servicePaymentSelection\n");
+
+	/**************************************
+	 * Prepare ServicePaymentSelection *
+	 **************************************/
+
+	if(prepare_servicePaymentSelection(&service,&v2gHeader, &servicePayment,&resultServicePayment))
+	{
+		printErrorMessage(&service);
+		return 0;
+	}
+
+	printf("EV side: call EVSE ServicePaymentSelection \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the servicePaymentSelection response message */
+	if(resMsg==SERVICEPAYMENTSELECTIONRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup */
+		printf("EV: received response message from EVSE\n");
+		printf("\tHeader SessionID=");
+		printBinaryArray(v2gHeader.SessionID.data,v2gHeader.SessionID.arraylen.data );
+		printf("\t ResponseCode=%d\n",resultServicePayment.ResponseCode);
+	}
+
+
+
+	/*******************************************
+	 * Setup data for chargeParameterDiscovery *
+	 *******************************************/
+
+	/* setup EVStatus */
+
+	EVStatus.EVRESSSOC = 89;
+	EVStatus.EVReady = 1;
+	EVStatus.EVCabinConditioning = 1;
+	EVStatus.EVRESSConditioning = 1;
+	EVStatus.isused.EVCabinConditioning=1;
+	EVStatus.isused.EVRESSConditioning=1;
+	EVStatus.EVErrorCode = NO_ERROR_DC_EVErrorCodeType;
+
+	EVChargeParameter.DC_EVStatus = EVStatus;
+
+
+	float_type.Multiplier = 0;
+	float_type.Unit = A_unitSymbolType;
+	float_type.isused.Unit=1;
+	float_type.Value = 60;
+
+	EVChargeParameter.EVMaximumCurrentLimit = float_type;
+
+	float_type.Unit = W_unitSymbolType;
+	float_type.Value = 20000;
+
+	EVChargeParameter.EVMaximumPowerLimit = float_type;
+	EVChargeParameter.isused.EVMaximumPowerLimit = 1;
+
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 420;
+
+	EVChargeParameter.EVMaximumVoltageLimit= float_type;
+
+	float_type.Unit = W_s_unitSymbolType;
+	float_type.Value = 15000;
+
+	EVChargeParameter.EVEnergyCapacity= float_type;
+	EVChargeParameter.isused.EVEnergyCapacity = 1;
+
+	float_type.Unit = W_s_unitSymbolType;
+	float_type.Value = 5000;
+
+	EVChargeParameter.EVEnergyRequest= float_type;
+	EVChargeParameter.isused.EVEnergyRequest = 1;
+
+	EVChargeParameter.FullSOC=99;
+	EVChargeParameter.isused.FullSOC = 1;
+
+	EVChargeParameter.BulkSOC=80;
+	EVChargeParameter.isused.BulkSOC = 1;
+
+	powerDiscovery.EVRequestedEnergyTransferType = DC_combo_core_EVRequestedEnergyTransferType;
+
+	powerDiscovery.DC_EVChargeParameter = &EVChargeParameter;
+	powerDiscovery.isused.DC_EVChargeParameter = 1; /* we use here DC based charging parameters */
+	powerDiscovery.isused.AC_EVChargeParameter = 0;
+
+	resultPowerDiscovery.DC_EVSEChargeParameter = &evseChargeParameter; /* we expect DC-based parameters from the evse*/
+
+	resultPowerDiscovery.SAScheduleList = &pmaxScheduleList; /* the EVSE can provide some PMax information; should be always assign here! */
+
+
+	printf("\n\nEV side: prepare EVSE chargeParameterDiscovery\n");
+
+	/************************************
+	 * Prepare chargeParameterDiscovery *
+	 ************************************/
+
+	if(prepare_chargeParameterDiscovery(&service,&v2gHeader, &powerDiscovery,&resultPowerDiscovery))
+	{
+		printErrorMessage(&service);
+		return 0;
+	}
+
+	printf("EV side: call EVSE chargeParameterDiscovery \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the chargeParameterDiscovery response message */
+	if(resMsg==CHARGEPARAMETERDISCOVERYRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("\nEV side: received response message from EVSE\n");
+		printf("\t\t Header SessionID=%d\n",v2gHeader.SessionID.data[0]);
+		printf("\tResponseCode=%d\n",resultPowerDiscovery.ResponseCode);
+		printDCEVSEStatus(&(resultPowerDiscovery.DC_EVSEChargeParameter->DC_EVSEStatus));
+		printf("\tEVSEMaximumCurrentLimit=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEMaximumCurrentLimit.Value);
+		printf("\tEVSEMaximumPowerLimit=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEMaximumPowerLimit.Value);
+		printf("\tEVSEMaximumVoltageLimit=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEMaximumVoltageLimit.Value);
+		printf("\tEVSEMinimumCurrentLimit=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEMinimumCurrentLimit.Value);
+
+		printf("\tEVSEMinimumVoltageLimit=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEMinimumVoltageLimit.Value);
+		printf("\tEVSECurrentRegulationTolerance=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSECurrentRegulationTolerance.Value);
+		printf("\tEVSEPeakCurrentRipple=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEPeakCurrentRipple.Value);
+		printf("\tEVSEEnergyToBeDelivered=%d\n",resultPowerDiscovery.DC_EVSEChargeParameter->EVSEEnergyToBeDelivered.Value);
+
+		/* show PMax schedule, if there one provided  */
+		if(resultPowerDiscovery.isused.SAScheduleList)
+		{
+			printf("\tSAScheduleList: \n");
+
+			for(i=0; i< pmaxScheduleList.arraylen.SAScheduleTuple;i++)
+			{
+				printf("\t\t Tuple#%d: \n",(i+1));
+				printf("\t\t SAScheduleTupleID=%d: \n", pmaxScheduleList.SAScheduleTuple[i].SAScheduleTupleID);
+				printf("\t\t PMaxScheduleID=%d: \n",pmaxScheduleList.SAScheduleTuple[i].PMaxSchedule.PMaxScheduleID);
+
+				for(j=0; j< pmaxScheduleList.SAScheduleTuple[i].PMaxSchedule.arraylen.PMaxScheduleEntry;j++)
+				{
+					printf("\t\t\t Entry#%d: \n",(j+1));
+					printf("\t\t\t\t PMax=%d \n",pmaxScheduleList.SAScheduleTuple[i].PMaxSchedule.PMaxScheduleEntry[j].PMax);
+					printf("\t\t\t\t Start=%d \n",pmaxScheduleList.SAScheduleTuple[i].PMaxSchedule.PMaxScheduleEntry[j].RelativeTimeInterval.start);
+					if(pmaxScheduleList.SAScheduleTuple[i].PMaxSchedule.PMaxScheduleEntry[j].RelativeTimeInterval.isused.duration)
+						printf("\t\t\t\t Duration=%d \n",pmaxScheduleList.SAScheduleTuple[i].PMaxSchedule.PMaxScheduleEntry[j].RelativeTimeInterval.duration);
+				}
+			}
+		}
+	}
+
+
+
+
+	/*****************************
+	 * Setup data for cableCheck *
+	 *****************************/
+
+	/* setup EVStatus */
+	cableCheck.DC_EVStatus =EVStatus;
+
+
+	printf("\n\nEV side: prepare EVSE cableCheck\n");
+
+	/**********************
+	 * Prepare cableCheck *
+	 **********************/
+
+	if(prepare_cableCheck(&service,&v2gHeader,&cableCheck,&resultCableCheck))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE cableCheck \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the cableCheck response message */
+	if(resMsg==CABLECHECKRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		printf("\t\t Header SessionID=%d\n",v2gHeader.SessionID.data[0]);
+		printf("\tResponseCode=%d\n",resultCableCheck.ResponseCode);
+		printDCEVSEStatus(&(resultCableCheck.DC_EVSEStatus));
+	}
+
+
+	/*****************************
+	 * Setup data for preCharge  *
+	 *****************************/
+
+	/* setup EVStatus */
+	preCharge.DC_EVStatus =EVStatus;
+
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 100;
+	preCharge.EVTargetCurrent = float_type;
+
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 200;
+	preCharge.EVTargetVoltage = float_type;
+
+	printf("\n\nEV side: prepare EVSE preCharge\n");
+
+	/**********************
+	 * Prepare preCharge  *
+	 **********************/
+
+	if(prepare_preCharge(&service,&v2gHeader,&preCharge,&resultPreCharge))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE preCharge \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the preCharge response message */
+	if(resMsg==PRECHARGERES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultPreCharge.ResponseCode);
+		printDCEVSEStatus(&resultPreCharge.DC_EVSEStatus);
+		printf("\tEVSEPresentVoltage=%d\n",resultPreCharge.EVSEPresentVoltage.Value);
+	}
+
+
+
+	/*********************************
+	 * Setup data for powerDelivery *
+	 *********************************/
+
+	powerDelivery.ReadyToChargeState = 1;
+
+	EVPowerDelivery.DC_EVStatus = EVStatus;
+	EVPowerDelivery.BulkChargingComplete = 1;
+	EVPowerDelivery.isused.BulkChargingComplete = 1;
+	EVPowerDelivery.ChargingComplete = 0;
+
+	powerDelivery.DC_EVPowerDeliveryParameter = &EVPowerDelivery;
+	powerDelivery.isused.DC_EVPowerDeliveryParameter = 1; /* DC parameters are send */
+
+
+	/* we are using a charging profile */
+	powerDelivery.isused.ChargingProfile=1;
+	powerDelivery.ChargingProfile.SAScheduleTupleID = pmaxScheduleList.SAScheduleTuple[0].SAScheduleTupleID;
+
+	/* set up 3 entries */
+	powerDelivery.ChargingProfile.ProfileEntry[0].ChargingProfileEntryMaxPower=0;
+	powerDelivery.ChargingProfile.ProfileEntry[0].ChargingProfileEntryStart=0;
+	powerDelivery.ChargingProfile.ProfileEntry[1].ChargingProfileEntryMaxPower=20000;
+	powerDelivery.ChargingProfile.ProfileEntry[1].ChargingProfileEntryStart=300; /* 5min */
+	powerDelivery.ChargingProfile.ProfileEntry[2].ChargingProfileEntryMaxPower=0;
+	powerDelivery.ChargingProfile.ProfileEntry[2].ChargingProfileEntryStart=1200; /* 20min */
+	powerDelivery.ChargingProfile.arraylen.ProfileEntry=3;
+
+
+
+	resultPowerDelivery.DC_EVSEStatus = &evseStatus; /* we expect the DC-based EVSE status */
+
+	printf("\n\nEV side: prepare EVSE powerDelivery\n");
+
+
+	/**************************
+	 * Prepare powerDelivery  *
+	 **************************/
+
+	if(prepare_powerDelivery(&service,&v2gHeader,&powerDelivery,&resultPowerDelivery))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE powerDelivery \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the powerDelivery response message */
+	if(resMsg==POWERDELIVERYRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("\nEV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultPreCharge.ResponseCode);
+		printDCEVSEStatus(&resultPreCharge.DC_EVSEStatus);
+	}
+
+
+
+
+
+	/*********************************
+	 * Setup data for currentDemand *
+	 *********************************/
+
+	currentDemand.DC_EVStatus = EVStatus;
+
+	float_type.Unit = A_unitSymbolType;
+	float_type.Value = 100;
+
+	currentDemand.EVTargetCurrent = float_type;
+
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 420;
+
+	currentDemand.EVMaximumVoltageLimit = float_type;
+	currentDemand.isused.EVMaximumVoltageLimit = 1;
+
+	float_type.Unit = W_unitSymbolType;
+	float_type.Value = 20000;
+
+	currentDemand.EVMaximumPowerLimit = float_type;
+	currentDemand.isused.EVMaximumPowerLimit = 1;
+
+	float_type.Unit = A_unitSymbolType;
+	float_type.Value = 60;
+
+	currentDemand.EVMaximumCurrentLimit = float_type;
+	currentDemand.isused.EVMaximumCurrentLimit = 1;
+
+	currentDemand.BulkChargingComplete = 0;
+	currentDemand.isused.BulkChargingComplete = 1;
+
+	currentDemand.ChargingComplete = 0;
+
+	float_type.Unit = s_unitSymbolType;
+	float_type.Value = 300; /* 5 min*/
+
+	currentDemand.RemainingTimeToFullSoC = float_type;
+	currentDemand.isused.RemainingTimeToFullSoC = 1;
+
+	float_type.Unit = s_unitSymbolType;
+	float_type.Value = 120; /* 3 min */
+
+	currentDemand.RemainingTimeToBulkSoC = float_type;
+	currentDemand.isused.RemainingTimeToBulkSoC = 1;
+
+
+	float_type.Unit = V_unitSymbolType;
+	float_type.Value = 400;
+
+	currentDemand.EVTargetVoltage = float_type;
+
+
+	printf("\n\nEV side: prepare EVSE currentDemand\n");
+
+	/**************************
+	 * Prepare currentDemand  *
+	 **************************/
+
+	if(prepare_currentDemand(&service,&v2gHeader,&currentDemand,&resultCurrentDemand))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE currentDemand \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the sessionSetup response message */
+	if(resMsg==CURRENTDEMANDRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("\nEV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultCurrentDemand.ResponseCode);
+		printDCEVSEStatus(&resultCurrentDemand.DC_EVSEStatus);
+		printf("\t EVSEPresentVoltage=%d\n",resultCurrentDemand.EVSEPresentVoltage.Value);
+		printf("\t EVSEPresentCurrent=%d\n",resultCurrentDemand.EVSEPresentCurrent.Value);
+		printf("\t EVSECurrentLimitAchieved=%d\n",resultCurrentDemand.EVSECurrentLimitAchieved);
+		printf("\t EVSEVoltageLimitAchieved=%d\n",resultCurrentDemand.EVSEVoltageLimitAchieved);
+
+		printf("\t EVSEPowerLimitAchieved=%d\n",resultCurrentDemand.EVSEPowerLimitAchieved);
+		printf("\t EVSEMaximumVoltageLimit=%d\n",resultCurrentDemand.EVSEMaximumVoltageLimit.Value);
+		printf("\t EVSEMaximumCurrentLimit=%d\n",resultCurrentDemand.EVSEMaximumCurrentLimit.Value);
+		printf("\t EVSEMaximumPowerLimit=%d\n",resultCurrentDemand.EVSEMaximumPowerLimit.Value);
+	}
+
+
+
+
+
+
+	/***********************************
+	 * Setup data for weldingDetection *
+	 ***********************************/
+
+	weldingDetection.DC_EVStatus =EVStatus;
+
+
+
+	printf("\n\nEV side: prepare EVSE weldingDetection\n");
+
+	/**************************
+	 * Prepare weldingDetection  *
+	 **************************/
+
+	if(prepare_weldingDetection(&service,&v2gHeader,&weldingDetection,&resultWeldingDetection))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE weldingDetection \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the sessionSetup response message */
+	if(resMsg==WELDINGDETECTIONRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultCurrentDemand.ResponseCode);
+		printDCEVSEStatus(&resultCurrentDemand.DC_EVSEStatus);
+		printf("\tEVSEPresentVoltage=%d\n",resultWeldingDetection.EVSEPresentVoltage.Value);
+	}
+
+
+
+
+
+	/***********************************
+	 * Setup data for stopSession *
+	 ***********************************/
+
+	printf("\n\nEV side: prepare EVSE stopSession\n");
+
+	/************************
+	 * Prepare stopSession  *
+	 ************************/
+
+	if(prepare_sessionStop(&service,&v2gHeader,&resultSessionStop))
+	{
+		printErrorMessage(&service);
+		return 0; /* stop here */
+	}
+
+	printf("EV side: call EVSE stopSession \n");
+
+	/* Use here your sending / receiving mechanism to / from the EVSE. The following serviceDataTransmitter method
+	 * is only an exemplary implementation which also shows how to add the V2GTP header information to
+	 * the output stream.
+	 * */
+
+	serviceDataTransmitter(outStream, outPayloadLength, inStream);
+
+	/* this methods deserialize the response EXI stream and determines the kind of
+	 * the response message */
+	if(determineResponseMesssage(&service, &resMsg))
+	{
+		printErrorMessage(&service);
+	}
+
+	/* check, if this is the sessionSetup response message */
+	if(resMsg==SESSIONSTOPRES)
+	{
+		/* show result of the answer message of EVSE sessionSetup*/
+		printf("EV side: received response message from EVSE\n");
+		/* show result of the answer message of EVSE powerDiscovery*/
+		printf("\tResponseCode=%d\n",resultCurrentDemand.ResponseCode);
+	}
+
+
+	return 0;
+}
+
+
+
+int main()
+{
+	printf("+++ Start application handshake protocol example +++\n\n");
+
+	appHandshake();
+
+	printf("+++ Terminate application handshake protocol example +++\n\n");
+
+	printf("\n\nPlease press enter for AC charging!\n");
+	fflush(stdout);
+	 getchar();
+	printf("+++ Start V2G client / service example for AC charging +++\n\n");
+
+	 ac_charging();
+
+	printf("\n+++Terminate V2G Client / Service example for AC charging +++\n");
+	printf("Please press enter for DC charging!\n");
+	fflush(stdout);
+	getchar();
+
+	printf("+++ Start V2G client / service example for DC charging +++\n\n");
+
+	dc_charging();
+
+	printf("\n+++Terminate V2G client / service example for DC charging +++");
+
+	return 0;
+}
+
+static void printACEVSEStatus(struct AC_EVSEStatusType* status)
+{
+	printf("\tEVSEStatus:\n");
+	printf("\t\tPowerSwitchClosed=%d\n",status->PowerSwitchClosed);
+	printf("\t\tRCD=%d\n",status->RCD);
+	printf("\t\tShutDownTime=%d\n",status->ShutDownTime);
+	printf("\t\tStopCharging=%d\n",status->StopCharging);
+}
+
+static void printDCEVSEStatus(struct DC_EVSEStatusType* status)
+{
+	if(status->isused.EVSEIsolationStatus)
+		printf("\tEVSEStatus:\n\t\tEVSEIsolationStatus=%d\n",status->EVSEIsolationStatus);
+
+	printf("\t\tEVSEStatusCode=%d\n",status->EVSEStatusCode);
+
+}
+
+static void printErrorMessage(struct EXIService* service)
+{
+	if(service->errorCode==EXI_NON_VALID_MESSAGE)
+	{
+		printf("EV did not send a valid V2G message!\n");
+	}
+	else if(service->errorCode==EXI_SERIALIZATION_FAILED)
+	{
+		printf("EVSE error: Could not serialize the response message\n");
+	} 	else if(service->errorCode==EXI_SERIALIZATION_FAILED)
+	{
+		printf("EVSE error: Could not serialize the response message\n");
+	}
+}
+
+static void printASCIIString(uint32_t* string, uint32_t len) {
+	unsigned int i;
+	for(i=0; i<len; i++) {
+		printf("%c",(char)string[i]);
+	}
+	printf("\n");
+}
+
+static void printBinaryArray(uint8_t* byte, uint32_t len) {
+	unsigned int i;
+	for(i=0; i<len; i++) {
+		printf("%d ",byte[i]);
+	}
+	printf("\n");
+}
+
+static int writeStringToEXIString(char* string, uint32_t* exiString)
+{
+
+	int pos=0;
+	while(string[pos]!='\0')
+	{
+		exiString[pos] = string[pos];
+		pos++;
+	}
+
+	return pos;
+}
+

+ 49 - 0
src/test/serviceClientDataTransmitter.c

@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @@version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#include "v2g_serviceClientDataTransmitter.h"
+#include "evse_server.h"
+#include "v2gtp.h"
+
+/*
+ * Send EXI stream (outStream) to EVSE and receive a response stream (inStream)*/
+int serviceDataTransmitter(uint8_t* outStream, uint16_t outStreamLength, uint8_t* inStream)
+{
+	/* send output stream to the underlying network to the EVSE and wait for response
+	 * --> here provide data to the V2G server directly*/
+
+	uint16_t inStreamLength = 0;
+	uint16_t payloadLength = 0;
+
+	/* setup v2gtp header information; outStreamLength==payloadLength*/
+	write_v2gtpHeader(outStream,&outStreamLength,V2GTP_EXI_TYPE);
+
+	/* send data to EVSE server (add v2g offset)*/
+	testV2GService(outStream, outStreamLength, inStream, &inStreamLength);
+
+
+
+	return 	read_v2gtpHeader(inStream,inStreamLength, &payloadLength);;
+}

+ 44 - 0
src/test/v2g_serviceClientDataTransmitter.h

@@ -0,0 +1,44 @@
+
+/*
+ * Copyright (C) 2007-2010 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2G_SERVICECLIENTDATATRANSMITTER_H_
+#define V2G_SERVICECLIENTDATATRANSMITTER_H_
+
+#include "EXITypes.h"
+
+/* This method has to be implemented!
+ * This method sends EXI stream (outStream) to the EVSE and receives response stream (inStream)*/
+int serviceDataTransmitter(uint8_t* outStream, uint16_t outStreamLength, uint8_t* inStream);
+
+#endif /* V2G_SERVICECLIENTDATATRANSMITTER_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 97 - 0
src/transport/v2gtp.c

@@ -0,0 +1,97 @@
+
+/*
+ * Copyright (C) 2007-2012 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+/*
+ * This file implements the v2gtp header writer and reader.
+ *
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#include "v2gtp.h"
+
+
+int write_v2gtpHeader(uint8_t* outStream, uint16_t* outStreamLength, uint16_t payloadType)
+{
+
+	/* write v2gtp version number 1=byte */
+	outStream[0]=V2GTP_VERSION;
+
+	/* write inverse v2gtp version */
+	outStream[1]=V2GTP_VERSION_INV;
+
+
+	/* write payload type */
+	outStream[3] = (uint8_t)(payloadType & 0xFF);
+	outStream[2] = (uint8_t)(payloadType >> 8 & 0xFF);
+
+	/* write payload length */
+	outStream[7] = (uint8_t)(*outStreamLength & 0xFF);
+	outStream[6] = (uint8_t)(*outStreamLength>>8 & 0xFF);
+	outStream[5] = (uint8_t)(*outStreamLength>>16 & 0xFF);
+	outStream[4] = (uint8_t)(*outStreamLength>>24 & 0xFF);
+
+	/* here, the outStream length have to be resized by the v2gtp offset*/
+	*outStreamLength += V2GTP_HEADER_LENGTH;
+
+	return 0;
+}
+
+int read_v2gtpHeader(uint8_t* inStream, uint16_t inStreamLength, uint16_t* payloadLength)
+{
+	uint16_t payloadType=0;
+
+
+	/* check, if we support this v2gtp version */
+	if(inStream[0]!=V2GTP_VERSION && inStream[1]!=V2GTP_VERSION_INV)
+		return -1;
+
+
+	/* check, if we support this payload type*/
+	payloadType = inStream[2];
+	payloadType = (payloadType << 8 | inStream[3]);
+
+	if(payloadType != V2GTP_EXI_TYPE)
+		return -1;
+
+
+	/* determine payload length*/
+	*payloadLength = inStream[4];
+	*payloadLength = (*payloadLength << 8 | inStream[5]);
+	*payloadLength = (*payloadLength << 16 | inStream[6]);
+	*payloadLength = (*payloadLength << 24 | inStream[7]);
+
+	if((*payloadLength+V2GTP_HEADER_LENGTH)!=inStreamLength)
+		return -1;
+
+	return 0;
+}
+

+ 54 - 0
src/transport/v2gtp.h

@@ -0,0 +1,54 @@
+
+/*
+ * Copyright (C) 2007-2011 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Sebastian.Kaebisch.EXT@siemens.com
+ * @version 0.6
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2GTP_H_
+#define V2GTP_H_
+
+/* generic V2GTP header length */
+#define V2GTP_HEADER_LENGTH 8
+
+/* define V2GTP Version */
+#define V2GTP_VERSION 0x01
+#define V2GTP_VERSION_INV 0xFE
+
+/* define V2GTP payload types*/
+#define V2GTP_EXI_TYPE 0x8001
+
+
+
+int write_v2gtpHeader(uint8_t* outStream, uint16_t* outStreamLength, uint16_t payloadType);
+
+int read_v2gtpHeader(uint8_t* inStream, uint16_t inStreamLength, uint16_t* payloadLength);
+
+#endif /* V2GTP_H_ */
+
+#ifdef __cplusplus
+}
+#endif

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác