Browse Source

- service implementation
- service / client example

git-svn-id: https://svn.code.sf.net/p/openv2g/code/trunk@6 d9f2db14-54d0-4bde-b00c-16405c910529

sebastiankb 15 years ago
parent
commit
b132e921e5

+ 6 - 2
.cproject

@@ -32,11 +32,13 @@
 <option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.294845555" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
 <option id="gnu.c.compiler.option.include.paths.773068816" 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}&quot;"/>
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/OpenV2G/src/service}&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 id="gnu.c.compiler.option.warnings.pedantic.1676854851" superClass="gnu.c.compiler.option.warnings.pedantic" value="true" valueType="boolean"/>
-<option id="gnu.c.compiler.option.misc.ansi.722225100" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.warnings.pedantic.1676854851" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="true" valueType="boolean"/>
+<option id="gnu.c.compiler.option.misc.ansi.722225100" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
 <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.67299528" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
 </tool>
 <tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.867726048" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug">
@@ -472,6 +474,7 @@
 </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"/>
 </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">
@@ -930,6 +933,7 @@
 </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"/>
 </cconfiguration>
 </storageModule>
 <storageModule moduleId="cdtBuildSystem" version="4.0.0">

File diff suppressed because it is too large
+ 296 - 181
src/codec/EXIDecoder.c


File diff suppressed because it is too large
+ 436 - 290
src/codec/EXIEncoder.c


+ 30 - 29
src/codec/StringTableEntries.c

@@ -59,19 +59,20 @@ const char * localNames3[] = {
 };
 /* localName entries for URI id = 4 */
 const char * localNames4[] = {
-  "ContractID",  "EAmount",  "EVSEID",  "EVSEIMax",  "EVSEMaxPhases",
-  "EVSEMaxPower",  "EVSEStatus",  "EVSEVoltage",  "EnergyProvider",  "EoC",
-  "LineLockReq",  "LineLockReqType",  "LineLockRes",  "LineLockResType",  "MeterInfo",
-  "MeteringAuthPubKey",  "MeteringReceiptReq",  "MeteringReceiptReqType",  "MeteringReceiptRes",  "MeteringReceiptResType",
-  "MeteringStatusReq",  "MeteringStatusReqType",  "MeteringStatusRes",  "MeteringStatusResType",  "PCurrent",
-  "PEVID",  "PEVMaxPhases",  "PEVMaxPower",  "PEVMaxVoltage",  "PEVMinVoltage",
-  "PEVPubKey",  "PEVStatus",  "PaymentDetailsReq",  "PaymentDetailsReqType",  "PaymentDetailsRes",
-  "PaymentDetailsResType",  "PowerDeliveryReq",  "PowerDeliveryReqType",  "PowerDeliveryRes",  "PowerDeliveryResType",
-  "PowerDiscoveryReq",  "PowerDiscoveryReqType",  "PowerDiscoveryRes",  "PowerDiscoveryResType",  "ReqLockStatus",
-  "ReqSwitchStatus",  "ResponseCode",  "ServiceDiscoveryReq",  "ServiceDiscoveryReqType",  "ServiceDiscoveryRes",
-  "ServiceDiscoveryResType",  "ServiceList",  "ServicePaymentSelectionReq",  "ServicePaymentSelectionReqType",  "ServicePaymentSelectionRes",
-  "ServicePaymentSelectionResType",  "ServiceScope",  "ServiceType",  "SessionSetupReq",  "SessionSetupReqType",
-  "SessionSetupRes",  "SessionSetupResType",  "TCurrent",  "Tariff"
+  "ChargingProfile",  "ContractID",  "EAmount",  "EVSEID",  "EVSEIMax",
+  "EVSEMaxPhases",  "EVSEMaxPower",  "EVSEStatus",  "EVSEVoltage",  "EnergyProvider",
+  "EoC",  "LineLockReq",  "LineLockReqType",  "LineLockRes",  "LineLockResType",
+  "MeterInfo",  "MeteringAuthPubKey",  "MeteringReceiptReq",  "MeteringReceiptReqType",  "MeteringReceiptRes",
+  "MeteringReceiptResType",  "MeteringStatusReq",  "MeteringStatusReqType",  "MeteringStatusRes",  "MeteringStatusResType",
+  "PCurrent",  "PEVID",  "PEVMaxPhases",  "PEVMaxPower",  "PEVMaxVoltage",
+  "PEVMinVoltage",  "PEVPubKey",  "PEVStatus",  "PaymentDetailsReq",  "PaymentDetailsReqType",
+  "PaymentDetailsRes",  "PaymentDetailsResType",  "PowerDeliveryReq",  "PowerDeliveryReqType",  "PowerDeliveryRes",
+  "PowerDeliveryResType",  "PowerDiscoveryReq",  "PowerDiscoveryReqType",  "PowerDiscoveryRes",  "PowerDiscoveryResType",
+  "ReqLockStatus",  "ReqSwitchStatus",  "ResponseCode",  "ServiceDiscoveryReq",  "ServiceDiscoveryReqType",
+  "ServiceDiscoveryRes",  "ServiceDiscoveryResType",  "ServiceList",  "ServicePaymentSelectionReq",  "ServicePaymentSelectionReqType",
+  "ServicePaymentSelectionRes",  "ServicePaymentSelectionResType",  "ServiceScope",  "ServiceType",  "SessionSetupReq",
+  "SessionSetupReqType",  "SessionSetupRes",  "SessionSetupResType",  "TCurrent",  "Tariff",
+  "TariffTable"
 };
 /* localName entries for URI id = 5 */
 const char * localNames5[] = {
@@ -80,20 +81,20 @@ const char * localNames5[] = {
   "EventList",  "EventListType",  "FatalError",  "FaultCode",  "FaultMsg",
   "FloatingValueType",  "MeterID",  "MeterInfoType",  "MeterPubKey",  "MeterReading",
   "MeterStatus",  "Multiplier",  "NotificationType",  "PEVStatusType",  "PowerSwitchClosed",
-  "ProtocolVersion",  "RCD",  "Service",  "ServiceDescriptionType",  "ServiceDetails",
-  "ServiceID",  "ServiceListType",  "ServiceName",  "ServiceScope",  "ServiceSessionID",
-  "ServiceType",  "SessionID",  "SessionInformationType",  "ShutDownTime",  "TMeter",
-  "Tariff",  "TariffDescrType",  "TariffDescription",  "TariffEntries",  "TariffEntriesType",
-  "TariffEntry",  "TariffEntryType",  "TariffID",  "TariffPMax",  "TariffStart",
-  "TariffTableType",  "Unit",  "Value",  "contractIDType",  "currencyType",
-  "energyProviderType",  "eventEntryType",  "evseIDType",  "fatalErrorType",  "faultCodeType",
-  "lockStatusType",  "maxPhasesType",  "meterIDType",  "meterStatusType",  "paymentOptionListType",
-  "paymentOptionType",  "pevIDType",  "protocolVersionType",  "pubKeyType",  "rcdType",
-  "responseCode_LineLockType",  "responseCode_MeteringReceiptType",  "responseCode_MeteringStatusType",  "responseCode_PaymentDetailsType",  "responseCode_PowerDeliveryType",
-  "responseCode_PowerDiscoveryType",  "responseCode_ServiceDiscoveryType",  "responseCode_ServicePaymentSelectionType",  "responseCode_SessionSetupType",  "serviceDetailsType",
-  "serviceIDType",  "serviceNameType",  "serviceScopeType",  "serviceTypeType",  "sessionIDType",
-  "standbyType",  "switchStatusType",  "tariffDescriptionType",  "tariffIDType",  "tariffStartType",
-  "timeType",  "unitMultiplierType",  "unitSymbolType"
+  "ProtocolVersion",  "RCD",  "Service",  "ServiceDescriptionType",  "ServiceID",
+  "ServiceListType",  "ServiceName",  "ServiceScope",  "ServiceSessionID",  "ServiceType",
+  "SessionID",  "SessionInformationType",  "ShutDownTime",  "TMeter",  "Tariff",
+  "TariffDescrType",  "TariffDescription",  "TariffEntries",  "TariffEntriesType",  "TariffEntry",
+  "TariffEntryType",  "TariffID",  "TariffPMax",  "TariffStart",  "TariffTableType",
+  "Unit",  "Value",  "contractIDType",  "currencyType",  "energyProviderType",
+  "eventEntryType",  "evseIDType",  "fatalErrorType",  "faultCodeType",  "lockStatusType",
+  "maxPhasesType",  "meterIDType",  "meterStatusType",  "paymentOptionListType",  "paymentOptionType",
+  "pevIDType",  "protocolVersionType",  "pubKeyType",  "rcdType",  "responseCode_LineLockType",
+  "responseCode_MeteringReceiptType",  "responseCode_MeteringStatusType",  "responseCode_PaymentDetailsType",  "responseCode_PowerDeliveryType",  "responseCode_PowerDiscoveryType",
+  "responseCode_ServiceDiscoveryType",  "responseCode_ServicePaymentSelectionType",  "responseCode_SessionSetupType",  "serviceDetailsType",  "serviceIDType",
+  "serviceNameType",  "serviceScopeType",  "serviceTypeType",  "sessionIDType",  "standbyType",
+  "switchStatusType",  "tariffDescriptionType",  "tariffIDType",  "tariffStartType",  "timeType",
+  "unitMultiplierType",  "unitSymbolType"
 };
 /* localName entries for URI id = 6 */
 const char * localNames6[] = {
@@ -105,8 +106,8 @@ struct exiPartition localNamePartitions[7] = {
  { 4, localNames1 },
  { 2, localNames2 },
  { 46, localNames3 },
- { 64, localNames4 },
- { 93, localNames5 },
+ { 66, localNames4 },
+ { 92, localNames5 },
  { 9, localNames6 }
 };
 const char * uris[] = {

+ 58 - 0
src/service/v2g_service.h

@@ -0,0 +1,58 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2G_SERVICE_H_
+#define V2G_SERVICE_H_
+
+#include "v2g_serviceDataTypes.h"
+#include "../codec/EXITypes.h"
+
+struct v2gService
+{
+	/* 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 AnonType_V2G_Message v2gMsg;
+
+};
+
+#endif /* V2G_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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2G_SERVICECLIENTDATATRANSMITTER_H_
+#define V2G_SERVICECLIENTDATATRANSMITTER_H_
+
+#include "../codec/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, size_t outStreamLength, uint8_t* inStream);
+
+#endif /* V2G_SERVICECLIENTDATATRANSMITTER_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 1981 - 0
src/service/v2g_serviceClientStubs.c

@@ -0,0 +1,1981 @@
+
+
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+ 
+ #include "v2g_serviceDataTypes.h"
+ #include "v2g_serviceClientStubs.h"
+ #include "v2g_serviceDataSerializiation.h"
+ #include "v2g_serviceClientDataTransmitter.h"
+ #include "../codec/EXITypes.h"
+ #include "../codec/EXIDecoder.h"
+ #include "../codec/EXIEncoder.h"
+ 
+
+static int deserializeMessage(struct v2gService* service);
+ 
+/* call sessionSetup  */
+int call_sessionSetup(struct v2gService* service, struct HeaderType* header, struct SessionSetupReqType* params, struct SessionSetupResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.SessionSetupReq = *params;
+	service->v2gMsg.Body.isused.SessionSetupReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.SessionSetupRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call serviceDiscovery  */
+int call_serviceDiscovery(struct v2gService* service, struct HeaderType* header, struct ServiceDiscoveryReqType* params, struct ServiceDiscoveryResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.ServiceDiscoveryReq = *params;
+	service->v2gMsg.Body.isused.ServiceDiscoveryReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.ServiceDiscoveryRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call selectedServicePayment  */
+int call_selectedServicePayment(struct v2gService* service, struct HeaderType* header, struct ServicePaymentSelectionReqType* params, struct ServicePaymentSelectionResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.ServicePaymentSelectionReq = *params;
+	service->v2gMsg.Body.isused.ServicePaymentSelectionReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.ServicePaymentSelectionRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call paymentDetails  */
+int call_paymentDetails(struct v2gService* service, struct HeaderType* header, struct PaymentDetailsReqType* params, struct PaymentDetailsResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.PaymentDetailsReq = *params;
+	service->v2gMsg.Body.isused.PaymentDetailsReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.PaymentDetailsRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call powerDiscovery  */
+int call_powerDiscovery(struct v2gService* service, struct HeaderType* header, struct PowerDiscoveryReqType* params, struct PowerDiscoveryResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.PowerDiscoveryReq = *params;
+	service->v2gMsg.Body.isused.PowerDiscoveryReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.PowerDiscoveryRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call lineLock  */
+int call_lineLock(struct v2gService* service, struct HeaderType* header, struct LineLockReqType* params, struct LineLockResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.LineLockReq = *params;
+	service->v2gMsg.Body.isused.LineLockReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.LineLockRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call powerDelivery  */
+int call_powerDelivery(struct v2gService* service, struct HeaderType* header, struct PowerDeliveryReqType* params, struct PowerDeliveryResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.PowerDeliveryReq = *params;
+	service->v2gMsg.Body.isused.PowerDeliveryReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.PowerDeliveryRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call meteringStatus  */
+int call_meteringStatus(struct v2gService* service, struct HeaderType* header, struct MeteringStatusResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.isused.MeteringStatusReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.MeteringStatusRes;
+ 		
+ 	
+	return 0;
+}	
+
+/* call meteringReceipt  */
+int call_meteringReceipt(struct v2gService* service, struct HeaderType* header, struct MeteringReceiptReqType* params, struct MeteringReceiptResType* result)
+{
+	size_t posEncode, posDecode;
+	
+	/* init outStream data structure */
+	posEncode = 0;
+	service->outStream.pos = &posEncode;
+	service->outStream.buffer = 0;
+	service->outStream.capacity = 8;
+	
+	/* init encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init inStream data structure */
+	posDecode = 0;
+	service->inStream.pos = &posDecode;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* assign data to service data structure */
+ 	service->v2gMsg.Header = *header;
+	service->v2gMsg.Body.MeteringReceiptReq = *params;
+	service->v2gMsg.Body.isused.MeteringReceiptReq=1;
+	
+	/* encode data to exi stream*/
+	if(serialize_message(service)<0)
+	{ 
+	
+		return -1;
+	}
+ 
+ 	/* send data to server and wait for the response message */
+ 	if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0) 
+ 	{
+		return -1;
+ 	}
+ 	
+ 	
+
+	/* init decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+
+	/* deserilize the response message */
+ 	if(deserializeMessage(service)<0)
+ 	{
+ 	 
+ 		return -1;
+ 	}
+ 	*result = service->v2gMsg.Body.MeteringReceiptRes;
+ 		
+ 	
+	return 0;
+}	
+
+ 
+
+ /**
+ * Deserialize an element value of the EXI stream and assign it to the
+ * service data structure 
+ */
+static int deserializeElementCharacter(struct v2gService* service)
+{
+
+	/* SessionID */	
+	 if(service->eqn.namespaceURI==5 && service->eqn.localPart==35)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Header.SessionInformation.SessionID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Header.SessionInformation.SessionID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ServiceSessionID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==33)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Header.SessionInformation.ServiceSessionID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Header.SessionInformation.ServiceSessionID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.SessionInformation.isused.ServiceSessionID=1;
+	}
+	
+	/* ProtocolVersion */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==25)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Header.SessionInformation.ProtocolVersion.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Header.SessionInformation.ProtocolVersion.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.SessionInformation.isused.ProtocolVersion=1;
+	}
+	
+	/* Event */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==9)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Header.Notification.EventList.Event=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* FaultCode */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==13)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Header.Notification.FaultCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.Notification.isused.FaultCode=1;
+	}
+	
+	/* FaultMsg */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==14)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Header.Notification.FaultMsg.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Header.Notification.FaultMsg.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.Notification.isused.FaultMsg=1;
+	}
+	
+	/* ConnectorLocked */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==4)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupReq.PEVStatus.ConnectorLocked=service->val.boolean;				
+				
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ConnectorLocked=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ChargerStandby */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==0)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupReq.PEVStatus.ChargerStandby=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==26)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.SessionSetupReq.PEVID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.SessionSetupReq.PEVID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.SessionSetupReq.isused.PEVID=1;
+	}
+	
+	/* FatalError */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==12)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.FatalError=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEStandby */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==7)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.EVSEStandby=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ConnectorLocked */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==4)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupReq.PEVStatus.ConnectorLocked=service->val.boolean;				
+				
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ConnectorLocked=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PowerSwitchClosed */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==24)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.PowerSwitchClosed=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* RCD */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==26)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.RCD=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ShutDownTime */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==37)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ShutDownTime=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==3)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.SessionSetupRes.EVSEID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.SessionSetupRes.EVSEID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==63)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.TCurrent=service->val.int64;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.TCurrent=service->val.int64;				
+				
+			service->v2gMsg.Body.MeteringReceiptReq.TCurrent=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ServiceType */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==58)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.ServiceDiscoveryReq.ServiceType=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceType=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryReq.isused.ServiceType=1;
+	}
+	
+	/* ServiceScope */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==57)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryReq.ServiceScope.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.ServiceDiscoveryReq.ServiceScope.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryReq.isused.ServiceScope=1;
+	}
+	
+	/* ServiceID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==29)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ServiceName */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==31)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceName.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceName.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceName=1;
+	}
+	
+	/* ServiceType */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==34)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.ServiceDiscoveryReq.ServiceType=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceType=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceType=1;
+	}
+	
+	/* ServiceScope */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==32)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceScope.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceScope.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceScope=1;
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVPubKey */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==31)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.ServicePaymentSelectionReq.PEVPubKey.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.ServicePaymentSelectionReq.PEVPubKey.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* MeteringAuthPubKey */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==16)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.ServicePaymentSelectionRes.MeteringAuthPubKey.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.ServicePaymentSelectionRes.MeteringAuthPubKey.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServicePaymentSelectionRes.isused.MeteringAuthPubKey=1;
+	}
+	
+	/* ContractID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==1)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PaymentDetailsReq.ContractID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PaymentDetailsReq.ContractID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Multiplier */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==21)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Multiplier=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Unit */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==50)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Unit=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Value */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==51)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Value=service->val.int32;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EoC */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==10)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryReq.EoC=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVMaxPhases */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==27)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxPhases=service->val.int32;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TariffStart */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==48)
+	{
+		if(service->val.type == UNSIGNED_INTEGER_32) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.TariffEntry[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.arraylen.TariffEntry].TariffStart=service->val.uint32;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TariffID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==46)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffID=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TariffDescription */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==41)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffDescription.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffDescription.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].isused.TariffDescription=1;
+	}
+	
+	/* Currency */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==5)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Currency.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Currency.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEMaxPhases */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==5)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			
+			service->v2gMsg.Body.PowerDiscoveryRes.EVSEMaxPhases=service->val.int32;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EnergyProvider */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==9)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PowerDiscoveryRes.EnergyProvider.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PowerDiscoveryRes.EnergyProvider.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.isused.EnergyProvider=1;
+	}
+	
+	/* ReqLockStatus */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==45)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.LineLockReq.ReqLockStatus=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ChargingProfileEntryStart */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==2)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.PowerDeliveryReq.ChargingProfile.ChargingProfileEntryStart=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ReqSwitchStatus */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==46)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			
+			service->v2gMsg.Body.PowerDeliveryReq.ReqSwitchStatus=service->val.boolean;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Tariff */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==64)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.PowerDeliveryReq.Tariff=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptReq.Tariff=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.PowerDeliveryReq.isused.Tariff=1;
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* MeterID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==16)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterID=1;
+	}
+	
+	/* MeterPubKey */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==18)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterPubKey.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterPubKey.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterPubKey=1;
+	}
+	
+	/* MeterStatus */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==20)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterStatus=service->val.int32;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterStatus=1;
+	}
+	
+	/* TMeter */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==38)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.TMeter=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.TMeter=1;
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==3)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.MeteringStatusRes.EVSEID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.MeteringStatusRes.EVSEID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==63)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.TCurrent=service->val.int64;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.TCurrent=service->val.int64;				
+				
+			service->v2gMsg.Body.MeteringReceiptReq.TCurrent=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==26)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.MeteringReceiptReq.PEVID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.MeteringReceiptReq.PEVID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringReceiptReq.isused.PEVID=1;
+	}
+	
+	/* TCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==63)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.TCurrent=service->val.int64;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.TCurrent=service->val.int64;				
+				
+			service->v2gMsg.Body.MeteringReceiptReq.TCurrent=service->val.int64;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringReceiptReq.isused.TCurrent=1;
+	}
+	
+	/* Tariff */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==64)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.PowerDeliveryReq.Tariff=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptReq.Tariff=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;				
+				
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;				
+				
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	return 0;
+}
+ 
+/**
+ * Deserialize an element of the EXI stream
+ * @return 0 = 0K; -1 = ERROR
+ */
+static int deserializeElement(struct v2gService* service)
+{
+
+	/* EventList */	
+	 if(service->eqn.namespaceURI==5 && service->eqn.localPart==10)
+	{
+ 		/* is used */
+		service->v2gMsg.Header.Notification.isused.EventList=1;
+	}
+	
+	/* Notification */	
+	else  if(service->eqn.namespaceURI==6 && service->eqn.localPart==6)
+	{
+ 		/* is used */
+		service->v2gMsg.Header.isused.Notification=1;
+	}
+	
+	/* ServiceList */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==52)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.isused.ServiceList=1;
+	}
+	
+	/* EPrice */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==6)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.TariffEntry[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.arraylen.TariffEntry].isused.EPrice=1;
+	}
+	
+	/* TariffTable */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==65)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.isused.TariffTable=1;
+	}
+	
+	/* ChargingProfile */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==0)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.PowerDeliveryReq.isused.ChargingProfile=1;
+	}
+	
+	/* MeterReading */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==19)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterReading=1;
+	}
+	
+	/* PCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==25)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.isused.PCurrent=1;
+	}
+	
+	/* MeterInfo */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==15)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.isused.MeterInfo=1;
+	}
+	
+	/* SessionSetupReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==59)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.SessionSetupReq=1;
+	}
+	
+	/* SessionSetupRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==61)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.SessionSetupRes=1;
+	}
+	
+	/* ServiceDiscoveryReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==48)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.ServiceDiscoveryReq=1;
+	}
+	
+	/* ServiceDiscoveryRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==50)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.ServiceDiscoveryRes=1;
+	}
+	
+	/* ServicePaymentSelectionReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==53)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.ServicePaymentSelectionReq=1;
+	}
+	
+	/* ServicePaymentSelectionRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==55)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.ServicePaymentSelectionRes=1;
+	}
+	
+	/* PaymentDetailsReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==33)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PaymentDetailsReq=1;
+	}
+	
+	/* PaymentDetailsRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==35)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PaymentDetailsRes=1;
+	}
+	
+	/* PowerDiscoveryReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==41)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PowerDiscoveryReq=1;
+	}
+	
+	/* PowerDiscoveryRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==43)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PowerDiscoveryRes=1;
+	}
+	
+	/* LineLockReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==11)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.LineLockReq=1;
+	}
+	
+	/* LineLockRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==13)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.LineLockRes=1;
+	}
+	
+	/* PowerDeliveryReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==37)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PowerDeliveryReq=1;
+	}
+	
+	/* PowerDeliveryRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==39)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PowerDeliveryRes=1;
+	}
+	
+	/* MeteringStatusReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==21)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.MeteringStatusReq=1;
+	}
+	
+	/* MeteringStatusRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==23)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.MeteringStatusRes=1;
+	}
+	
+	/* MeteringReceiptReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==17)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.MeteringReceiptReq=1;
+	}
+	
+	/* MeteringReceiptRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==19)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.MeteringReceiptRes=1;
+	}
+	
+	return 0;
+}
+
+
+ 
+ 
+ /** 
+ * Deserialize the EXI stream
+ * @return 0 = 0K; -1 = ERROR
+ */
+static int deserializeMessage(struct v2gService* service)
+{
+	int noEndOfDocument = 1; /* true */
+	int errno;
+	#ifdef DEBUG
+		const char * localName;
+		const char * namespaceURI;
+	#endif
+
+	do {
+			exiDecodeNextEvent(&(service->inStream), &(service->stateDecode), &(service->event));
+			if (errno < 0) {
+				printf("[ERROR] %d \n", errno);
+				return errno;
+			}
+
+			switch (service->event) {
+			case START_DOCUMENT:
+
+				errno = exiDecodeStartDocument(&(service->inStream), &(service->stateDecode));
+
+				break;
+			case END_DOCUMENT:
+
+				errno = exiDecodeEndDocument(&(service->inStream), &(service->stateDecode));
+				noEndOfDocument = 0; /* false */
+				break;
+			case START_ELEMENT:
+				errno = exiDecodeStartElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				 
+				break;
+			case END_ELEMENT:
+
+				errno = exiDecodeEndElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				 
+				break;
+			case CHARACTERS:
+				/* decode */
+				errno = exiDecodeCharacters(&(service->inStream), &(service->stateDecode), &(service->val));
+				 
+				/* assign character data to the v2g message structure */
+				errno = deserializeElementCharacter(service);
+				break;
+			case ATTRIBUTE:
+				/* decode */
+				/*	errno = exiDecodeAttribute(&isStream, &stateDecode, &eqn, &val); */
+				break;
+			default:
+				/* ERROR */
+				return -1;
+			}
+
+		} while (noEndOfDocument);
+
+	return 0;
+}
+ 
+ 
+ 
+ /* Initialize the v2g client */
+ int init_v2gServiceClient(struct v2gService* service, bytes_t bytes, string_ucs_t string, uint8_t* inStream, size_t max_inStream_size, uint8_t* outStream, size_t max_outStream_size)
+{
+
+	/* init byte array */
+	 service->val.binary = bytes;
+
+	/* init string array */
+	 service->val.string = string;
+
+	 /* init input / output stream */
+	 service->inStream.data=inStream;
+	 service->inStream.size=max_inStream_size;
+
+	 service->outStream.data=outStream;
+	 service->outStream.size=max_outStream_size;
+
+
+	return 0;
+}
+

+ 105 - 0
src/service/v2g_serviceClientStubs.h

@@ -0,0 +1,105 @@
+
+
+
+
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+ 
+ 
+ #ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SERVICECLIENTSTUBS_H
+#define SERVICECLIENTSTUBS_H
+
+ #include "v2g_service.h"
+ #include "v2g_serviceDataTypes.h"
+ #include "v2g_serviceClientStubs.h"
+ 
+	/* call sessionSetup  */
+	int call_sessionSetup(struct v2gService* service, struct HeaderType* header, struct SessionSetupReqType* params, struct SessionSetupResType* result);
+
+ 
+
+	
+	/* call serviceDiscovery  */
+	int call_serviceDiscovery(struct v2gService* service, struct HeaderType* header, struct ServiceDiscoveryReqType* params, struct ServiceDiscoveryResType* result);
+
+ 
+
+	
+	/* call selectedServicePayment  */
+	int call_selectedServicePayment(struct v2gService* service, struct HeaderType* header, struct ServicePaymentSelectionReqType* params, struct ServicePaymentSelectionResType* result);
+
+ 
+
+	
+	/* call paymentDetails  */
+	int call_paymentDetails(struct v2gService* service, struct HeaderType* header, struct PaymentDetailsReqType* params, struct PaymentDetailsResType* result);
+
+ 
+
+	
+	/* call powerDiscovery  */
+	int call_powerDiscovery(struct v2gService* service, struct HeaderType* header, struct PowerDiscoveryReqType* params, struct PowerDiscoveryResType* result);
+
+ 
+
+	
+	/* call lineLock  */
+	int call_lineLock(struct v2gService* service, struct HeaderType* header, struct LineLockReqType* params, struct LineLockResType* result);
+
+ 
+
+	
+	/* call powerDelivery  */
+	int call_powerDelivery(struct v2gService* service, struct HeaderType* header, struct PowerDeliveryReqType* params, struct PowerDeliveryResType* result);
+
+ 
+
+	
+	/* call meteringStatus  */
+	int call_meteringStatus(struct v2gService* service, struct HeaderType* header, struct MeteringStatusResType* result);
+
+ 
+
+	
+	/* call meteringReceipt  */
+	int call_meteringReceipt(struct v2gService* service, struct HeaderType* header, struct MeteringReceiptReqType* params, struct MeteringReceiptResType* result);
+
+ 
+
+	
+
+/* Initialize the v2g client */
+int init_v2gServiceClient(struct v2gService* service, bytes_t bytes, string_ucs_t string, uint8_t* inStream, size_t max_inStream_size, uint8_t* outStream, size_t max_outStream_size);
+ 
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 4080 - 0
src/service/v2g_serviceDataSerialization.c

@@ -0,0 +1,4080 @@
+
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+
+#include "v2g_service.h"
+#include "v2g_serviceDataTypes.h"
+#include "v2g_serviceDataSerializiation.h"
+#include "../codec/EXITypes.h"
+#include "../codec/EXIEncoder.h"
+ 
+ 
+ 
+ 
+ 
+
+static int serialize_SessionInformationType(struct SessionInformationType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of SessionID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=35;	
+			/* encode start element SessionID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->SessionID.arraylen.data;
+		memcpy(service->val.binary.data, type->SessionID.data, service->val.binary.len);
+		
+		/* encode character  SessionID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of SessionID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=35;
+			 
+			
+			/* encode end element of SessionID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.ServiceSessionID)
+		{		
+				
+			
+			/* element ID assignment of ServiceSessionID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=33;	
+			/* encode start element ServiceSessionID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->ServiceSessionID.arraylen.data;
+		memcpy(service->val.binary.data, type->ServiceSessionID.data, service->val.binary.len);
+		
+		/* encode character  ServiceSessionID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of ServiceSessionID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=33;
+			 
+			
+			/* encode end element of ServiceSessionID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ProtocolVersion)
+		{		
+				
+			
+			/* element ID assignment of ProtocolVersion*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=25;	
+			/* encode start element ProtocolVersion */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->ProtocolVersion.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ProtocolVersion.data, service->val.string.len);
+		
+			/* encode character  ProtocolVersion */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of ProtocolVersion*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=25;
+			 
+			
+			/* encode end element of ProtocolVersion */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_EventListType(struct EventListType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of Event*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=9;	
+			/* encode start element Event */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Header.Notification.EventList.Event;
+			
+			/* encode character  Event */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of Event*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=9;
+			 
+			
+			/* encode end element of Event */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_NotificationType(struct NotificationType* type, struct v2gService* service)
+{if(type->isused.FaultCode)
+		{		
+				
+			
+			/* element ID assignment of FaultCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=13;	
+			/* encode start element FaultCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Header.Notification.FaultCode;
+			
+			/* encode character  FaultCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of FaultCode*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=13;
+			 
+			
+			/* encode end element of FaultCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.FaultMsg)
+		{		
+				
+			
+			/* element ID assignment of FaultMsg*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=14;	
+			/* encode start element FaultMsg */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->FaultMsg.arraylen.data;
+			memcpy(service->val.string.codepoints, type->FaultMsg.data, service->val.string.len);
+		
+			/* encode character  FaultMsg */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of FaultMsg*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=14;
+			 
+			
+			/* encode end element of FaultMsg */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.EventList)
+		{		
+				
+			
+			/* element ID assignment of EventList*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=10;	
+			/* encode start element EventList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EventList */
+			if(serialize_EventListType(&(type->EventList),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EventList*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=10;
+			 
+			
+			/* encode end element of EventList */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_HeaderType(struct HeaderType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of SessionInformation*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=7;	
+			/* encode start element SessionInformation */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of SessionInformation */
+			if(serialize_SessionInformationType(&(type->SessionInformation),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of SessionInformation*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=7;
+			 
+			
+			/* encode end element of SessionInformation */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.Notification)
+		{		
+				
+			
+			/* element ID assignment of Notification*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=6;	
+			/* encode start element Notification */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of Notification */
+			if(serialize_NotificationType(&(type->Notification),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of Notification*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=6;
+			 
+			
+			/* encode end element of Notification */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PEVStatusType(struct PEVStatusType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ConnectorLocked*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=4;	
+			/* encode start element ConnectorLocked */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupReq.PEVStatus.ConnectorLocked;
+			
+			/* encode character  ConnectorLocked */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ConnectorLocked*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=4;
+			 
+			
+			/* encode end element of ConnectorLocked */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of ChargerStandby*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=0;	
+			/* encode start element ChargerStandby */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupReq.PEVStatus.ChargerStandby;
+			
+			/* encode character  ChargerStandby */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ChargerStandby*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=0;
+			 
+			
+			/* encode end element of ChargerStandby */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_SessionSetupReqType(struct SessionSetupReqType* type, struct v2gService* service)
+{if(type->isused.PEVID)
+		{		
+				
+			
+			/* element ID assignment of PEVID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=26;	
+			/* encode start element PEVID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->PEVID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->PEVID.data, service->val.string.len);
+		
+			/* encode character  PEVID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of PEVID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=26;
+			 
+			
+			/* encode end element of PEVID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+			
+			/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;	
+			/* encode start element PEVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVStatus */
+			if(serialize_PEVStatusType(&(type->PEVStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;
+			 
+			
+			/* encode end element of PEVStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_EVSEStatusType(struct EVSEStatusType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of FatalError*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=12;	
+			/* encode start element FatalError */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupRes.EVSEStatus.FatalError;
+			
+			/* encode character  FatalError */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of FatalError*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=12;
+			 
+			
+			/* encode end element of FatalError */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEStandby*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=7;	
+			/* encode start element EVSEStandby */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupRes.EVSEStatus.EVSEStandby;
+			
+			/* encode character  EVSEStandby */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of EVSEStandby*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=7;
+			 
+			
+			/* encode end element of EVSEStandby */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of ConnectorLocked*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=4;	
+			/* encode start element ConnectorLocked */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ConnectorLocked;
+			
+			/* encode character  ConnectorLocked */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ConnectorLocked*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=4;
+			 
+			
+			/* encode end element of ConnectorLocked */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of PowerSwitchClosed*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=24;	
+			/* encode start element PowerSwitchClosed */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupRes.EVSEStatus.PowerSwitchClosed;
+			
+			/* encode character  PowerSwitchClosed */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of PowerSwitchClosed*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=24;
+			 
+			
+			/* encode end element of PowerSwitchClosed */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of RCD*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=26;	
+			/* encode start element RCD */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.SessionSetupRes.EVSEStatus.RCD;
+			
+			/* encode character  RCD */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of RCD*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=26;
+			 
+			
+			/* encode end element of RCD */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of ShutDownTime*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=37;	
+			/* encode start element ShutDownTime */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ShutDownTime;
+			
+			/* encode character  ShutDownTime */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ShutDownTime*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=37;
+			 
+			
+			/* encode end element of ShutDownTime */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_SessionSetupResType(struct SessionSetupResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.SessionSetupRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=3;	
+			/* encode start element EVSEID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->EVSEID.arraylen.data;
+		memcpy(service->val.binary.data, type->EVSEID.data, service->val.binary.len);
+		
+		/* encode character  EVSEID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of EVSEID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=3;
+			 
+			
+			/* encode end element of EVSEID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;	
+			/* encode start element EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEStatus */
+			if(serialize_EVSEStatusType(&(type->EVSEStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;
+			 
+			
+			/* encode end element of EVSEStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of TCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;	
+			/* encode start element TCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.SessionSetupRes.TCurrent;
+			
+			/* encode character  TCurrent */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of TCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;
+			 
+			
+			/* encode end element of TCurrent */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDiscoveryReqType(struct ServiceDiscoveryReqType* type, struct v2gService* service)
+{if(type->isused.ServiceType)
+		{		
+				
+			
+			/* element ID assignment of ServiceType*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=58;	
+			/* encode start element ServiceType */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.ServiceDiscoveryReq.ServiceType;
+			
+			/* encode character  ServiceType */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ServiceType*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=58;
+			 
+			
+			/* encode end element of ServiceType */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServiceScope)
+		{		
+				
+			
+			/* element ID assignment of ServiceScope*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=57;	
+			/* encode start element ServiceScope */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->ServiceScope.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ServiceScope.data, service->val.string.len);
+		
+			/* encode character  ServiceScope */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of ServiceScope*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=57;
+			 
+			
+			/* encode end element of ServiceScope */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDescriptionType(struct ServiceDescriptionType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ServiceID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=29;	
+			/* encode start element ServiceID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->ServiceID.arraylen.data;
+		memcpy(service->val.binary.data, type->ServiceID.data, service->val.binary.len);
+		
+		/* encode character  ServiceID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of ServiceID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=29;
+			 
+			
+			/* encode end element of ServiceID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.ServiceName)
+		{		
+				
+			
+			/* element ID assignment of ServiceName*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=31;	
+			/* encode start element ServiceName */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->ServiceName.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ServiceName.data, service->val.string.len);
+		
+			/* encode character  ServiceName */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of ServiceName*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=31;
+			 
+			
+			/* encode end element of ServiceName */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServiceType)
+		{		
+				
+			
+			/* element ID assignment of ServiceType*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=34;	
+			/* encode start element ServiceType */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceType;
+			
+			/* encode character  ServiceType */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ServiceType*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=34;
+			 
+			
+			/* encode end element of ServiceType */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServiceScope)
+		{		
+				
+			
+			/* element ID assignment of ServiceScope*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=32;	
+			/* encode start element ServiceScope */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->ServiceScope.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ServiceScope.data, service->val.string.len);
+		
+			/* encode character  ServiceScope */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of ServiceScope*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=32;
+			 
+			
+			/* encode end element of ServiceScope */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServiceListType(struct ServiceListType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of Service*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=27;	
+			/* encode start element Service */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of Service */
+			if(serialize_ServiceDescriptionType(&(type->Service),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of Service*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=27;
+			 
+			
+			/* encode end element of Service */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_ServiceDiscoveryResType(struct ServiceDiscoveryResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.ServiceList)
+		{		
+				
+			
+			/* element ID assignment of ServiceList*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=52;	
+			/* encode start element ServiceList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ServiceList */
+			if(serialize_ServiceListType(&(type->ServiceList),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ServiceList*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=52;
+			 
+			
+			/* encode end element of ServiceList */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_ServicePaymentSelectionReqType(struct ServicePaymentSelectionReqType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ServiceList*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=52;	
+			/* encode start element ServiceList */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ServiceList */
+			if(serialize_ServiceListType(&(type->ServiceList),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ServiceList*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=52;
+			 
+			
+			/* encode end element of ServiceList */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of PEVPubKey*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=31;	
+			/* encode start element PEVPubKey */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->PEVPubKey.arraylen.data;
+		memcpy(service->val.binary.data, type->PEVPubKey.data, service->val.binary.len);
+		
+		/* encode character  PEVPubKey */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of PEVPubKey*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=31;
+			 
+			
+			/* encode end element of PEVPubKey */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_ServicePaymentSelectionResType(struct ServicePaymentSelectionResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.MeteringAuthPubKey)
+		{		
+				
+			
+			/* element ID assignment of MeteringAuthPubKey*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=16;	
+			/* encode start element MeteringAuthPubKey */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->MeteringAuthPubKey.arraylen.data;
+		memcpy(service->val.binary.data, type->MeteringAuthPubKey.data, service->val.binary.len);
+		
+		/* encode character  MeteringAuthPubKey */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of MeteringAuthPubKey*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=16;
+			 
+			
+			/* encode end element of MeteringAuthPubKey */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PaymentDetailsReqType(struct PaymentDetailsReqType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ContractID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=1;	
+			/* encode start element ContractID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->ContractID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->ContractID.data, service->val.string.len);
+		
+			/* encode character  ContractID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of ContractID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=1;
+			 
+			
+			/* encode end element of ContractID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_PaymentDetailsResType(struct PaymentDetailsResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PaymentDetailsRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_FloatingValueType(struct FloatingValueType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of Multiplier*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=21;	
+			/* encode start element Multiplier */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Multiplier;
+			
+			/* encode character  Multiplier */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of Multiplier*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=21;
+			 
+			
+			/* encode end element of Multiplier */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of Unit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=50;	
+			/* encode start element Unit */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Unit;
+			
+			/* encode character  Unit */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of Unit*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=50;
+			 
+			
+			/* encode end element of Unit */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of Value*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=51;	
+			/* encode start element Value */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_16;
+			service->val.int32=service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Value;
+			
+			/* encode character  Value */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of Value*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=51;
+			 
+			
+			/* encode end element of Value */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_PowerDiscoveryReqType(struct PowerDiscoveryReqType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;	
+			/* encode start element PEVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVStatus */
+			if(serialize_PEVStatusType(&(type->PEVStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;
+			 
+			
+			/* encode end element of PEVStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EoC*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=10;	
+			/* encode start element EoC */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.PowerDiscoveryReq.EoC;
+			
+			/* encode character  EoC */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of EoC*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=10;
+			 
+			
+			/* encode end element of EoC */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EAmount*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=2;	
+			/* encode start element EAmount */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EAmount */
+			if(serialize_FloatingValueType(&(type->EAmount),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EAmount*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=2;
+			 
+			
+			/* encode end element of EAmount */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of PEVMaxPower*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=28;	
+			/* encode start element PEVMaxPower */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVMaxPower */
+			if(serialize_FloatingValueType(&(type->PEVMaxPower),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVMaxPower*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=28;
+			 
+			
+			/* encode end element of PEVMaxPower */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of PEVMaxPhases*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=27;	
+			/* encode start element PEVMaxPhases */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_16;
+			service->val.int32=service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxPhases;
+			
+			/* encode character  PEVMaxPhases */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of PEVMaxPhases*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=27;
+			 
+			
+			/* encode end element of PEVMaxPhases */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of PEVMaxVoltage*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=29;	
+			/* encode start element PEVMaxVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVMaxVoltage */
+			if(serialize_FloatingValueType(&(type->PEVMaxVoltage),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVMaxVoltage*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=29;
+			 
+			
+			/* encode end element of PEVMaxVoltage */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of PEVMinVoltage*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=30;	
+			/* encode start element PEVMinVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVMinVoltage */
+			if(serialize_FloatingValueType(&(type->PEVMinVoltage),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVMinVoltage*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=30;
+			 
+			
+			/* encode end element of PEVMinVoltage */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_TariffEntryType(struct TariffEntryType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of TariffStart*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=48;	
+			/* encode start element TariffStart */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = UNSIGNED_INTEGER_32;
+			service->val.uint32=service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.TariffEntry[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.arraylen.TariffEntry].TariffStart;
+			
+			/* encode character  TariffStart */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of TariffStart*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=48;
+			 
+			
+			/* encode end element of TariffStart */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of TariffPMax*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=47;	
+			/* encode start element TariffPMax */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of TariffPMax */
+			if(serialize_FloatingValueType(&(type->TariffPMax),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of TariffPMax*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of TariffPMax */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.EPrice)
+		{		
+				
+			
+			/* element ID assignment of EPrice*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=6;	
+			/* encode start element EPrice */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EPrice */
+			if(serialize_FloatingValueType(&(type->EPrice),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EPrice*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=6;
+			 
+			
+			/* encode end element of EPrice */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_TariffEntriesType(struct TariffEntriesType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of TariffEntry*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=44;	
+			/* encode start element TariffEntry */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of TariffEntry */
+			if(serialize_TariffEntryType(&(type->TariffEntry),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of TariffEntry*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=44;
+			 
+			
+			/* encode end element of TariffEntry */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_TariffDescrType(struct TariffDescrType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of TariffID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=46;	
+			/* encode start element TariffID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffID;
+			
+			/* encode character  TariffID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of TariffID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=46;
+			 
+			
+			/* encode end element of TariffID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.TariffDescription)
+		{		
+				
+			
+			/* element ID assignment of TariffDescription*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=41;	
+			/* encode start element TariffDescription */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->TariffDescription.arraylen.data;
+			memcpy(service->val.string.codepoints, type->TariffDescription.data, service->val.string.len);
+		
+			/* encode character  TariffDescription */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of TariffDescription*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=41;
+			 
+			
+			/* encode end element of TariffDescription */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+			
+			/* element ID assignment of TariffEntries*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=42;	
+			/* encode start element TariffEntries */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of TariffEntries */
+			if(serialize_TariffEntriesType(&(type->TariffEntries),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of TariffEntries*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=42;
+			 
+			
+			/* encode end element of TariffEntries */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_TariffTableType(struct TariffTableType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of Currency*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=5;	
+			/* encode start element Currency */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->Currency.arraylen.data;
+			memcpy(service->val.string.codepoints, type->Currency.data, service->val.string.len);
+		
+			/* encode character  Currency */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of Currency*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=5;
+			 
+			
+			/* encode end element of Currency */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of Tariff*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=39;	
+			/* encode start element Tariff */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of Tariff */
+			if(serialize_TariffDescrType(&(type->Tariff),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of Tariff*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=39;
+			 
+			
+			/* encode end element of Tariff */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_PowerDiscoveryResType(struct PowerDiscoveryResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;	
+			/* encode start element EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEStatus */
+			if(serialize_EVSEStatusType(&(type->EVSEStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;
+			 
+			
+			/* encode end element of EVSEStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEVoltage*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=8;	
+			/* encode start element EVSEVoltage */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEVoltage */
+			if(serialize_FloatingValueType(&(type->EVSEVoltage),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEVoltage*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=8;
+			 
+			
+			/* encode end element of EVSEVoltage */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEIMax*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=4;	
+			/* encode start element EVSEIMax */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEIMax */
+			if(serialize_FloatingValueType(&(type->EVSEIMax),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEIMax*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=4;
+			 
+			
+			/* encode end element of EVSEIMax */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEMaxPhases*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=5;	
+			/* encode start element EVSEMaxPhases */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_16;
+			service->val.int32=service->v2gMsg.Body.PowerDiscoveryRes.EVSEMaxPhases;
+			
+			/* encode character  EVSEMaxPhases */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of EVSEMaxPhases*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=5;
+			 
+			
+			/* encode end element of EVSEMaxPhases */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.EnergyProvider)
+		{		
+				
+			
+			/* element ID assignment of EnergyProvider*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=9;	
+			/* encode start element EnergyProvider */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->EnergyProvider.arraylen.data;
+			memcpy(service->val.string.codepoints, type->EnergyProvider.data, service->val.string.len);
+		
+			/* encode character  EnergyProvider */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of EnergyProvider*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=9;
+			 
+			
+			/* encode end element of EnergyProvider */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.TariffTable)
+		{		
+				
+			
+			/* element ID assignment of TariffTable*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=65;	
+			/* encode start element TariffTable */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of TariffTable */
+			if(serialize_TariffTableType(&(type->TariffTable),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of TariffTable*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=65;
+			 
+			
+			/* encode end element of TariffTable */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_LineLockReqType(struct LineLockReqType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;	
+			/* encode start element PEVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVStatus */
+			if(serialize_PEVStatusType(&(type->PEVStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;
+			 
+			
+			/* encode end element of PEVStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of ReqLockStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=45;	
+			/* encode start element ReqLockStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.LineLockReq.ReqLockStatus;
+			
+			/* encode character  ReqLockStatus */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ReqLockStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=45;
+			 
+			
+			/* encode end element of ReqLockStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_LineLockResType(struct LineLockResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.LineLockRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;	
+			/* encode start element EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEStatus */
+			if(serialize_EVSEStatusType(&(type->EVSEStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;
+			 
+			
+			/* encode end element of EVSEStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_ChargingProfileType(struct ChargingProfileType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ChargingProfileEntryStart*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=2;	
+			/* encode start element ChargingProfileEntryStart */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.PowerDeliveryReq.ChargingProfile.ChargingProfileEntryStart;
+			
+			/* encode character  ChargingProfileEntryStart */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ChargingProfileEntryStart*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=2;
+			 
+			
+			/* encode end element of ChargingProfileEntryStart */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of ChargingProfileEntryMaxPower*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=1;	
+			/* encode start element ChargingProfileEntryMaxPower */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ChargingProfileEntryMaxPower */
+			if(serialize_FloatingValueType(&(type->ChargingProfileEntryMaxPower),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ChargingProfileEntryMaxPower*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=1;
+			 
+			
+			/* encode end element of ChargingProfileEntryMaxPower */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_PowerDeliveryReqType(struct PowerDeliveryReqType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;	
+			/* encode start element PEVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVStatus */
+			if(serialize_PEVStatusType(&(type->PEVStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;
+			 
+			
+			/* encode end element of PEVStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of ReqSwitchStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=46;	
+			/* encode start element ReqSwitchStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = BOOLEAN;
+			service->val.boolean=service->v2gMsg.Body.PowerDeliveryReq.ReqSwitchStatus;
+			
+			/* encode character  ReqSwitchStatus */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ReqSwitchStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=46;
+			 
+			
+			/* encode end element of ReqSwitchStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.Tariff)
+		{		
+				
+			
+			/* element ID assignment of Tariff*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=64;	
+			/* encode start element Tariff */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PowerDeliveryReq.Tariff;
+			
+			/* encode character  Tariff */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of Tariff*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=64;
+			 
+			
+			/* encode end element of Tariff */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ChargingProfile)
+		{		
+				
+			
+			/* element ID assignment of ChargingProfile*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=0;	
+			/* encode start element ChargingProfile */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ChargingProfile */
+			if(serialize_ChargingProfileType(&(type->ChargingProfile),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ChargingProfile*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=0;
+			 
+			
+			/* encode end element of ChargingProfile */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_PowerDeliveryResType(struct PowerDeliveryResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.PowerDeliveryRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_MeteringStatusReqType(struct MeteringStatusReqType* type, struct v2gService* service)
+{
+
+	return 0;			
+}
+
+
+static int serialize_MeterInfoType(struct MeterInfoType* type, struct v2gService* service)
+{if(type->isused.MeterID)
+		{		
+				
+			
+			/* element ID assignment of MeterID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=16;	
+			/* encode start element MeterID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->MeterID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->MeterID.data, service->val.string.len);
+		
+			/* encode character  MeterID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of MeterID*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=16;
+			 
+			
+			/* encode end element of MeterID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeterPubKey)
+		{		
+				
+			
+			/* element ID assignment of MeterPubKey*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=18;	
+			/* encode start element MeterPubKey */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->MeterPubKey.arraylen.data;
+		memcpy(service->val.binary.data, type->MeterPubKey.data, service->val.binary.len);
+		
+		/* encode character  MeterPubKey */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of MeterPubKey*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=18;
+			 
+			
+			/* encode end element of MeterPubKey */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeterReading)
+		{		
+				
+			
+			/* element ID assignment of MeterReading*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=19;	
+			/* encode start element MeterReading */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeterReading */
+			if(serialize_FloatingValueType(&(type->MeterReading),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeterReading*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=19;
+			 
+			
+			/* encode end element of MeterReading */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeterStatus)
+		{		
+				
+			
+			/* element ID assignment of MeterStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=20;	
+			/* encode start element MeterStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_16;
+			service->val.int32=service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterStatus;
+			
+			/* encode character  MeterStatus */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of MeterStatus*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=20;
+			 
+			
+			/* encode end element of MeterStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.TMeter)
+		{		
+				
+			
+			/* element ID assignment of TMeter*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=38;	
+			/* encode start element TMeter */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.MeteringStatusRes.MeterInfo.TMeter;
+			
+			/* encode character  TMeter */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of TMeter*/
+			service->eqn.namespaceURI=5;			
+			service->eqn.localPart=38;
+			 
+			
+			/* encode end element of TMeter */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_MeteringStatusResType(struct MeteringStatusResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.MeteringStatusRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=3;	
+			/* encode start element EVSEID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			service->val.type = BINARY_HEX;
+		service->val.binary.len = type->EVSEID.arraylen.data;
+		memcpy(service->val.binary.data, type->EVSEID.data, service->val.binary.len);
+		
+		/* encode character  EVSEID */	
+		if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+		{
+				 
+				return -1;
+		}
+			
+			
+			
+			
+						/* element ID assignment of EVSEID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=3;
+			 
+			
+			/* encode end element of EVSEID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;	
+			/* encode start element EVSEStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEStatus */
+			if(serialize_EVSEStatusType(&(type->EVSEStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=7;
+			 
+			
+			/* encode end element of EVSEStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of TCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;	
+			/* encode start element TCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.MeteringStatusRes.TCurrent;
+			
+			/* encode character  TCurrent */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of TCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;
+			 
+			
+			/* encode end element of TCurrent */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of EVSEMaxPower*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=6;	
+			/* encode start element EVSEMaxPower */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of EVSEMaxPower */
+			if(serialize_FloatingValueType(&(type->EVSEMaxPower),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of EVSEMaxPower*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=6;
+			 
+			
+			/* encode end element of EVSEMaxPower */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.PCurrent)
+		{		
+				
+			
+			/* element ID assignment of PCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=25;	
+			/* encode start element PCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PCurrent */
+			if(serialize_FloatingValueType(&(type->PCurrent),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=25;
+			 
+			
+			/* encode end element of PCurrent */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeterInfo)
+		{		
+				
+			
+			/* element ID assignment of MeterInfo*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=15;	
+			/* encode start element MeterInfo */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeterInfo */
+			if(serialize_MeterInfoType(&(type->MeterInfo),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeterInfo*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=15;
+			 
+			
+			/* encode end element of MeterInfo */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_MeteringReceiptReqType(struct MeteringReceiptReqType* type, struct v2gService* service)
+{if(type->isused.PEVID)
+		{		
+				
+			
+			/* element ID assignment of PEVID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=26;	
+			/* encode start element PEVID */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = STRING;
+			service->val.string.len = type->PEVID.arraylen.data;
+			memcpy(service->val.string.codepoints, type->PEVID.data, service->val.string.len);
+		
+			/* encode character  PEVID */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			
+			
+						/* element ID assignment of PEVID*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=26;
+			 
+			
+			/* encode end element of PEVID */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+			
+			/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;	
+			/* encode start element PEVStatus */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PEVStatus */
+			if(serialize_PEVStatusType(&(type->PEVStatus),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PEVStatus*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=32;
+			 
+			
+			/* encode end element of PEVStatus */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}if(type->isused.TCurrent)
+		{		
+				
+			
+			/* element ID assignment of TCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;	
+			/* encode start element TCurrent */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = INTEGER_64;
+			service->val.int64=service->v2gMsg.Body.MeteringReceiptReq.TCurrent;
+			
+			/* encode character  TCurrent */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of TCurrent*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=63;
+			 
+			
+			/* encode end element of TCurrent */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+			
+			/* element ID assignment of Tariff*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=64;	
+			/* encode start element Tariff */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.MeteringReceiptReq.Tariff;
+			
+			/* encode character  Tariff */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of Tariff*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=64;
+			 
+			
+			/* encode end element of Tariff */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of MeterInfo*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=15;	
+			/* encode start element MeterInfo */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeterInfo */
+			if(serialize_MeterInfoType(&(type->MeterInfo),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeterInfo*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=15;
+			 
+			
+			/* encode end element of MeterInfo */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_MeteringReceiptResType(struct MeteringReceiptResType* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;	
+			/* encode start element ResponseCode */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			service->val.type = ENUMERATION;
+			service->val.enumeration=service->v2gMsg.Body.MeteringReceiptRes.ResponseCode;
+			
+			/* encode character  ResponseCode */	
+			if (exiEncodeCharacters(&(service->outStream), &(service->stateEncode), &(service->val)) < 0) 
+			{
+				 
+				return -1;
+			}
+				
+			
+						/* element ID assignment of ResponseCode*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=47;
+			 
+			
+			/* encode end element of ResponseCode */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+
+static int serialize_BodyType(struct BodyType* type, struct v2gService* service)
+{if(type->isused.SessionSetupReq)
+		{		
+				
+			
+			/* element ID assignment of SessionSetupReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=59;	
+			/* encode start element SessionSetupReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of SessionSetupReq */
+			if(serialize_SessionSetupReqType(&(type->SessionSetupReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of SessionSetupReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=59;
+			 
+			
+			/* encode end element of SessionSetupReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.SessionSetupRes)
+		{		
+				
+			
+			/* element ID assignment of SessionSetupRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=61;	
+			/* encode start element SessionSetupRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of SessionSetupRes */
+			if(serialize_SessionSetupResType(&(type->SessionSetupRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of SessionSetupRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=61;
+			 
+			
+			/* encode end element of SessionSetupRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServiceDiscoveryReq)
+		{		
+				
+			
+			/* element ID assignment of ServiceDiscoveryReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=48;	
+			/* encode start element ServiceDiscoveryReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ServiceDiscoveryReq */
+			if(serialize_ServiceDiscoveryReqType(&(type->ServiceDiscoveryReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ServiceDiscoveryReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=48;
+			 
+			
+			/* encode end element of ServiceDiscoveryReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServiceDiscoveryRes)
+		{		
+				
+			
+			/* element ID assignment of ServiceDiscoveryRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=50;	
+			/* encode start element ServiceDiscoveryRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ServiceDiscoveryRes */
+			if(serialize_ServiceDiscoveryResType(&(type->ServiceDiscoveryRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ServiceDiscoveryRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=50;
+			 
+			
+			/* encode end element of ServiceDiscoveryRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServicePaymentSelectionReq)
+		{		
+				
+			
+			/* element ID assignment of ServicePaymentSelectionReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=53;	
+			/* encode start element ServicePaymentSelectionReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ServicePaymentSelectionReq */
+			if(serialize_ServicePaymentSelectionReqType(&(type->ServicePaymentSelectionReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ServicePaymentSelectionReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=53;
+			 
+			
+			/* encode end element of ServicePaymentSelectionReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.ServicePaymentSelectionRes)
+		{		
+				
+			
+			/* element ID assignment of ServicePaymentSelectionRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=55;	
+			/* encode start element ServicePaymentSelectionRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of ServicePaymentSelectionRes */
+			if(serialize_ServicePaymentSelectionResType(&(type->ServicePaymentSelectionRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of ServicePaymentSelectionRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=55;
+			 
+			
+			/* encode end element of ServicePaymentSelectionRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.PaymentDetailsReq)
+		{		
+				
+			
+			/* element ID assignment of PaymentDetailsReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=33;	
+			/* encode start element PaymentDetailsReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PaymentDetailsReq */
+			if(serialize_PaymentDetailsReqType(&(type->PaymentDetailsReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PaymentDetailsReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=33;
+			 
+			
+			/* encode end element of PaymentDetailsReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.PaymentDetailsRes)
+		{		
+				
+			
+			/* element ID assignment of PaymentDetailsRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=35;	
+			/* encode start element PaymentDetailsRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PaymentDetailsRes */
+			if(serialize_PaymentDetailsResType(&(type->PaymentDetailsRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PaymentDetailsRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=35;
+			 
+			
+			/* encode end element of PaymentDetailsRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.PowerDiscoveryReq)
+		{		
+				
+			
+			/* element ID assignment of PowerDiscoveryReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=41;	
+			/* encode start element PowerDiscoveryReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PowerDiscoveryReq */
+			if(serialize_PowerDiscoveryReqType(&(type->PowerDiscoveryReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PowerDiscoveryReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=41;
+			 
+			
+			/* encode end element of PowerDiscoveryReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.PowerDiscoveryRes)
+		{		
+				
+			
+			/* element ID assignment of PowerDiscoveryRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=43;	
+			/* encode start element PowerDiscoveryRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PowerDiscoveryRes */
+			if(serialize_PowerDiscoveryResType(&(type->PowerDiscoveryRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PowerDiscoveryRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=43;
+			 
+			
+			/* encode end element of PowerDiscoveryRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.LineLockReq)
+		{		
+				
+			
+			/* element ID assignment of LineLockReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=11;	
+			/* encode start element LineLockReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of LineLockReq */
+			if(serialize_LineLockReqType(&(type->LineLockReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of LineLockReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=11;
+			 
+			
+			/* encode end element of LineLockReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.LineLockRes)
+		{		
+				
+			
+			/* element ID assignment of LineLockRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=13;	
+			/* encode start element LineLockRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of LineLockRes */
+			if(serialize_LineLockResType(&(type->LineLockRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of LineLockRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=13;
+			 
+			
+			/* encode end element of LineLockRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.PowerDeliveryReq)
+		{		
+				
+			
+			/* element ID assignment of PowerDeliveryReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=37;	
+			/* encode start element PowerDeliveryReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PowerDeliveryReq */
+			if(serialize_PowerDeliveryReqType(&(type->PowerDeliveryReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PowerDeliveryReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=37;
+			 
+			
+			/* encode end element of PowerDeliveryReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.PowerDeliveryRes)
+		{		
+				
+			
+			/* element ID assignment of PowerDeliveryRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=39;	
+			/* encode start element PowerDeliveryRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of PowerDeliveryRes */
+			if(serialize_PowerDeliveryResType(&(type->PowerDeliveryRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of PowerDeliveryRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=39;
+			 
+			
+			/* encode end element of PowerDeliveryRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeteringStatusReq)
+		{		
+				
+			
+			/* element ID assignment of MeteringStatusReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=21;	
+			/* encode start element MeteringStatusReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeteringStatusReq */
+			if(serialize_MeteringStatusReqType(&(type->MeteringStatusReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeteringStatusReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=21;
+			 
+			
+			/* encode end element of MeteringStatusReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeteringStatusRes)
+		{		
+				
+			
+			/* element ID assignment of MeteringStatusRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=23;	
+			/* encode start element MeteringStatusRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeteringStatusRes */
+			if(serialize_MeteringStatusResType(&(type->MeteringStatusRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeteringStatusRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=23;
+			 
+			
+			/* encode end element of MeteringStatusRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeteringReceiptReq)
+		{		
+				
+			
+			/* element ID assignment of MeteringReceiptReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=17;	
+			/* encode start element MeteringReceiptReq */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeteringReceiptReq */
+			if(serialize_MeteringReceiptReqType(&(type->MeteringReceiptReq),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeteringReceiptReq*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=17;
+			 
+			
+			/* encode end element of MeteringReceiptReq */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				if(type->isused.MeteringReceiptRes)
+		{		
+				
+			
+			/* element ID assignment of MeteringReceiptRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=19;	
+			/* encode start element MeteringReceiptRes */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of MeteringReceiptRes */
+			if(serialize_MeteringReceiptResType(&(type->MeteringReceiptRes),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of MeteringReceiptRes*/
+			service->eqn.namespaceURI=4;			
+			service->eqn.localPart=19;
+			 
+			
+			/* encode end element of MeteringReceiptRes */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}}
+				
+
+	return 0;			
+}
+
+
+static int serialize_AnonType_V2G_Message(struct AnonType_V2G_Message* type, struct v2gService* service)
+{
+			
+			/* element ID assignment of Header*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=4;	
+			/* encode start element Header */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of Header */
+			if(serialize_HeaderType(&(type->Header),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of Header*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=4;
+			 
+			
+			/* encode end element of Header */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+			
+			/* element ID assignment of Body*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=0;	
+			/* encode start element Body */	
+			if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+						
+			/* encode children of Body */
+			if(serialize_BodyType(&(type->Body),service)<0)
+			{
+				return -1;
+			}
+
+			
+			
+						/* element ID assignment of Body*/
+			service->eqn.namespaceURI=6;			
+			service->eqn.localPart=0;
+			 
+			
+			/* encode end element of Body */
+			if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+			{
+				 
+					return -1;
+			}
+
+	return 0;			
+}
+
+ 
+ 
+ 
+ 
+ 
+ /* marshal data to EXI stream */
+ int serialize_message(struct v2gService* service)
+ {
+	
+
+	/* encode start document */ 	
+	if (exiEncodeStartDocument(&(service->outStream), &(service->stateEncode)) < 0) 
+	{
+	 
+		return -1;
+	}
+
+	/* element ID assignment of V2G_Message*/
+	service->eqn.namespaceURI=6;			
+	service->eqn.localPart=8;
+	
+	/* encode start element V2G_Message */	
+	if (exiEncodeStartElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+	{
+			 
+		return -1;
+	}
+		
+
+	serialize_AnonType_V2G_Message(&(service->v2gMsg), service);
+
+			
+	/* encode end element of V2G_Message */
+	if (exiEncodeEndElement(&(service->outStream), &(service->stateEncode), &(service->eqn)) < 0) 
+	{
+			 
+		return -1;
+	}
+
+
+	/* encode end document */
+	if (exiEncodeEndDocument(&(service->outStream), &(service->stateEncode)) < 0) {
+	 
+	return -1;
+	}	
+ 	
+ 	return 0;
+ 	
+ }
+ 

+ 42 - 0
src/service/v2g_serviceDataSerializiation.h

@@ -0,0 +1,42 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2GSERVICEDATASERIAL_H_
+#define V2GSERVICEDATASERIAL_H_
+
+#include "v2g_service.h"
+
+int serialize_message(struct v2gService* service);
+
+
+#endif /* V2GSERVICEDATASERIAL_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 429 - 0
src/service/v2g_serviceDataTypes.c

@@ -0,0 +1,429 @@
+
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+
+#include "../codec/EXITypes.h"
+#include "v2g_serviceDataTypes.h"
+
+
+static  void init_SessionInformationType_SessionID(struct SessionInformationType_SessionID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionInformationType_ServiceSessionID(struct SessionInformationType_ServiceSessionID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionInformationType_ProtocolVersion(struct SessionInformationType_ProtocolVersion* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionInformationType(struct SessionInformationType* type)
+{
+	
+	init_SessionInformationType_SessionID(&(type->SessionID));	
+	init_SessionInformationType_ServiceSessionID(&(type->ServiceSessionID));	
+	type->isused.ServiceSessionID=0;	
+	init_SessionInformationType_ProtocolVersion(&(type->ProtocolVersion));	
+	type->isused.ProtocolVersion=0;
+
+}
+
+static  void init_NotificationType_FaultMsg(struct NotificationType_FaultMsg* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_NotificationType(struct NotificationType* type)
+{
+		
+	type->isused.FaultCode=0;	
+	init_NotificationType_FaultMsg(&(type->FaultMsg));	
+	type->isused.FaultMsg=0;		
+	type->isused.EventList=0;
+
+}
+
+static  void init_HeaderType(struct HeaderType* type)
+{
+	
+	init_SessionInformationType(&(type->SessionInformation));	
+	init_NotificationType(&(type->Notification));	
+	type->isused.Notification=0;
+
+}
+
+static  void init_SessionSetupReqType_PEVID(struct SessionSetupReqType_PEVID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionSetupReqType(struct SessionSetupReqType* type)
+{
+	
+	init_SessionSetupReqType_PEVID(&(type->PEVID));	
+	type->isused.PEVID=0;	
+
+}
+
+static  void init_SessionSetupResType_EVSEID(struct SessionSetupResType_EVSEID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_SessionSetupResType(struct SessionSetupResType* type)
+{
+		
+	init_SessionSetupResType_EVSEID(&(type->EVSEID));		
+
+}
+
+static  void init_ServiceDiscoveryReqType_ServiceScope(struct ServiceDiscoveryReqType_ServiceScope* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServiceDiscoveryReqType(struct ServiceDiscoveryReqType* type)
+{
+		
+	type->isused.ServiceType=0;	
+	init_ServiceDiscoveryReqType_ServiceScope(&(type->ServiceScope));	
+	type->isused.ServiceScope=0;
+
+}
+
+static  void init_ServiceDescriptionType_ServiceID(struct ServiceDescriptionType_ServiceID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServiceDescriptionType_ServiceName(struct ServiceDescriptionType_ServiceName* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServiceDescriptionType_ServiceScope(struct ServiceDescriptionType_ServiceScope* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServiceDescriptionType(struct ServiceDescriptionType* type)
+{
+	
+	init_ServiceDescriptionType_ServiceID(&(type->ServiceID));	
+	init_ServiceDescriptionType_ServiceName(&(type->ServiceName));	
+	type->isused.ServiceName=0;		
+	type->isused.ServiceType=0;	
+	init_ServiceDescriptionType_ServiceScope(&(type->ServiceScope));	
+	type->isused.ServiceScope=0;
+
+}
+
+static  void init_ServiceListType(struct ServiceListType* type)
+{
+	
+	init_ServiceDescriptionType((type->Service));
+	type->arraylen.Service=0;
+
+}
+
+static  void init_ServiceDiscoveryResType(struct ServiceDiscoveryResType* type)
+{
+		
+	init_ServiceListType(&(type->ServiceList));	
+	type->isused.ServiceList=0;
+
+}
+
+static  void init_ServicePaymentSelectionReqType_PEVPubKey(struct ServicePaymentSelectionReqType_PEVPubKey* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServicePaymentSelectionReqType(struct ServicePaymentSelectionReqType* type)
+{
+	
+	init_ServiceListType(&(type->ServiceList));	
+	init_ServicePaymentSelectionReqType_PEVPubKey(&(type->PEVPubKey));
+
+}
+
+static  void init_ServicePaymentSelectionResType_MeteringAuthPubKey(struct ServicePaymentSelectionResType_MeteringAuthPubKey* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_ServicePaymentSelectionResType(struct ServicePaymentSelectionResType* type)
+{
+		
+	init_ServicePaymentSelectionResType_MeteringAuthPubKey(&(type->MeteringAuthPubKey));	
+	type->isused.MeteringAuthPubKey=0;
+
+}
+
+static  void init_PaymentDetailsReqType_ContractID(struct PaymentDetailsReqType_ContractID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_PaymentDetailsReqType(struct PaymentDetailsReqType* type)
+{
+	
+	init_PaymentDetailsReqType_ContractID(&(type->ContractID));
+
+}
+
+static  void init_PowerDiscoveryReqType(struct PowerDiscoveryReqType* type)
+{
+							
+
+}
+
+static  void init_PowerDiscoveryResType_EnergyProvider(struct PowerDiscoveryResType_EnergyProvider* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_TariffTableType_Currency(struct TariffTableType_Currency* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_TariffDescrType_TariffDescription(struct TariffDescrType_TariffDescription* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_TariffEntryType(struct TariffEntryType* type)
+{
+				
+	type->isused.EPrice=0;
+
+}
+
+static  void init_TariffEntriesType(struct TariffEntriesType* type)
+{
+	
+	init_TariffEntryType((type->TariffEntry));
+	type->arraylen.TariffEntry=0;
+
+}
+
+static  void init_TariffDescrType(struct TariffDescrType* type)
+{
+		
+	init_TariffDescrType_TariffDescription(&(type->TariffDescription));	
+	type->isused.TariffDescription=0;	
+	init_TariffEntriesType(&(type->TariffEntries));
+
+}
+
+static  void init_TariffTableType(struct TariffTableType* type)
+{
+	
+	init_TariffTableType_Currency(&(type->Currency));	
+	init_TariffDescrType((type->Tariff));
+	type->arraylen.Tariff=0;
+
+}
+
+static  void init_PowerDiscoveryResType(struct PowerDiscoveryResType* type)
+{
+						
+	init_PowerDiscoveryResType_EnergyProvider(&(type->EnergyProvider));	
+	type->isused.EnergyProvider=0;	
+	init_TariffTableType(&(type->TariffTable));	
+	type->isused.TariffTable=0;
+
+}
+
+static  void init_LineLockReqType(struct LineLockReqType* type)
+{
+		
+
+}
+
+static  void init_LineLockResType(struct LineLockResType* type)
+{
+		
+
+}
+
+static  void init_ChargingProfileType(struct ChargingProfileType* type)
+{
+		
+
+}
+
+static  void init_PowerDeliveryReqType(struct PowerDeliveryReqType* type)
+{
+				
+	type->isused.Tariff=0;	
+	init_ChargingProfileType(&(type->ChargingProfile));	
+	type->isused.ChargingProfile=0;
+
+}
+
+static  void init_MeteringStatusResType_EVSEID(struct MeteringStatusResType_EVSEID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_MeterInfoType_MeterID(struct MeterInfoType_MeterID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_MeterInfoType_MeterPubKey(struct MeterInfoType_MeterPubKey* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_MeterInfoType(struct MeterInfoType* type)
+{
+	
+	init_MeterInfoType_MeterID(&(type->MeterID));	
+	type->isused.MeterID=0;	
+	init_MeterInfoType_MeterPubKey(&(type->MeterPubKey));	
+	type->isused.MeterPubKey=0;		
+	type->isused.MeterReading=0;		
+	type->isused.MeterStatus=0;		
+	type->isused.TMeter=0;
+
+}
+
+static  void init_MeteringStatusResType(struct MeteringStatusResType* type)
+{
+		
+	init_MeteringStatusResType_EVSEID(&(type->EVSEID));					
+	type->isused.PCurrent=0;	
+	init_MeterInfoType(&(type->MeterInfo));	
+	type->isused.MeterInfo=0;
+
+}
+
+static  void init_MeteringReceiptReqType_PEVID(struct MeteringReceiptReqType_PEVID* type)
+{
+	
+	type->arraylen.data=0;
+
+}
+
+static  void init_MeteringReceiptReqType(struct MeteringReceiptReqType* type)
+{
+	
+	init_MeteringReceiptReqType_PEVID(&(type->PEVID));	
+	type->isused.PEVID=0;			
+	type->isused.TCurrent=0;		
+	init_MeterInfoType(&(type->MeterInfo));
+
+}
+
+static  void init_BodyType(struct BodyType* type)
+{
+	
+	init_SessionSetupReqType(&(type->SessionSetupReq));	
+	type->isused.SessionSetupReq=0;	
+	init_SessionSetupResType(&(type->SessionSetupRes));	
+	type->isused.SessionSetupRes=0;	
+	init_ServiceDiscoveryReqType(&(type->ServiceDiscoveryReq));	
+	type->isused.ServiceDiscoveryReq=0;	
+	init_ServiceDiscoveryResType(&(type->ServiceDiscoveryRes));	
+	type->isused.ServiceDiscoveryRes=0;	
+	init_ServicePaymentSelectionReqType(&(type->ServicePaymentSelectionReq));	
+	type->isused.ServicePaymentSelectionReq=0;	
+	init_ServicePaymentSelectionResType(&(type->ServicePaymentSelectionRes));	
+	type->isused.ServicePaymentSelectionRes=0;	
+	init_PaymentDetailsReqType(&(type->PaymentDetailsReq));	
+	type->isused.PaymentDetailsReq=0;		
+	type->isused.PaymentDetailsRes=0;	
+	init_PowerDiscoveryReqType(&(type->PowerDiscoveryReq));	
+	type->isused.PowerDiscoveryReq=0;	
+	init_PowerDiscoveryResType(&(type->PowerDiscoveryRes));	
+	type->isused.PowerDiscoveryRes=0;	
+	init_LineLockReqType(&(type->LineLockReq));	
+	type->isused.LineLockReq=0;	
+	init_LineLockResType(&(type->LineLockRes));	
+	type->isused.LineLockRes=0;	
+	init_PowerDeliveryReqType(&(type->PowerDeliveryReq));	
+	type->isused.PowerDeliveryReq=0;		
+	type->isused.PowerDeliveryRes=0;		
+	type->isused.MeteringStatusReq=0;	
+	init_MeteringStatusResType(&(type->MeteringStatusRes));	
+	type->isused.MeteringStatusRes=0;	
+	init_MeteringReceiptReqType(&(type->MeteringReceiptReq));	
+	type->isused.MeteringReceiptReq=0;		
+	type->isused.MeteringReceiptRes=0;
+
+}
+ void init_AnonType_V2G_Message(struct AnonType_V2G_Message* type)
+{
+	
+	init_HeaderType(&(type->Header));	
+	init_BodyType(&(type->Body));
+
+}

+ 1047 - 0
src/service/v2g_serviceDataTypes.h

@@ -0,0 +1,1047 @@
+
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SERVICEDATATYPES_H
+#define SERVICEDATATYPES_H
+
+#include "../codec/EXITypes.h"
+
+
+	
+
+enum faultCodeType
+{
+	ParsingError, 
+	V2GProtocolVersionNotSupported, 
+	UnknownError
+
+}; 
+
+enum eventEntryType
+{
+	InitiateSessionSetup, 
+	InitiateServiceDiscovery, 
+	InitiatePowerDiscovery, 
+	InitiateLineLock, 
+	InitiatePowerDelivery, 
+	InitiateInitiateMeteringStatus
+
+}; 
+
+enum responseCode_SessionSetupType
+{
+	OK_SessionSetup, 
+	OK_NewSessionEstablished, 
+	OK_OldSessionJoined, 
+	FAILED_UnknownSession, 
+	FAILED_SessionEstablishmentError, 
+	FAILED_UnknownError_InSessionSetup
+
+}; 
+
+enum serviceTypeType
+{
+	PEV_Recharge, 
+	Remote_Customer_Support, 
+	Internet, 
+	Other
+
+}; 
+
+enum responseCode_ServiceDiscoveryType
+{
+	OK_ServiceDiscovery, 
+	FAILED_NoServicesOfThisType, 
+	FAILED_NoServicesInThisScope, 
+	FAILED_NoServicesOfThisTypeScope, 
+	FAILED_NoServicesFound, 
+	FAILED_UnknownError_InServiceDiscovery
+
+}; 
+
+enum responseCode_ServicePaymentSelectionType
+{
+	OK_ServicePaymentSelection, 
+	FAILED_ServiceSelectionInvalid, 
+	FAILED_PaymentSelectionInvalid, 
+	FAILED_UnknownError_InServicePaymentSelection
+
+}; 
+
+enum responseCode_PaymentDetailsType
+{
+	OK_PaymentDetails, 
+	FAILED_PaymentDetailsInvalid, 
+	FAILED_UnknownError
+
+}; 
+
+enum unitMultiplierType
+{
+	d, 
+	c, 
+	m, 
+	micro, 
+	n, 
+	p, 
+	k, 
+	M, 
+	G, 
+	T, 
+	none
+
+}; 
+
+enum responseCode_PowerDiscoveryType
+{
+	OK_PowerDiscovery, 
+	FAILED_UnknownError_InPowerDiscovery
+
+}; 
+
+enum tariffIDType
+{
+	Standard_charge, 
+	Fast_charge, 
+	Green_charge, 
+	Grid_friendly_charge, 
+	Freely_parameterisable_charge, 
+	Charge_under_reserve
+
+}; 
+
+enum responseCode_LineLockType
+{
+	OK_LineLock, 
+	FAILED_LineLockNotApplied, 
+	FAILED_UnknownError_InLineLock
+
+}; 
+
+enum responseCode_PowerDeliveryType
+{
+	OK_PowerDelivery, 
+	FAILED_PowerDeliveryNotApplied, 
+	FAILED_TariffSelectionInvalid, 
+	FAILED_ChargingProfileInvalid, 
+	FAILED_UnknownError_InPowerDelivery
+
+}; 
+
+enum responseCode_MeteringStatusType
+{
+	OK_MeteringStatus, 
+	FAILED_UnknownError_InMeteringStatus
+
+}; 
+
+enum responseCode_MeteringReceiptType
+{
+	OK_MeteringReceipt, 
+	FAILED_UnknownError_MeteringReceipt
+
+}; 
+
+
+
+
+struct arraylen_SessionInformationType_SessionID
+{
+	size_t data;
+
+
+};
+
+
+struct SessionInformationType_SessionID
+{
+	uint8_t data[8];
+	struct arraylen_SessionInformationType_SessionID arraylen;
+
+};
+
+
+struct arraylen_SessionInformationType_ServiceSessionID
+{
+	size_t data;
+
+
+};
+
+
+struct SessionInformationType_ServiceSessionID
+{
+	uint8_t data[8];
+	struct arraylen_SessionInformationType_ServiceSessionID arraylen;
+
+};
+
+
+struct selection_SessionInformationType
+{
+	int ServiceSessionID:1;
+	int ProtocolVersion:1;
+
+
+};
+
+
+struct arraylen_SessionInformationType_ProtocolVersion
+{
+	size_t data;
+
+
+};
+
+
+struct SessionInformationType_ProtocolVersion
+{
+	uint32_t data[256];
+	struct arraylen_SessionInformationType_ProtocolVersion arraylen;
+
+};
+
+
+struct SessionInformationType
+{
+	struct SessionInformationType_SessionID SessionID;
+	struct SessionInformationType_ServiceSessionID ServiceSessionID;
+	struct SessionInformationType_ProtocolVersion ProtocolVersion;
+	struct selection_SessionInformationType isused;
+
+};
+
+
+struct selection_NotificationType
+{
+	int FaultCode:1;
+	int FaultMsg:1;
+	int EventList:1;
+
+
+};
+
+
+struct arraylen_NotificationType_FaultMsg
+{
+	size_t data;
+
+
+};
+
+
+struct NotificationType_FaultMsg
+{
+	uint32_t data[256];
+	struct arraylen_NotificationType_FaultMsg arraylen;
+
+};
+
+
+struct EventListType
+{
+	enum eventEntryType Event;
+
+
+};
+
+
+struct NotificationType
+{
+	enum faultCodeType FaultCode;
+	struct NotificationType_FaultMsg FaultMsg;
+	struct EventListType EventList;
+	struct selection_NotificationType isused;
+
+};
+
+
+struct selection_HeaderType
+{
+	int Notification:1;
+
+
+};
+
+
+struct HeaderType
+{
+	struct SessionInformationType SessionInformation;
+	struct NotificationType Notification;
+	struct selection_HeaderType isused;
+
+};
+
+
+struct arraylen_SessionSetupReqType_PEVID
+{
+	size_t data;
+
+
+};
+
+
+struct SessionSetupReqType_PEVID
+{
+	uint32_t data[32];
+	struct arraylen_SessionSetupReqType_PEVID arraylen;
+
+};
+
+
+struct selection_SessionSetupReqType
+{
+	int PEVID:1;
+
+
+};
+
+
+struct PEVStatusType
+{
+	int ConnectorLocked;
+	int ChargerStandby;
+
+
+};
+
+
+struct SessionSetupReqType
+{
+	struct SessionSetupReqType_PEVID PEVID;
+	struct PEVStatusType PEVStatus;
+	struct selection_SessionSetupReqType isused;
+
+};
+
+
+struct selection_BodyType
+{
+	int SessionSetupReq:1;
+	int SessionSetupRes:1;
+	int ServiceDiscoveryReq:1;
+	int ServiceDiscoveryRes:1;
+	int ServicePaymentSelectionReq:1;
+	int ServicePaymentSelectionRes:1;
+	int PaymentDetailsReq:1;
+	int PaymentDetailsRes:1;
+	int PowerDiscoveryReq:1;
+	int PowerDiscoveryRes:1;
+	int LineLockReq:1;
+	int LineLockRes:1;
+	int PowerDeliveryReq:1;
+	int PowerDeliveryRes:1;
+	int MeteringStatusReq:1;
+	int MeteringStatusRes:1;
+	int MeteringReceiptReq:1;
+	int MeteringReceiptRes:1;
+
+
+};
+
+
+struct arraylen_SessionSetupResType_EVSEID
+{
+	size_t data;
+
+
+};
+
+
+struct SessionSetupResType_EVSEID
+{
+	uint8_t data[32];
+	struct arraylen_SessionSetupResType_EVSEID arraylen;
+
+};
+
+
+struct EVSEStatusType
+{
+	int FatalError;
+	int EVSEStandby;
+	int ConnectorLocked;
+	int PowerSwitchClosed;
+	int RCD;
+	int64_t ShutDownTime;
+
+
+};
+
+
+struct SessionSetupResType
+{
+	enum responseCode_SessionSetupType ResponseCode;
+	struct SessionSetupResType_EVSEID EVSEID;
+	struct EVSEStatusType EVSEStatus;
+	int64_t TCurrent;
+
+
+};
+
+
+struct selection_ServiceDiscoveryReqType
+{
+	int ServiceType:1;
+	int ServiceScope:1;
+
+
+};
+
+
+struct arraylen_ServiceDiscoveryReqType_ServiceScope
+{
+	size_t data;
+
+
+};
+
+
+struct ServiceDiscoveryReqType_ServiceScope
+{
+	uint32_t data[255];
+	struct arraylen_ServiceDiscoveryReqType_ServiceScope arraylen;
+
+};
+
+
+struct ServiceDiscoveryReqType
+{
+	enum serviceTypeType ServiceType;
+	struct ServiceDiscoveryReqType_ServiceScope ServiceScope;
+	struct selection_ServiceDiscoveryReqType isused;
+
+};
+
+
+struct arraylen_ServiceDescriptionType_ServiceID
+{
+	size_t data;
+
+
+};
+
+
+struct ServiceDescriptionType_ServiceID
+{
+	uint8_t data[8];
+	struct arraylen_ServiceDescriptionType_ServiceID arraylen;
+
+};
+
+
+struct arraylen_ServiceDescriptionType_ServiceName
+{
+	size_t data;
+
+
+};
+
+
+struct ServiceDescriptionType_ServiceName
+{
+	uint32_t data[64];
+	struct arraylen_ServiceDescriptionType_ServiceName arraylen;
+
+};
+
+
+struct selection_ServiceDescriptionType
+{
+	int ServiceName:1;
+	int ServiceType:1;
+	int ServiceScope:1;
+
+
+};
+
+
+struct arraylen_ServiceDescriptionType_ServiceScope
+{
+	size_t data;
+
+
+};
+
+
+struct ServiceDescriptionType_ServiceScope
+{
+	uint32_t data[255];
+	struct arraylen_ServiceDescriptionType_ServiceScope arraylen;
+
+};
+
+
+struct ServiceDescriptionType
+{
+	struct ServiceDescriptionType_ServiceID ServiceID;
+	struct ServiceDescriptionType_ServiceName ServiceName;
+	enum serviceTypeType ServiceType;
+	struct ServiceDescriptionType_ServiceScope ServiceScope;
+	struct selection_ServiceDescriptionType isused;
+
+};
+
+
+struct arraylen_ServiceListType
+{
+	size_t Service;
+
+
+};
+
+
+struct ServiceListType
+{
+	struct ServiceDescriptionType Service[8];
+	struct arraylen_ServiceListType arraylen;
+
+};
+
+
+struct selection_ServiceDiscoveryResType
+{
+	int ServiceList:1;
+
+
+};
+
+
+struct ServiceDiscoveryResType
+{
+	enum responseCode_ServiceDiscoveryType ResponseCode;
+	struct ServiceListType ServiceList;
+	struct selection_ServiceDiscoveryResType isused;
+
+};
+
+
+struct arraylen_ServicePaymentSelectionReqType_PEVPubKey
+{
+	size_t data;
+
+
+};
+
+
+struct ServicePaymentSelectionReqType_PEVPubKey
+{
+	uint8_t data[64];
+	struct arraylen_ServicePaymentSelectionReqType_PEVPubKey arraylen;
+
+};
+
+
+struct ServicePaymentSelectionReqType
+{
+	struct ServiceListType ServiceList;
+	struct ServicePaymentSelectionReqType_PEVPubKey PEVPubKey;
+
+
+};
+
+
+struct arraylen_ServicePaymentSelectionResType_MeteringAuthPubKey
+{
+	size_t data;
+
+
+};
+
+
+struct ServicePaymentSelectionResType_MeteringAuthPubKey
+{
+	uint8_t data[64];
+	struct arraylen_ServicePaymentSelectionResType_MeteringAuthPubKey arraylen;
+
+};
+
+
+struct selection_ServicePaymentSelectionResType
+{
+	int MeteringAuthPubKey:1;
+
+
+};
+
+
+struct ServicePaymentSelectionResType
+{
+	enum responseCode_ServicePaymentSelectionType ResponseCode;
+	struct ServicePaymentSelectionResType_MeteringAuthPubKey MeteringAuthPubKey;
+	struct selection_ServicePaymentSelectionResType isused;
+
+};
+
+
+struct arraylen_PaymentDetailsReqType_ContractID
+{
+	size_t data;
+
+
+};
+
+
+struct PaymentDetailsReqType_ContractID
+{
+	uint32_t data[128];
+	struct arraylen_PaymentDetailsReqType_ContractID arraylen;
+
+};
+
+
+struct PaymentDetailsReqType
+{
+	struct PaymentDetailsReqType_ContractID ContractID;
+
+
+};
+
+
+struct PaymentDetailsResType
+{
+	enum responseCode_PaymentDetailsType ResponseCode;
+
+
+};
+
+
+struct FloatingValueType
+{
+	enum unitMultiplierType Multiplier;
+	enum unitMultiplierType Unit;
+	int32_t Value;
+
+
+};
+
+
+struct PowerDiscoveryReqType
+{
+	struct PEVStatusType PEVStatus;
+	int64_t EoC;
+	struct FloatingValueType EAmount;
+	struct FloatingValueType PEVMaxPower;
+	int32_t PEVMaxPhases;
+	struct FloatingValueType PEVMaxVoltage;
+	struct FloatingValueType PEVMinVoltage;
+
+
+};
+
+
+struct arraylen_PowerDiscoveryResType_EnergyProvider
+{
+	size_t data;
+
+
+};
+
+
+struct PowerDiscoveryResType_EnergyProvider
+{
+	uint32_t data[256];
+	struct arraylen_PowerDiscoveryResType_EnergyProvider arraylen;
+
+};
+
+
+struct selection_PowerDiscoveryResType
+{
+	int EnergyProvider:1;
+	int TariffTable:1;
+
+
+};
+
+
+struct arraylen_TariffTableType_Currency
+{
+	size_t data;
+
+
+};
+
+
+struct TariffTableType_Currency
+{
+	uint32_t data[3];
+	struct arraylen_TariffTableType_Currency arraylen;
+
+};
+
+
+struct arraylen_TariffDescrType_TariffDescription
+{
+	size_t data;
+
+
+};
+
+
+struct TariffDescrType_TariffDescription
+{
+	uint32_t data[32];
+	struct arraylen_TariffDescrType_TariffDescription arraylen;
+
+};
+
+
+struct selection_TariffDescrType
+{
+	int TariffDescription:1;
+
+
+};
+
+
+struct selection_TariffEntryType
+{
+	int EPrice:1;
+
+
+};
+
+
+struct TariffEntryType
+{
+	uint32_t TariffStart;
+	struct FloatingValueType TariffPMax;
+	struct FloatingValueType EPrice;
+	struct selection_TariffEntryType isused;
+
+};
+
+
+struct arraylen_TariffEntriesType
+{
+	size_t TariffEntry;
+
+
+};
+
+
+struct TariffEntriesType
+{
+	struct TariffEntryType TariffEntry[8];
+	struct arraylen_TariffEntriesType arraylen;
+
+};
+
+
+struct TariffDescrType
+{
+	enum tariffIDType TariffID;
+	struct TariffDescrType_TariffDescription TariffDescription;
+	struct TariffEntriesType TariffEntries;
+	struct selection_TariffDescrType isused;
+
+};
+
+
+struct arraylen_TariffTableType
+{
+	size_t Tariff;
+
+
+};
+
+
+struct TariffTableType
+{
+	struct TariffTableType_Currency Currency;
+	struct TariffDescrType Tariff[6];
+	struct arraylen_TariffTableType arraylen;
+
+};
+
+
+struct PowerDiscoveryResType
+{
+	enum responseCode_PowerDiscoveryType ResponseCode;
+	struct EVSEStatusType EVSEStatus;
+	struct FloatingValueType EVSEVoltage;
+	struct FloatingValueType EVSEIMax;
+	int32_t EVSEMaxPhases;
+	struct PowerDiscoveryResType_EnergyProvider EnergyProvider;
+	struct TariffTableType TariffTable;
+	struct selection_PowerDiscoveryResType isused;
+
+};
+
+
+struct LineLockReqType
+{
+	struct PEVStatusType PEVStatus;
+	int ReqLockStatus;
+
+
+};
+
+
+struct LineLockResType
+{
+	enum responseCode_LineLockType ResponseCode;
+	struct EVSEStatusType EVSEStatus;
+
+
+};
+
+
+struct selection_PowerDeliveryReqType
+{
+	int Tariff:1;
+	int ChargingProfile:1;
+
+
+};
+
+
+struct ChargingProfileType
+{
+	int64_t ChargingProfileEntryStart;
+	struct FloatingValueType ChargingProfileEntryMaxPower;
+
+
+};
+
+
+struct PowerDeliveryReqType
+{
+	struct PEVStatusType PEVStatus;
+	int ReqSwitchStatus;
+	enum tariffIDType Tariff;
+	struct ChargingProfileType ChargingProfile;
+	struct selection_PowerDeliveryReqType isused;
+
+};
+
+
+struct PowerDeliveryResType
+{
+	enum responseCode_PowerDeliveryType ResponseCode;
+
+
+};
+
+
+struct MeteringStatusReqType
+{
+
+
+};
+
+
+struct arraylen_MeteringStatusResType_EVSEID
+{
+	size_t data;
+
+
+};
+
+
+struct MeteringStatusResType_EVSEID
+{
+	uint8_t data[32];
+	struct arraylen_MeteringStatusResType_EVSEID arraylen;
+
+};
+
+
+struct selection_MeteringStatusResType
+{
+	int PCurrent:1;
+	int MeterInfo:1;
+
+
+};
+
+
+struct arraylen_MeterInfoType_MeterID
+{
+	size_t data;
+
+
+};
+
+
+struct MeterInfoType_MeterID
+{
+	uint32_t data[32];
+	struct arraylen_MeterInfoType_MeterID arraylen;
+
+};
+
+
+struct selection_MeterInfoType
+{
+	int MeterID:1;
+	int MeterPubKey:1;
+	int MeterReading:1;
+	int MeterStatus:1;
+	int TMeter:1;
+
+
+};
+
+
+struct arraylen_MeterInfoType_MeterPubKey
+{
+	size_t data;
+
+
+};
+
+
+struct MeterInfoType_MeterPubKey
+{
+	uint8_t data[64];
+	struct arraylen_MeterInfoType_MeterPubKey arraylen;
+
+};
+
+
+struct MeterInfoType
+{
+	struct MeterInfoType_MeterID MeterID;
+	struct MeterInfoType_MeterPubKey MeterPubKey;
+	struct FloatingValueType MeterReading;
+	int32_t MeterStatus;
+	int64_t TMeter;
+	struct selection_MeterInfoType isused;
+
+};
+
+
+struct MeteringStatusResType
+{
+	enum responseCode_MeteringStatusType ResponseCode;
+	struct MeteringStatusResType_EVSEID EVSEID;
+	struct EVSEStatusType EVSEStatus;
+	int64_t TCurrent;
+	struct FloatingValueType EVSEMaxPower;
+	struct FloatingValueType PCurrent;
+	struct MeterInfoType MeterInfo;
+	struct selection_MeteringStatusResType isused;
+
+};
+
+
+struct arraylen_MeteringReceiptReqType_PEVID
+{
+	size_t data;
+
+
+};
+
+
+struct MeteringReceiptReqType_PEVID
+{
+	uint32_t data[32];
+	struct arraylen_MeteringReceiptReqType_PEVID arraylen;
+
+};
+
+
+struct selection_MeteringReceiptReqType
+{
+	int PEVID:1;
+	int TCurrent:1;
+
+
+};
+
+
+struct MeteringReceiptReqType
+{
+	struct MeteringReceiptReqType_PEVID PEVID;
+	struct PEVStatusType PEVStatus;
+	int64_t TCurrent;
+	enum tariffIDType Tariff;
+	struct MeterInfoType MeterInfo;
+	struct selection_MeteringReceiptReqType isused;
+
+};
+
+
+struct MeteringReceiptResType
+{
+	enum responseCode_MeteringReceiptType ResponseCode;
+
+
+};
+
+
+struct BodyType
+{
+	struct SessionSetupReqType SessionSetupReq;
+	struct SessionSetupResType SessionSetupRes;
+	struct ServiceDiscoveryReqType ServiceDiscoveryReq;
+	struct ServiceDiscoveryResType ServiceDiscoveryRes;
+	struct ServicePaymentSelectionReqType ServicePaymentSelectionReq;
+	struct ServicePaymentSelectionResType ServicePaymentSelectionRes;
+	struct PaymentDetailsReqType PaymentDetailsReq;
+	struct PaymentDetailsResType PaymentDetailsRes;
+	struct PowerDiscoveryReqType PowerDiscoveryReq;
+	struct PowerDiscoveryResType PowerDiscoveryRes;
+	struct LineLockReqType LineLockReq;
+	struct LineLockResType LineLockRes;
+	struct PowerDeliveryReqType PowerDeliveryReq;
+	struct PowerDeliveryResType PowerDeliveryRes;
+	struct MeteringStatusReqType MeteringStatusReq;
+	struct MeteringStatusResType MeteringStatusRes;
+	struct MeteringReceiptReqType MeteringReceiptReq;
+	struct MeteringReceiptResType MeteringReceiptRes;
+	struct selection_BodyType isused;
+
+};
+
+
+struct AnonType_V2G_Message
+{
+	struct HeaderType Header;
+	struct BodyType Body;
+
+
+};
+
+	
+/* init method of the V2G message */	
+void init_AnonType_V2G_Message(struct AnonType_V2G_Message* v2gMsg);
+
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 1358 - 0
src/service/v2g_serviceDispatcher.c

@@ -0,0 +1,1358 @@
+
+
+
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+
+#include "v2g_service.h"
+#include "v2g_serviceDispatcher.h"
+#include "v2g_serviceDataTypes.h"
+#include "v2g_serviceMethods.h"
+#include "v2g_serviceDataSerializiation.h"
+#include "../codec/EXITypes.h"
+#include "../codec/EXIDecoder.h"
+#include "../codec/EXIEncoder.h"
+
+
+/**
+ * Assigns an element value of the EXI stream into the service data structure 
+ */
+static int deserializeElementCharacter(struct v2gService* service)
+{
+
+	/* SessionID */	
+	 if(service->eqn.namespaceURI==5 && service->eqn.localPart==35)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Header.SessionInformation.SessionID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Header.SessionInformation.SessionID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ServiceSessionID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==33)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Header.SessionInformation.ServiceSessionID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Header.SessionInformation.ServiceSessionID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.SessionInformation.isused.ServiceSessionID=1;
+	}
+	
+	/* ProtocolVersion */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==25)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Header.SessionInformation.ProtocolVersion.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Header.SessionInformation.ProtocolVersion.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.SessionInformation.isused.ProtocolVersion=1;
+	}
+	
+	/* Event */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==9)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Header.Notification.EventList.Event=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* FaultCode */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==13)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Header.Notification.FaultCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.Notification.isused.FaultCode=1;
+	}
+	
+	/* FaultMsg */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==14)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Header.Notification.FaultMsg.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Header.Notification.FaultMsg.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Header.Notification.isused.FaultMsg=1;
+	}
+	
+	/* ConnectorLocked */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==4)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupReq.PEVStatus.ConnectorLocked=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ChargerStandby */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==0)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupReq.PEVStatus.ChargerStandby=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==26)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.SessionSetupReq.PEVID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.SessionSetupReq.PEVID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.SessionSetupReq.isused.PEVID=1;
+	}
+	
+	/* FatalError */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==12)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.FatalError=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEStandby */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==7)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.EVSEStandby=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ConnectorLocked */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==4)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ConnectorLocked=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PowerSwitchClosed */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==24)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.PowerSwitchClosed=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* RCD */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==26)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.RCD=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ShutDownTime */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==37)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ShutDownTime=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==3)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.SessionSetupRes.EVSEID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.SessionSetupRes.EVSEID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==63)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.SessionSetupRes.TCurrent=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ServiceType */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==58)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.ServiceDiscoveryReq.ServiceType=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryReq.isused.ServiceType=1;
+	}
+	
+	/* ServiceScope */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==57)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryReq.ServiceScope.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.ServiceDiscoveryReq.ServiceScope.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryReq.isused.ServiceScope=1;
+	}
+	
+	/* ServiceID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==29)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ServiceName */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==31)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceName.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceName.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceName=1;
+	}
+	
+	/* ServiceType */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==34)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceType=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceType=1;
+	}
+	
+	/* ServiceScope */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==32)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceScope.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceScope.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceScope=1;
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVPubKey */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==31)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.ServicePaymentSelectionReq.PEVPubKey.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.ServicePaymentSelectionReq.PEVPubKey.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* MeteringAuthPubKey */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==16)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.ServicePaymentSelectionRes.MeteringAuthPubKey.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.ServicePaymentSelectionRes.MeteringAuthPubKey.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.ServicePaymentSelectionRes.isused.MeteringAuthPubKey=1;
+	}
+	
+	/* ContractID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==1)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PaymentDetailsReq.ContractID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PaymentDetailsReq.ContractID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Multiplier */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==21)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Multiplier=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Unit */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==50)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Unit=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Value */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==51)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Value=service->val.int32;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EoC */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==10)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryReq.EoC=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVMaxPhases */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==27)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxPhases=service->val.int32;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TariffStart */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==48)
+	{
+		if(service->val.type == UNSIGNED_INTEGER_32) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.TariffEntry[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.arraylen.TariffEntry].TariffStart=service->val.uint32;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TariffID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==46)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffID=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TariffDescription */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==41)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffDescription.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffDescription.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].isused.TariffDescription=1;
+	}
+	
+	/* Currency */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==5)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Currency.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Currency.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEMaxPhases */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==5)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			service->v2gMsg.Body.PowerDiscoveryRes.EVSEMaxPhases=service->val.int32;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EnergyProvider */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==9)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.PowerDiscoveryRes.EnergyProvider.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.PowerDiscoveryRes.EnergyProvider.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.isused.EnergyProvider=1;
+	}
+	
+	/* ReqLockStatus */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==45)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.LineLockReq.ReqLockStatus=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ChargingProfileEntryStart */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==2)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.PowerDeliveryReq.ChargingProfile.ChargingProfileEntryStart=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ReqSwitchStatus */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==46)
+	{
+		if(service->val.type == BOOLEAN) 
+		{
+			service->v2gMsg.Body.PowerDeliveryReq.ReqSwitchStatus=service->val.boolean;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* Tariff */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==64)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PowerDeliveryReq.Tariff=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.PowerDeliveryReq.isused.Tariff=1;
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* MeterID */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==16)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterID=1;
+	}
+	
+	/* MeterPubKey */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==18)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterPubKey.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterPubKey.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterPubKey=1;
+	}
+	
+	/* MeterStatus */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==20)
+	{
+		if(service->val.type == INTEGER_16) 
+		{
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterStatus=service->val.int32;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterStatus=1;
+	}
+	
+	/* TMeter */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==38)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.MeteringStatusRes.MeterInfo.TMeter=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.TMeter=1;
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* EVSEID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==3)
+	{
+		if(service->val.type == BINARY_HEX) 
+		{
+			/* array copy and array length assignment */
+			memcpy(service->v2gMsg.Body.MeteringStatusRes.EVSEID.data, service->val.binary.data,service->val.binary.len);
+			service->v2gMsg.Body.MeteringStatusRes.EVSEID.arraylen.data = service->val.binary.len;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* TCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==63)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.MeteringStatusRes.TCurrent=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* PEVID */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==26)
+	{
+		if(service->val.type == STRING) 
+		{
+			/* string copy and string length assignment */
+			memcpy(service->v2gMsg.Body.MeteringReceiptReq.PEVID.data, service->val.string.codepoints,service->val.string.len);
+			service->v2gMsg.Body.MeteringReceiptReq.PEVID.arraylen.data = service->val.string.len;
+
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringReceiptReq.isused.PEVID=1;
+	}
+	
+	/* TCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==63)
+	{
+		if(service->val.type == INTEGER_64) 
+		{
+			service->v2gMsg.Body.MeteringReceiptReq.TCurrent=service->val.int64;
+		}
+		else
+		{
+			return -1;
+		}
+		/* is used */
+		service->v2gMsg.Body.MeteringReceiptReq.isused.TCurrent=1;
+	}
+	
+	/* Tariff */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==64)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.MeteringReceiptReq.Tariff=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	/* ResponseCode */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==47)
+	{
+		if(service->val.type == ENUMERATION) 
+		{
+			service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+	
+	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 v2gService* service)
+{
+
+	/* EventList */	
+	 if(service->eqn.namespaceURI==5 && service->eqn.localPart==10)
+	{
+ 		/* is used */
+		service->v2gMsg.Header.Notification.isused.EventList=1;
+		
+	}
+	
+	/* Notification */	
+	else  if(service->eqn.namespaceURI==6 && service->eqn.localPart==6)
+	{
+ 		/* is used */
+		service->v2gMsg.Header.isused.Notification=1;
+		
+	}
+	
+	/* ServiceList */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==52)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.ServiceDiscoveryRes.isused.ServiceList=1;
+		
+	}
+	
+	/* EPrice */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==6)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.TariffEntry[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffEntries.arraylen.TariffEntry].isused.EPrice=1;
+		
+	}
+	
+	/* TariffTable */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==65)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.PowerDiscoveryRes.isused.TariffTable=1;
+		
+	}
+	
+	/* ChargingProfile */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==0)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.PowerDeliveryReq.isused.ChargingProfile=1;
+		
+	}
+	
+	/* MeterReading */	
+	else  if(service->eqn.namespaceURI==5 && service->eqn.localPart==19)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterReading=1;
+		
+	}
+	
+	/* PCurrent */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==25)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.isused.PCurrent=1;
+		
+	}
+	
+	/* MeterInfo */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==15)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.MeteringStatusRes.isused.MeterInfo=1;
+		
+	}
+	
+	/* SessionSetupReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==59)
+	{
+ 		
+		/* service call */
+		sessionSetup(&(service->v2gMsg.Body.SessionSetupReq), &(service->v2gMsg.Body.SessionSetupRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.SessionSetupRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* SessionSetupRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==61)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.SessionSetupRes=1;
+		
+	}
+	
+	/* ServiceDiscoveryReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==48)
+	{
+ 		
+		/* service call */
+		serviceDiscovery(&(service->v2gMsg.Body.ServiceDiscoveryReq), &(service->v2gMsg.Body.ServiceDiscoveryRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.ServiceDiscoveryRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* ServiceDiscoveryRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==50)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.ServiceDiscoveryRes=1;
+		
+	}
+	
+	/* ServicePaymentSelectionReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==53)
+	{
+ 		
+		/* service call */
+		selectedServicePayment(&(service->v2gMsg.Body.ServicePaymentSelectionReq), &(service->v2gMsg.Body.ServicePaymentSelectionRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.ServicePaymentSelectionRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* ServicePaymentSelectionRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==55)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.ServicePaymentSelectionRes=1;
+		
+	}
+	
+	/* PaymentDetailsReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==33)
+	{
+ 		
+		/* service call */
+		paymentDetails(&(service->v2gMsg.Body.PaymentDetailsReq), &(service->v2gMsg.Body.PaymentDetailsRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.PaymentDetailsRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* PaymentDetailsRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==35)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PaymentDetailsRes=1;
+		
+	}
+	
+	/* PowerDiscoveryReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==41)
+	{
+ 		
+		/* service call */
+		powerDiscovery(&(service->v2gMsg.Body.PowerDiscoveryReq), &(service->v2gMsg.Body.PowerDiscoveryRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.PowerDiscoveryRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* PowerDiscoveryRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==43)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PowerDiscoveryRes=1;
+		
+	}
+	
+	/* LineLockReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==11)
+	{
+ 		
+		/* service call */
+		lineLock(&(service->v2gMsg.Body.LineLockReq), &(service->v2gMsg.Body.LineLockRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.LineLockRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* LineLockRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==13)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.LineLockRes=1;
+		
+	}
+	
+	/* PowerDeliveryReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==37)
+	{
+ 		
+		/* service call */
+		powerDelivery(&(service->v2gMsg.Body.PowerDeliveryReq), &(service->v2gMsg.Body.PowerDeliveryRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.PowerDeliveryRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* PowerDeliveryRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==39)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.PowerDeliveryRes=1;
+		
+	}
+	
+	/* MeteringStatusReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==21)
+	{
+ 		
+		/* service call */
+		meteringStatus(&(service->v2gMsg.Body.MeteringStatusReq), &(service->v2gMsg.Body.MeteringStatusRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.MeteringStatusRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* MeteringStatusRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==23)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.MeteringStatusRes=1;
+		
+	}
+	
+	/* MeteringReceiptReq */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==17)
+	{
+ 		
+		/* service call */
+		meteringReceipt(&(service->v2gMsg.Body.MeteringReceiptReq), &(service->v2gMsg.Body.MeteringReceiptRes));
+				
+		/* signalize the response message */
+		service->v2gMsg.Body.isused.MeteringReceiptRes=1;
+		
+		/* marshall the response data */
+		serialize_message(service); 
+				
+				
+			
+		
+	}
+	
+	/* MeteringReceiptRes */	
+	else  if(service->eqn.namespaceURI==4 && service->eqn.localPart==19)
+	{
+ 		/* is used */
+		service->v2gMsg.Body.isused.MeteringReceiptRes=1;
+		
+	}
+	
+	return 0;
+}
+
+
+/** 
+ * Deserialize the EXI stream
+ * @return 0 = 0K; -1 = ERROR
+ */
+static int deserializeMessage(struct v2gService* service)
+{
+	int noEndOfDocument = 1; /* true */
+	int errno;
+#ifdef DEBUG
+	const char * localName;
+	const char * namespaceURI;
+#endif
+
+	do {
+			exiDecodeNextEvent(&(service->inStream), &(service->stateDecode), &(service->event));
+			if (errno < 0) {
+				printf("[ERROR] %d \n", errno);
+				return errno;
+			}
+
+			switch (service->event) {
+			case START_DOCUMENT:
+
+				errno = exiDecodeStartDocument(&(service->inStream), &(service->stateDecode));
+
+				break;
+			case END_DOCUMENT:
+
+				errno = exiDecodeEndDocument(&(service->inStream), &(service->stateDecode));
+				noEndOfDocument = 0; /* false */
+				break;
+			case START_ELEMENT:
+				errno = exiDecodeStartElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				 
+				break;
+			case END_ELEMENT:
+
+				errno = exiDecodeEndElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
+				errno = deserializeElementOrServiceCall(service);
+				 
+				break;
+			case CHARACTERS:
+				/* decode */
+				errno = exiDecodeCharacters(&(service->inStream), &(service->stateDecode), &(service->val));
+				 
+				/* assign data to the v2g message structure */
+				errno = deserializeElementCharacter(service);
+				break;
+			case ATTRIBUTE:
+				/* decode */
+				/*	errno = exiDecodeAttribute(&isStream, &stateDecode, &eqn, &val); */
+				break;
+			default:
+				/* ERROR */
+				return -1;
+			}
+
+		} while (noEndOfDocument);
+
+	return 0;
+}
+
+
+/** 
+ * Takes the EXI stream, invokes the called service method, and provides the response EXI stream 
+ * @return 0 = 0K; -1 = ERROR
+ */
+int messageDispatcher(struct v2gService* service, uint8_t* inStream, size_t sizeInStream, size_t* inPos, uint8_t* outStream, size_t sizeOutStream, size_t* outPos)
+{
+
+	int responseCode;
+
+	/* assign inStream data to service v2g structure */
+	service->inStream.data = inStream;
+	service->inStream.size = sizeInStream;
+	service->inStream.pos = inPos;
+	service->inStream.buffer=0;
+	service->inStream.capacity=0;
+	
+	
+	
+	/* assign outStream data to service v2g structure */
+	service->outStream.data = outStream;
+	service->outStream.size = sizeOutStream;
+	service->outStream.pos = outPos;
+	service->outStream.buffer=0;
+	service->outStream.capacity=8;
+	
+	
+	/* init EXI decoder (read header, set initial state) */
+	exiInitDecoder(&(service->inStream), &(service->stateDecode));
+	
+	/* init EXI encoder (write header, set initial state) */
+	exiInitEncoder(&(service->outStream), &(service->stateEncode));
+
+	/* init v2g message */
+	init_AnonType_V2G_Message(&(service->v2gMsg));
+
+	/* deserialize the input stream and call the corresponding service */
+	responseCode = deserializeMessage(service);
+	
+	
+
+	if(responseCode<0)
+	{
+		/* an error occurred */
+		return -1;
+	} else if(responseCode==1)
+	{
+		
+		return 0;
+	}
+
+
+	return 0;
+
+}
+
+/** 
+ * Init the service
+ * @return 0 = 0K; -1 = ERROR
+ */
+int init_v2gservice(struct v2gService* service, bytes_t bytes, string_ucs_t string)
+{
+
+	/* init byte array */
+	 service->val.binary = bytes;
+
+	/* init string array */
+	 service->val.string = string;
+
+
+	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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef V2GSERVER_H_
+#define V2GSERVER_H_
+
+#include "v2g_serviceDataTypes.h"
+
+
+int init_v2gservice(struct v2gService* service,bytes_t bytes, string_ucs_t string);
+int messageDispatcher(struct v2gService* service, uint8_t* inStream, size_t sizeInStream, size_t* inPos, uint8_t* outStream, size_t sizeOutStream, size_t* outPos);
+
+#endif /* V2GSERVER_H_ */
+
+#ifdef __cplusplus
+}
+#endif

+ 64 - 0
src/service/v2g_serviceMethods.h

@@ -0,0 +1,64 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+ 
+ #ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SERVICEMETHODS_H
+#define SERVICEMETHODS_H
+
+#include "v2g_serviceDataTypes.h"
+#include "../codec/EXITypes.h"
+
+/* service methods */
+int	sessionSetup(struct SessionSetupReqType* param, struct SessionSetupResType* result);
+					
+int	serviceDiscovery(struct ServiceDiscoveryReqType* param, struct ServiceDiscoveryResType* result);
+					
+int	selectedServicePayment(struct ServicePaymentSelectionReqType* param, struct ServicePaymentSelectionResType* result);
+					
+int	paymentDetails(struct PaymentDetailsReqType* param, struct PaymentDetailsResType* result);
+					
+int	powerDiscovery(struct PowerDiscoveryReqType* param, struct PowerDiscoveryResType* result);
+					
+int	lineLock(struct LineLockReqType* param, struct LineLockResType* result);
+					
+int	powerDelivery(struct PowerDeliveryReqType* param, struct PowerDeliveryResType* result);
+					
+int	meteringStatus(struct MeteringStatusReqType* param, struct MeteringStatusResType* result);
+					
+int	meteringReceipt(struct MeteringReceiptReqType* param, struct MeteringReceiptResType* result);
+						
+	
+
+	
+	
+	
+#endif
+
+#ifdef __cplusplus
+}
+#endif

+ 1 - 1
src/test/main_codec.c

@@ -43,7 +43,7 @@
 uint8_t data[ARRAY_SIZE_BYTES];
 uint32_t codepoints[ARRAY_SIZE_STRINGS];
 
-int main(int argc, char *argv[]) {
+int mainX(int argc, char *argv[]) {
 
 	int errn = 0;
 	unsigned int i;

+ 114 - 0
src/test/main_service.c

@@ -0,0 +1,114 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+
+
+#include "service/v2g_service.h"
+#include "service/v2g_serviceDataTypes.h"
+#include "service/v2g_serviceClientStubs.h"
+#include "codec/EXITypes.h"
+#include "codec/BitStream.h"
+
+#include <stdlib.h>
+
+#define MAX_BYTE_SIZE 128
+#define MAX_STRING_SIZE 256
+#define MAX_STREAM_SIZE 60
+
+int main(int argc, char *argv[])
+{
+
+	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 */
+
+	/* service data structure */
+	struct v2gService service;
+	struct HeaderType v2gHeader;
+	struct SessionSetupReqType sessionSetup;
+	struct SessionSetupResType resultSessionSetup;
+/*	struct PowerDiscoveryReqType powerDiscovery;
+	struct PowerDiscoveryResType resultPowerDiscovery;
+*/
+
+	/* 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 };
+
+
+
+	printf("+++Start V2G Client / Service Example+++\n\n");
+
+	/*******************
+	 * Init V2G Client *
+	 *******************/
+
+	init_v2gServiceClient(&service,bytes,string,inStream,MAX_STREAM_SIZE, outStream, MAX_STREAM_SIZE);
+
+	/*******************************
+	 * Setup data for sessionSetup *
+	 *******************************/
+
+	/* setup header information */
+	v2gHeader.SessionInformation.ServiceSessionID.arraylen.data = 0; /* no session id in the initial message -> array length = 0*/
+	v2gHeader.SessionInformation.ProtocolVersion.data[0]='1'; /* assign protocol version number*/
+	v2gHeader.SessionInformation.ProtocolVersion.arraylen.data=1; /* array string length =1 of protocol version */
+	v2gHeader.SessionInformation.isused.ProtocolVersion = 1; /* important: signalize, protocol version is used */
+	v2gHeader.isused.Notification=0; /* no notification */
+
+	/* setup sessionSetup parameter */
+	sessionSetup.isused.PEVID=1; /* no PEVID is transported */
+	sessionSetup.PEVStatus.ChargerStandby=1; /* charger standby = true */
+	sessionSetup.PEVStatus.ConnectorLocked=0; /* connector locked = false */
+
+
+	printf("PEV: call EVSE sessionSetup\n");
+	/*********************
+	 * Call sessionSetup *
+	 *********************/
+	call_sessionSetup(&service,&v2gHeader,&sessionSetup,&resultSessionSetup);
+
+	/* show result of the answer message of EVSE sessionSetup*/
+	printf("PEV: received response message from EVSE\n");
+	printf("\tResponseCode=%d\n",resultSessionSetup.ResponseCode);
+	printf("\tEVSEID=%d\n",	resultSessionSetup.EVSEID.data[0]);
+	printf("\tEVSEStatus:\n\t\tConnectorLocked=%d\n",resultSessionSetup.EVSEStatus.ConnectorLocked);
+	printf("\t\tEVSEStandby=%d\n",resultSessionSetup.EVSEStatus.EVSEStandby);
+	printf("\t\tFatalError=%d\n",resultSessionSetup.EVSEStatus.FatalError);
+	printf("\t\tPowerSwitchClosed=%d\n",resultSessionSetup.EVSEStatus.PowerSwitchClosed);
+	printf("\t\tRCD=%d\n",resultSessionSetup.EVSEStatus.RCD);
+	printf("\t\tShutDownTime=%ld\n",resultSessionSetup.EVSEStatus.ShutDownTime);
+	printf("\tTCurrent=%ld\n",resultSessionSetup.TCurrent);
+
+	printf("\n+++Terminate V2G Client / Service Example+++");
+
+	return 0;
+}
+

+ 69 - 0
src/test/v2g_server.c

@@ -0,0 +1,69 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#include "v2g_server.h"
+#include "service/v2g_service.h"
+#include "service/v2g_serviceDispatcher.h"
+
+#define MAX_BYTE_SIZE 128
+#define MAX_STRING_SIZE 256
+#define MAX_STREAM_SIZE 60
+
+int testV2GService(uint8_t* inStream, size_t inStreamLength, uint8_t* outStream)
+{
+	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*/
+
+	size_t posIn, posOut;
+
+	struct v2gService service;
+
+	/* 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						  *
+	 **********************************************/
+
+	init_v2gservice(&service, bytes, string);
+
+	/* assign the position where to read / write in the inStream / outStream */
+	posIn=0;
+	posOut=0;
+
+	/****************************************************************************
+	 * Pass the received EXI message stream (inStream + inStreamLength) to the  *
+	 * message dispatcher. 	The outStream contains the response message stream. *
+	 * posOut==length of outStream                                              *
+	 ****************************************************************************/
+
+	messageDispatcher(&service, inStream, inStreamLength, &posIn, outStream, MAX_STREAM_SIZE, &posOut);
+
+	return 0;
+}

+ 32 - 0
src/test/v2g_server.h

@@ -0,0 +1,32 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+#ifndef V2G_SERVER_H_
+#define V2G_SERVER_H_
+
+#include "codec/EXITypes.h"
+
+int testV2GService(uint8_t* inStream, size_t inStreamLength, uint8_t* outStream);
+
+#endif /* V2G_SERVER_H_ */

+ 40 - 0
src/test/v2g_serviceClientDataTransmitter.c

@@ -0,0 +1,40 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#include "service/v2g_serviceClientDataTransmitter.h"
+#include "v2g_server.h"
+#include "codec/Bitstream.h"
+
+/* This method has to be implemented!
+ * Send EXI stream (outStream) to EVSE and receive response stream (inStream)*/
+int serviceDataTransmitter(uint8_t* outStream, size_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*/
+
+	testV2GService(outStream,  outStreamLength, inStream);
+
+	return 0;
+}

+ 93 - 0
src/test/v2g_serviceMethods.c

@@ -0,0 +1,93 @@
+/*
+ * 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.2
+ * @contact Joerg.Heuer@siemens.com
+ *
+ ********************************************************************/
+
+#include "service/v2g_serviceMethods.h"
+#include "service/v2g_serviceDataTypes.h"
+#include <stdio.h>
+
+int	sessionSetup(struct SessionSetupReqType* param, struct SessionSetupResType* result)
+{
+
+	printf("EVSE: sessionSetup called\n"  );
+	printf("\tReceived data:\n");
+	printf("\t\t PEVStatus ChargerStandby=%d\n",param->PEVStatus.ChargerStandby);
+	printf("\t\t PEVStatus ConnectorLocked=%d\n", param->PEVStatus.ConnectorLocked);
+
+	/* Prepare data for PEV */
+	result->ResponseCode = OK_SessionSetup;
+	result->EVSEID.data[0]='E';
+	result->EVSEID.arraylen.data=1;
+	result->EVSEStatus.ConnectorLocked=0;
+	result->EVSEStatus.EVSEStandby=1;
+	result->EVSEStatus.FatalError=0;
+	result->EVSEStatus.PowerSwitchClosed=1;
+	result->EVSEStatus.RCD=1;
+	result->EVSEStatus.ShutDownTime=12345678L;
+	result->TCurrent=12345678L;
+
+	return 0;
+
+}
+
+int	serviceDiscovery(struct ServiceDiscoveryReqType* param, struct ServiceDiscoveryResType* result)
+{
+	return 0;
+}
+
+int	selectedServicePayment(struct ServicePaymentSelectionReqType* param, struct ServicePaymentSelectionResType* result)
+{
+	return 0;
+}
+
+int	paymentDetails(struct PaymentDetailsReqType* param, struct PaymentDetailsResType* result)
+{
+	return 0;
+}
+
+int	powerDiscovery(struct PowerDiscoveryReqType* param, struct PowerDiscoveryResType* result)
+{
+
+	return 0;
+}
+
+int	lineLock(struct LineLockReqType* param, struct LineLockResType* result)
+{
+	return 0;
+}
+
+int	powerDelivery(struct PowerDeliveryReqType* param, struct PowerDeliveryResType* result)
+{
+	return 0;
+}
+
+int	meteringStatus(struct MeteringStatusReqType* param, struct MeteringStatusResType* result)
+{
+	return 0;
+}
+
+int	meteringReceipt(struct MeteringReceiptReqType* param, struct MeteringReceiptResType* result)
+{
+	return 0;
+}

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