Selaa lähdekoodia

init OpenV2G 0.6 public

sebastiankb 13 vuotta sitten
vanhempi
commit
07b4c11c9d
67 muutettua tiedostoa jossa 31574 lisäystä ja 108 poistoa
  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
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 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
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 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
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 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

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 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

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä