v2g_serviceClientStubs.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593
  1. /*
  2. * Copyright (C) 2007-2010 Siemens AG
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as published
  6. * by the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /*******************************************************************
  18. *
  19. * @author Sebastian.Kaebisch.EXT@siemens.com
  20. * @version 0.2
  21. * @contact Joerg.Heuer@siemens.com
  22. *
  23. ********************************************************************/
  24. #include "v2g_serviceDataTypes.h"
  25. #include "v2g_serviceClientStubs.h"
  26. #include "v2g_serviceDataSerializiation.h"
  27. #include "v2g_serviceClientDataTransmitter.h"
  28. #include "EXITypes.h"
  29. #include "EXIDecoder.h"
  30. #include "EXIEncoder.h"
  31. static int deserializeMessage(struct v2gService* service);
  32. /* call sessionSetup */
  33. int call_sessionSetup(struct v2gService* service, struct HeaderType* header, struct SessionSetupReqType* params, struct SessionSetupResType* result)
  34. {
  35. size_t posEncode, posDecode;
  36. /* init uniqueID stack */
  37. service->idPath.pos=0;
  38. /* init outStream data structure */
  39. posEncode = 0;
  40. service->outStream.pos = &posEncode;
  41. service->outStream.buffer = 0;
  42. service->outStream.capacity = 8;
  43. /* init encoder (write header, set initial state) */
  44. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  45. /* init inStream data structure */
  46. posDecode = 0;
  47. service->inStream.pos = &posDecode;
  48. service->inStream.buffer=0;
  49. service->inStream.capacity=0;
  50. /* init v2g message */
  51. init_AnonType_V2G_Message(&(service->v2gMsg));
  52. /* assign data to service data structure */
  53. service->v2gMsg.Header = *header;
  54. service->v2gMsg.Body.SessionSetupReq = *params;
  55. service->v2gMsg.Body.isused.SessionSetupReq=1;
  56. /* encode data to exi stream*/
  57. if(serialize_message(service)<0)
  58. {
  59. return -1;
  60. }
  61. /* send data to server and wait for the response message */
  62. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  63. {
  64. return -1;
  65. }
  66. /* init decoder (read header, set initial state) */
  67. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  68. /* deserilize the response message */
  69. if(deserializeMessage(service)<0)
  70. {
  71. return -1;
  72. }
  73. *result = service->v2gMsg.Body.SessionSetupRes;
  74. return 0;
  75. }
  76. /* call serviceDiscovery */
  77. int call_serviceDiscovery(struct v2gService* service, struct HeaderType* header, struct ServiceDiscoveryReqType* params, struct ServiceDiscoveryResType* result)
  78. {
  79. size_t posEncode, posDecode;
  80. /* init uniqueID stack */
  81. service->idPath.pos=0;
  82. /* init outStream data structure */
  83. posEncode = 0;
  84. service->outStream.pos = &posEncode;
  85. service->outStream.buffer = 0;
  86. service->outStream.capacity = 8;
  87. /* init encoder (write header, set initial state) */
  88. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  89. /* init inStream data structure */
  90. posDecode = 0;
  91. service->inStream.pos = &posDecode;
  92. service->inStream.buffer=0;
  93. service->inStream.capacity=0;
  94. /* init v2g message */
  95. init_AnonType_V2G_Message(&(service->v2gMsg));
  96. /* assign data to service data structure */
  97. service->v2gMsg.Header = *header;
  98. service->v2gMsg.Body.ServiceDiscoveryReq = *params;
  99. service->v2gMsg.Body.isused.ServiceDiscoveryReq=1;
  100. /* encode data to exi stream*/
  101. if(serialize_message(service)<0)
  102. {
  103. return -1;
  104. }
  105. /* send data to server and wait for the response message */
  106. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  107. {
  108. return -1;
  109. }
  110. /* init decoder (read header, set initial state) */
  111. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  112. /* deserilize the response message */
  113. if(deserializeMessage(service)<0)
  114. {
  115. return -1;
  116. }
  117. *result = service->v2gMsg.Body.ServiceDiscoveryRes;
  118. return 0;
  119. }
  120. /* call selectedServicePayment */
  121. int call_selectedServicePayment(struct v2gService* service, struct HeaderType* header, struct ServicePaymentSelectionReqType* params, struct ServicePaymentSelectionResType* result)
  122. {
  123. size_t posEncode, posDecode;
  124. /* init uniqueID stack */
  125. service->idPath.pos=0;
  126. /* init outStream data structure */
  127. posEncode = 0;
  128. service->outStream.pos = &posEncode;
  129. service->outStream.buffer = 0;
  130. service->outStream.capacity = 8;
  131. /* init encoder (write header, set initial state) */
  132. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  133. /* init inStream data structure */
  134. posDecode = 0;
  135. service->inStream.pos = &posDecode;
  136. service->inStream.buffer=0;
  137. service->inStream.capacity=0;
  138. /* init v2g message */
  139. init_AnonType_V2G_Message(&(service->v2gMsg));
  140. /* assign data to service data structure */
  141. service->v2gMsg.Header = *header;
  142. service->v2gMsg.Body.ServicePaymentSelectionReq = *params;
  143. service->v2gMsg.Body.isused.ServicePaymentSelectionReq=1;
  144. /* encode data to exi stream*/
  145. if(serialize_message(service)<0)
  146. {
  147. return -1;
  148. }
  149. /* send data to server and wait for the response message */
  150. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  151. {
  152. return -1;
  153. }
  154. /* init decoder (read header, set initial state) */
  155. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  156. /* deserilize the response message */
  157. if(deserializeMessage(service)<0)
  158. {
  159. return -1;
  160. }
  161. *result = service->v2gMsg.Body.ServicePaymentSelectionRes;
  162. return 0;
  163. }
  164. /* call paymentDetails */
  165. int call_paymentDetails(struct v2gService* service, struct HeaderType* header, struct PaymentDetailsReqType* params, struct PaymentDetailsResType* result)
  166. {
  167. size_t posEncode, posDecode;
  168. /* init uniqueID stack */
  169. service->idPath.pos=0;
  170. /* init outStream data structure */
  171. posEncode = 0;
  172. service->outStream.pos = &posEncode;
  173. service->outStream.buffer = 0;
  174. service->outStream.capacity = 8;
  175. /* init encoder (write header, set initial state) */
  176. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  177. /* init inStream data structure */
  178. posDecode = 0;
  179. service->inStream.pos = &posDecode;
  180. service->inStream.buffer=0;
  181. service->inStream.capacity=0;
  182. /* init v2g message */
  183. init_AnonType_V2G_Message(&(service->v2gMsg));
  184. /* assign data to service data structure */
  185. service->v2gMsg.Header = *header;
  186. service->v2gMsg.Body.PaymentDetailsReq = *params;
  187. service->v2gMsg.Body.isused.PaymentDetailsReq=1;
  188. /* encode data to exi stream*/
  189. if(serialize_message(service)<0)
  190. {
  191. return -1;
  192. }
  193. /* send data to server and wait for the response message */
  194. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  195. {
  196. return -1;
  197. }
  198. /* init decoder (read header, set initial state) */
  199. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  200. /* deserilize the response message */
  201. if(deserializeMessage(service)<0)
  202. {
  203. return -1;
  204. }
  205. *result = service->v2gMsg.Body.PaymentDetailsRes;
  206. return 0;
  207. }
  208. /* call powerDiscovery */
  209. int call_powerDiscovery(struct v2gService* service, struct HeaderType* header, struct PowerDiscoveryReqType* params, struct PowerDiscoveryResType* result)
  210. {
  211. size_t posEncode, posDecode;
  212. /* init uniqueID stack */
  213. service->idPath.pos=0;
  214. /* init outStream data structure */
  215. posEncode = 0;
  216. service->outStream.pos = &posEncode;
  217. service->outStream.buffer = 0;
  218. service->outStream.capacity = 8;
  219. /* init encoder (write header, set initial state) */
  220. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  221. /* init inStream data structure */
  222. posDecode = 0;
  223. service->inStream.pos = &posDecode;
  224. service->inStream.buffer=0;
  225. service->inStream.capacity=0;
  226. /* init v2g message */
  227. init_AnonType_V2G_Message(&(service->v2gMsg));
  228. /* assign data to service data structure */
  229. service->v2gMsg.Header = *header;
  230. service->v2gMsg.Body.PowerDiscoveryReq = *params;
  231. service->v2gMsg.Body.isused.PowerDiscoveryReq=1;
  232. /* encode data to exi stream*/
  233. if(serialize_message(service)<0)
  234. {
  235. return -1;
  236. }
  237. /* send data to server and wait for the response message */
  238. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  239. {
  240. return -1;
  241. }
  242. /* init decoder (read header, set initial state) */
  243. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  244. /* deserilize the response message */
  245. if(deserializeMessage(service)<0)
  246. {
  247. return -1;
  248. }
  249. *result = service->v2gMsg.Body.PowerDiscoveryRes;
  250. return 0;
  251. }
  252. /* call lineLock */
  253. int call_lineLock(struct v2gService* service, struct HeaderType* header, struct LineLockReqType* params, struct LineLockResType* result)
  254. {
  255. size_t posEncode, posDecode;
  256. /* init uniqueID stack */
  257. service->idPath.pos=0;
  258. /* init outStream data structure */
  259. posEncode = 0;
  260. service->outStream.pos = &posEncode;
  261. service->outStream.buffer = 0;
  262. service->outStream.capacity = 8;
  263. /* init encoder (write header, set initial state) */
  264. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  265. /* init inStream data structure */
  266. posDecode = 0;
  267. service->inStream.pos = &posDecode;
  268. service->inStream.buffer=0;
  269. service->inStream.capacity=0;
  270. /* init v2g message */
  271. init_AnonType_V2G_Message(&(service->v2gMsg));
  272. /* assign data to service data structure */
  273. service->v2gMsg.Header = *header;
  274. service->v2gMsg.Body.LineLockReq = *params;
  275. service->v2gMsg.Body.isused.LineLockReq=1;
  276. /* encode data to exi stream*/
  277. if(serialize_message(service)<0)
  278. {
  279. return -1;
  280. }
  281. /* send data to server and wait for the response message */
  282. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  283. {
  284. return -1;
  285. }
  286. /* init decoder (read header, set initial state) */
  287. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  288. /* deserilize the response message */
  289. if(deserializeMessage(service)<0)
  290. {
  291. return -1;
  292. }
  293. *result = service->v2gMsg.Body.LineLockRes;
  294. return 0;
  295. }
  296. /* call powerDelivery */
  297. int call_powerDelivery(struct v2gService* service, struct HeaderType* header, struct PowerDeliveryReqType* params, struct PowerDeliveryResType* result)
  298. {
  299. size_t posEncode, posDecode;
  300. /* init uniqueID stack */
  301. service->idPath.pos=0;
  302. /* init outStream data structure */
  303. posEncode = 0;
  304. service->outStream.pos = &posEncode;
  305. service->outStream.buffer = 0;
  306. service->outStream.capacity = 8;
  307. /* init encoder (write header, set initial state) */
  308. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  309. /* init inStream data structure */
  310. posDecode = 0;
  311. service->inStream.pos = &posDecode;
  312. service->inStream.buffer=0;
  313. service->inStream.capacity=0;
  314. /* init v2g message */
  315. init_AnonType_V2G_Message(&(service->v2gMsg));
  316. /* assign data to service data structure */
  317. service->v2gMsg.Header = *header;
  318. service->v2gMsg.Body.PowerDeliveryReq = *params;
  319. service->v2gMsg.Body.isused.PowerDeliveryReq=1;
  320. /* encode data to exi stream*/
  321. if(serialize_message(service)<0)
  322. {
  323. return -1;
  324. }
  325. /* send data to server and wait for the response message */
  326. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  327. {
  328. return -1;
  329. }
  330. /* init decoder (read header, set initial state) */
  331. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  332. /* deserilize the response message */
  333. if(deserializeMessage(service)<0)
  334. {
  335. return -1;
  336. }
  337. *result = service->v2gMsg.Body.PowerDeliveryRes;
  338. return 0;
  339. }
  340. /* call meteringStatus */
  341. int call_meteringStatus(struct v2gService* service, struct HeaderType* header, struct MeteringStatusResType* result)
  342. {
  343. size_t posEncode, posDecode;
  344. /* init uniqueID stack */
  345. service->idPath.pos=0;
  346. /* init outStream data structure */
  347. posEncode = 0;
  348. service->outStream.pos = &posEncode;
  349. service->outStream.buffer = 0;
  350. service->outStream.capacity = 8;
  351. /* init encoder (write header, set initial state) */
  352. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  353. /* init inStream data structure */
  354. posDecode = 0;
  355. service->inStream.pos = &posDecode;
  356. service->inStream.buffer=0;
  357. service->inStream.capacity=0;
  358. /* init v2g message */
  359. init_AnonType_V2G_Message(&(service->v2gMsg));
  360. /* assign data to service data structure */
  361. service->v2gMsg.Header = *header;
  362. service->v2gMsg.Body.isused.MeteringStatusReq=1;
  363. /* encode data to exi stream*/
  364. if(serialize_message(service)<0)
  365. {
  366. return -1;
  367. }
  368. /* send data to server and wait for the response message */
  369. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  370. {
  371. return -1;
  372. }
  373. /* init decoder (read header, set initial state) */
  374. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  375. /* deserilize the response message */
  376. if(deserializeMessage(service)<0)
  377. {
  378. return -1;
  379. }
  380. *result = service->v2gMsg.Body.MeteringStatusRes;
  381. return 0;
  382. }
  383. /* call meteringReceipt */
  384. int call_meteringReceipt(struct v2gService* service, struct HeaderType* header, struct MeteringReceiptReqType* params, struct MeteringReceiptResType* result)
  385. {
  386. size_t posEncode, posDecode;
  387. /* init uniqueID stack */
  388. service->idPath.pos=0;
  389. /* init outStream data structure */
  390. posEncode = 0;
  391. service->outStream.pos = &posEncode;
  392. service->outStream.buffer = 0;
  393. service->outStream.capacity = 8;
  394. /* init encoder (write header, set initial state) */
  395. exiInitEncoder(&(service->outStream), &(service->stateEncode));
  396. /* init inStream data structure */
  397. posDecode = 0;
  398. service->inStream.pos = &posDecode;
  399. service->inStream.buffer=0;
  400. service->inStream.capacity=0;
  401. /* init v2g message */
  402. init_AnonType_V2G_Message(&(service->v2gMsg));
  403. /* assign data to service data structure */
  404. service->v2gMsg.Header = *header;
  405. service->v2gMsg.Body.MeteringReceiptReq = *params;
  406. service->v2gMsg.Body.isused.MeteringReceiptReq=1;
  407. /* encode data to exi stream*/
  408. if(serialize_message(service)<0)
  409. {
  410. return -1;
  411. }
  412. /* send data to server and wait for the response message */
  413. if(serviceDataTransmitter(service->outStream.data, *(service->outStream.pos), service->inStream.data)<0)
  414. {
  415. return -1;
  416. }
  417. /* init decoder (read header, set initial state) */
  418. exiInitDecoder(&(service->inStream), &(service->stateDecode));
  419. /* deserilize the response message */
  420. if(deserializeMessage(service)<0)
  421. {
  422. return -1;
  423. }
  424. *result = service->v2gMsg.Body.MeteringReceiptRes;
  425. return 0;
  426. }
  427. /**
  428. * Deserialize an element value of the EXI stream and assign it to the
  429. * service data structure
  430. */
  431. static int deserializeElementCharacter(struct v2gService* service)
  432. {
  433. switch(service->eqn.namespaceURI) {
  434. case 4:
  435. switch(service->eqn.localPart) {
  436. case 47: /*ResponseCode*/
  437. if(service->val.type == ENUMERATION)
  438. {
  439. if(service->idPath.id[2] == 50)
  440. {
  441. service->v2gMsg.Body.ServiceDiscoveryRes.ResponseCode=service->val.enumeration;
  442. } else if(service->idPath.id[2] == 55)
  443. {
  444. service->v2gMsg.Body.ServicePaymentSelectionRes.ResponseCode=service->val.enumeration;
  445. } else if(service->idPath.id[2] == 35)
  446. {
  447. service->v2gMsg.Body.PaymentDetailsRes.ResponseCode=service->val.enumeration;
  448. } else if(service->idPath.id[2] == 43)
  449. {
  450. service->v2gMsg.Body.PowerDiscoveryRes.ResponseCode=service->val.enumeration;
  451. } else if(service->idPath.id[2] == 13)
  452. {
  453. service->v2gMsg.Body.LineLockRes.ResponseCode=service->val.enumeration;
  454. } else if(service->idPath.id[2] == 39)
  455. {
  456. service->v2gMsg.Body.PowerDeliveryRes.ResponseCode=service->val.enumeration;
  457. } else if(service->idPath.id[2] == 23)
  458. {
  459. service->v2gMsg.Body.MeteringStatusRes.ResponseCode=service->val.enumeration;
  460. } else if(service->idPath.id[2] == 19)
  461. {
  462. service->v2gMsg.Body.MeteringReceiptRes.ResponseCode=service->val.enumeration;
  463. } else if(service->idPath.id[1] == 61)
  464. {
  465. service->v2gMsg.Body.SessionSetupRes.ResponseCode=service->val.enumeration;
  466. }
  467. }
  468. else
  469. {
  470. return -1; /* wrong data type */
  471. }
  472. break;
  473. case 3: /*EVSEID*/
  474. if(service->val.type == BINARY_HEX)
  475. {
  476. /* array copy and array length assignment */
  477. memcpy(service->v2gMsg.Body.SessionSetupRes.EVSEID.data, service->val.binary.data,service->val.binary.len);
  478. service->v2gMsg.Body.SessionSetupRes.EVSEID.arraylen.data = service->val.binary.len;
  479. }
  480. else
  481. {
  482. return -1; /* wrong data type */
  483. }
  484. break;
  485. case 63: /*TCurrent*/
  486. if(service->val.type == INTEGER_64)
  487. {
  488. service->v2gMsg.Body.SessionSetupRes.TCurrent=service->val.int64;
  489. }
  490. else
  491. {
  492. return -1; /* wrong data type */
  493. }
  494. break;
  495. case 16: /*MeteringAuthPubKey*/
  496. if(service->val.type == BINARY_HEX)
  497. {
  498. /* array copy and array length assignment */
  499. memcpy(service->v2gMsg.Body.ServicePaymentSelectionRes.MeteringAuthPubKey.data, service->val.binary.data,service->val.binary.len);
  500. service->v2gMsg.Body.ServicePaymentSelectionRes.MeteringAuthPubKey.arraylen.data = service->val.binary.len;
  501. }
  502. else
  503. {
  504. return -1; /* wrong data type */
  505. }
  506. /* is used */
  507. service->v2gMsg.Body.ServicePaymentSelectionRes.isused.MeteringAuthPubKey=1;
  508. break;
  509. case 5: /*EVSEMaxPhases*/
  510. if(service->val.type == INTEGER_16)
  511. {
  512. service->v2gMsg.Body.PowerDiscoveryRes.EVSEMaxPhases=service->val.int32;
  513. }
  514. else
  515. {
  516. return -1; /* wrong data type */
  517. }
  518. break;
  519. case 9: /*EnergyProvider*/
  520. if(service->val.type == STRING)
  521. {
  522. /* string copy and string length assignment */
  523. memcpy(service->v2gMsg.Body.PowerDiscoveryRes.EnergyProvider.data, service->val.string.codepoints,service->val.string.len);
  524. service->v2gMsg.Body.PowerDiscoveryRes.EnergyProvider.arraylen.data = service->val.string.len;
  525. }
  526. else
  527. {
  528. return -1; /* wrong data type */
  529. }
  530. /* is used */
  531. service->v2gMsg.Body.PowerDiscoveryRes.isused.EnergyProvider=1;
  532. break;
  533. } /* close switch(service->eqn.localPart) */
  534. break;
  535. case 5:
  536. switch(service->eqn.localPart) {
  537. case 35: /*SessionID*/
  538. if(service->val.type == BINARY_HEX)
  539. {
  540. /* array copy and array length assignment */
  541. memcpy(service->v2gMsg.Header.SessionInformation.SessionID.data, service->val.binary.data,service->val.binary.len);
  542. service->v2gMsg.Header.SessionInformation.SessionID.arraylen.data = service->val.binary.len;
  543. }
  544. else
  545. {
  546. return -1; /* wrong data type */
  547. }
  548. break;
  549. case 33: /*ServiceSessionID*/
  550. if(service->val.type == BINARY_HEX)
  551. {
  552. /* array copy and array length assignment */
  553. memcpy(service->v2gMsg.Header.SessionInformation.ServiceSessionID.data, service->val.binary.data,service->val.binary.len);
  554. service->v2gMsg.Header.SessionInformation.ServiceSessionID.arraylen.data = service->val.binary.len;
  555. }
  556. else
  557. {
  558. return -1; /* wrong data type */
  559. }
  560. /* is used */
  561. service->v2gMsg.Header.SessionInformation.isused.ServiceSessionID=1;
  562. break;
  563. case 25: /*ProtocolVersion*/
  564. if(service->val.type == STRING)
  565. {
  566. /* string copy and string length assignment */
  567. memcpy(service->v2gMsg.Header.SessionInformation.ProtocolVersion.data, service->val.string.codepoints,service->val.string.len);
  568. service->v2gMsg.Header.SessionInformation.ProtocolVersion.arraylen.data = service->val.string.len;
  569. }
  570. else
  571. {
  572. return -1; /* wrong data type */
  573. }
  574. /* is used */
  575. service->v2gMsg.Header.SessionInformation.isused.ProtocolVersion=1;
  576. break;
  577. case 13: /*FaultCode*/
  578. if(service->val.type == ENUMERATION)
  579. {
  580. service->v2gMsg.Header.Notification.FaultCode=service->val.enumeration;
  581. }
  582. else
  583. {
  584. return -1; /* wrong data type */
  585. }
  586. /* is used */
  587. service->v2gMsg.Header.Notification.isused.FaultCode=1;
  588. break;
  589. case 14: /*FaultMsg*/
  590. if(service->val.type == STRING)
  591. {
  592. /* string copy and string length assignment */
  593. memcpy(service->v2gMsg.Header.Notification.FaultMsg.data, service->val.string.codepoints,service->val.string.len);
  594. service->v2gMsg.Header.Notification.FaultMsg.arraylen.data = service->val.string.len;
  595. }
  596. else
  597. {
  598. return -1; /* wrong data type */
  599. }
  600. /* is used */
  601. service->v2gMsg.Header.Notification.isused.FaultMsg=1;
  602. break;
  603. case 12: /*FatalError*/
  604. if(service->val.type == BOOLEAN)
  605. {
  606. if(service->idPath.id[2] == 61)
  607. {
  608. service->v2gMsg.Body.SessionSetupRes.EVSEStatus.FatalError=service->val.boolean;
  609. } else if(service->idPath.id[2] == 43)
  610. {
  611. service->v2gMsg.Body.PowerDiscoveryRes.EVSEStatus.FatalError=service->val.boolean;
  612. } else if(service->idPath.id[2] == 13)
  613. {
  614. service->v2gMsg.Body.LineLockRes.EVSEStatus.FatalError=service->val.boolean;
  615. } else if(service->idPath.id[1] == 23)
  616. {
  617. service->v2gMsg.Body.MeteringStatusRes.EVSEStatus.FatalError=service->val.boolean;
  618. }
  619. }
  620. else
  621. {
  622. return -1; /* wrong data type */
  623. }
  624. break;
  625. case 7: /*EVSEStandby*/
  626. if(service->val.type == BOOLEAN)
  627. {
  628. if(service->idPath.id[2] == 61)
  629. {
  630. service->v2gMsg.Body.SessionSetupRes.EVSEStatus.EVSEStandby=service->val.boolean;
  631. } else if(service->idPath.id[2] == 43)
  632. {
  633. service->v2gMsg.Body.PowerDiscoveryRes.EVSEStatus.EVSEStandby=service->val.boolean;
  634. } else if(service->idPath.id[2] == 13)
  635. {
  636. service->v2gMsg.Body.LineLockRes.EVSEStatus.EVSEStandby=service->val.boolean;
  637. } else if(service->idPath.id[1] == 23)
  638. {
  639. service->v2gMsg.Body.MeteringStatusRes.EVSEStatus.EVSEStandby=service->val.boolean;
  640. }
  641. }
  642. else
  643. {
  644. return -1; /* wrong data type */
  645. }
  646. break;
  647. case 4: /*ConnectorLocked*/
  648. if(service->val.type == BOOLEAN)
  649. {
  650. if(service->idPath.id[2] == 61)
  651. {
  652. service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ConnectorLocked=service->val.boolean;
  653. } else if(service->idPath.id[2] == 43)
  654. {
  655. service->v2gMsg.Body.PowerDiscoveryRes.EVSEStatus.ConnectorLocked=service->val.boolean;
  656. } else if(service->idPath.id[2] == 13)
  657. {
  658. service->v2gMsg.Body.LineLockRes.EVSEStatus.ConnectorLocked=service->val.boolean;
  659. } else if(service->idPath.id[1] == 23)
  660. {
  661. service->v2gMsg.Body.MeteringStatusRes.EVSEStatus.ConnectorLocked=service->val.boolean;
  662. }
  663. }
  664. else
  665. {
  666. return -1; /* wrong data type */
  667. }
  668. break;
  669. case 24: /*PowerSwitchClosed*/
  670. if(service->val.type == BOOLEAN)
  671. {
  672. if(service->idPath.id[2] == 61)
  673. {
  674. service->v2gMsg.Body.SessionSetupRes.EVSEStatus.PowerSwitchClosed=service->val.boolean;
  675. } else if(service->idPath.id[2] == 43)
  676. {
  677. service->v2gMsg.Body.PowerDiscoveryRes.EVSEStatus.PowerSwitchClosed=service->val.boolean;
  678. } else if(service->idPath.id[2] == 13)
  679. {
  680. service->v2gMsg.Body.LineLockRes.EVSEStatus.PowerSwitchClosed=service->val.boolean;
  681. } else if(service->idPath.id[1] == 23)
  682. {
  683. service->v2gMsg.Body.MeteringStatusRes.EVSEStatus.PowerSwitchClosed=service->val.boolean;
  684. }
  685. }
  686. else
  687. {
  688. return -1; /* wrong data type */
  689. }
  690. break;
  691. case 26: /*RCD*/
  692. if(service->val.type == BOOLEAN)
  693. {
  694. if(service->idPath.id[2] == 61)
  695. {
  696. service->v2gMsg.Body.SessionSetupRes.EVSEStatus.RCD=service->val.boolean;
  697. } else if(service->idPath.id[2] == 43)
  698. {
  699. service->v2gMsg.Body.PowerDiscoveryRes.EVSEStatus.RCD=service->val.boolean;
  700. } else if(service->idPath.id[2] == 13)
  701. {
  702. service->v2gMsg.Body.LineLockRes.EVSEStatus.RCD=service->val.boolean;
  703. } else if(service->idPath.id[1] == 23)
  704. {
  705. service->v2gMsg.Body.MeteringStatusRes.EVSEStatus.RCD=service->val.boolean;
  706. }
  707. }
  708. else
  709. {
  710. return -1; /* wrong data type */
  711. }
  712. break;
  713. case 37: /*ShutDownTime*/
  714. if(service->val.type == INTEGER_64)
  715. {
  716. if(service->idPath.id[2] == 61)
  717. {
  718. service->v2gMsg.Body.SessionSetupRes.EVSEStatus.ShutDownTime=service->val.int64;
  719. } else if(service->idPath.id[2] == 43)
  720. {
  721. service->v2gMsg.Body.PowerDiscoveryRes.EVSEStatus.ShutDownTime=service->val.int64;
  722. } else if(service->idPath.id[2] == 13)
  723. {
  724. service->v2gMsg.Body.LineLockRes.EVSEStatus.ShutDownTime=service->val.int64;
  725. } else if(service->idPath.id[1] == 23)
  726. {
  727. service->v2gMsg.Body.MeteringStatusRes.EVSEStatus.ShutDownTime=service->val.int64;
  728. }
  729. }
  730. else
  731. {
  732. return -1; /* wrong data type */
  733. }
  734. break;
  735. case 29: /*ServiceID*/
  736. if(service->val.type == BINARY_HEX)
  737. {
  738. /* array copy and array length assignment */
  739. memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceID.data, service->val.binary.data,service->val.binary.len);
  740. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceID.arraylen.data = service->val.binary.len;
  741. }
  742. else
  743. {
  744. return -1; /* wrong data type */
  745. }
  746. break;
  747. case 31: /*ServiceName*/
  748. if(service->val.type == STRING)
  749. {
  750. /* string copy and string length assignment */
  751. memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceName.data, service->val.string.codepoints,service->val.string.len);
  752. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceName.arraylen.data = service->val.string.len;
  753. }
  754. else
  755. {
  756. return -1; /* wrong data type */
  757. }
  758. /* is used */
  759. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceName=1;
  760. break;
  761. case 34: /*ServiceType*/
  762. if(service->val.type == ENUMERATION)
  763. {
  764. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceType=service->val.enumeration;
  765. }
  766. else
  767. {
  768. return -1; /* wrong data type */
  769. }
  770. /* is used */
  771. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceType=1;
  772. break;
  773. case 32: /*ServiceScope*/
  774. if(service->val.type == STRING)
  775. {
  776. /* string copy and string length assignment */
  777. memcpy(service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceScope.data, service->val.string.codepoints,service->val.string.len);
  778. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].ServiceScope.arraylen.data = service->val.string.len;
  779. }
  780. else
  781. {
  782. return -1; /* wrong data type */
  783. }
  784. /* is used */
  785. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceScope=1;
  786. break;
  787. case 21: /*Multiplier*/
  788. if(service->val.type == ENUMERATION)
  789. {
  790. if(service->idPath.id[3] == 2)
  791. {
  792. service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Multiplier=service->val.enumeration;
  793. } else if(service->idPath.id[3] == 28)
  794. {
  795. service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxPower.Multiplier=service->val.enumeration;
  796. } else if(service->idPath.id[3] == 29)
  797. {
  798. service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxVoltage.Multiplier=service->val.enumeration;
  799. } else if(service->idPath.id[3] == 30)
  800. {
  801. service->v2gMsg.Body.PowerDiscoveryReq.PEVMinVoltage.Multiplier=service->val.enumeration;
  802. } else if(service->idPath.id[3] == 8)
  803. {
  804. service->v2gMsg.Body.PowerDiscoveryRes.EVSEVoltage.Multiplier=service->val.enumeration;
  805. } else if(service->idPath.id[3] == 4)
  806. {
  807. service->v2gMsg.Body.PowerDiscoveryRes.EVSEIMax.Multiplier=service->val.enumeration;
  808. } else if(service->idPath.id[3] == 6)
  809. {
  810. service->v2gMsg.Body.MeteringStatusRes.EVSEMaxPower.Multiplier=service->val.enumeration;
  811. } else if(service->idPath.id[2] == 25)
  812. {
  813. service->v2gMsg.Body.MeteringStatusRes.PCurrent.Multiplier=service->val.enumeration;
  814. } else if(service->idPath.id[2] == 37)
  815. {
  816. service->v2gMsg.Body.PowerDeliveryReq.ChargingProfile.ChargingProfileEntryMaxPower.Multiplier=service->val.enumeration;
  817. } else if(service->idPath.id[1] == 23)
  818. {
  819. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterReading.Multiplier=service->val.enumeration;
  820. } else if(service->idPath.id[7] == 47)
  821. {
  822. 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].TariffPMax.Multiplier=service->val.enumeration;
  823. } else if(service->idPath.id[6] == 6)
  824. {
  825. 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].EPrice.Multiplier=service->val.enumeration;
  826. }
  827. }
  828. else
  829. {
  830. return -1; /* wrong data type */
  831. }
  832. break;
  833. case 50: /*Unit*/
  834. if(service->val.type == ENUMERATION)
  835. {
  836. if(service->idPath.id[3] == 2)
  837. {
  838. service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Unit=service->val.enumeration;
  839. } else if(service->idPath.id[3] == 28)
  840. {
  841. service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxPower.Unit=service->val.enumeration;
  842. } else if(service->idPath.id[3] == 29)
  843. {
  844. service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxVoltage.Unit=service->val.enumeration;
  845. } else if(service->idPath.id[3] == 30)
  846. {
  847. service->v2gMsg.Body.PowerDiscoveryReq.PEVMinVoltage.Unit=service->val.enumeration;
  848. } else if(service->idPath.id[3] == 8)
  849. {
  850. service->v2gMsg.Body.PowerDiscoveryRes.EVSEVoltage.Unit=service->val.enumeration;
  851. } else if(service->idPath.id[3] == 4)
  852. {
  853. service->v2gMsg.Body.PowerDiscoveryRes.EVSEIMax.Unit=service->val.enumeration;
  854. } else if(service->idPath.id[3] == 6)
  855. {
  856. service->v2gMsg.Body.MeteringStatusRes.EVSEMaxPower.Unit=service->val.enumeration;
  857. } else if(service->idPath.id[2] == 25)
  858. {
  859. service->v2gMsg.Body.MeteringStatusRes.PCurrent.Unit=service->val.enumeration;
  860. } else if(service->idPath.id[2] == 37)
  861. {
  862. service->v2gMsg.Body.PowerDeliveryReq.ChargingProfile.ChargingProfileEntryMaxPower.Unit=service->val.enumeration;
  863. } else if(service->idPath.id[1] == 23)
  864. {
  865. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterReading.Unit=service->val.enumeration;
  866. } else if(service->idPath.id[7] == 47)
  867. {
  868. 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].TariffPMax.Unit=service->val.enumeration;
  869. } else if(service->idPath.id[6] == 6)
  870. {
  871. 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].EPrice.Unit=service->val.enumeration;
  872. }
  873. }
  874. else
  875. {
  876. return -1; /* wrong data type */
  877. }
  878. break;
  879. case 51: /*Value*/
  880. if(service->val.type == INTEGER_64)
  881. {
  882. if(service->idPath.id[3] == 2)
  883. {
  884. service->v2gMsg.Body.PowerDiscoveryReq.EAmount.Value=service->val.int64;
  885. } else if(service->idPath.id[3] == 28)
  886. {
  887. service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxPower.Value=service->val.int64;
  888. } else if(service->idPath.id[3] == 29)
  889. {
  890. service->v2gMsg.Body.PowerDiscoveryReq.PEVMaxVoltage.Value=service->val.int64;
  891. } else if(service->idPath.id[3] == 30)
  892. {
  893. service->v2gMsg.Body.PowerDiscoveryReq.PEVMinVoltage.Value=service->val.int64;
  894. } else if(service->idPath.id[3] == 8)
  895. {
  896. service->v2gMsg.Body.PowerDiscoveryRes.EVSEVoltage.Value=service->val.int64;
  897. } else if(service->idPath.id[3] == 4)
  898. {
  899. service->v2gMsg.Body.PowerDiscoveryRes.EVSEIMax.Value=service->val.int64;
  900. } else if(service->idPath.id[3] == 6)
  901. {
  902. service->v2gMsg.Body.MeteringStatusRes.EVSEMaxPower.Value=service->val.int64;
  903. } else if(service->idPath.id[2] == 25)
  904. {
  905. service->v2gMsg.Body.MeteringStatusRes.PCurrent.Value=service->val.int64;
  906. } else if(service->idPath.id[2] == 37)
  907. {
  908. service->v2gMsg.Body.PowerDeliveryReq.ChargingProfile.ChargingProfileEntryMaxPower.Value=service->val.int64;
  909. } else if(service->idPath.id[1] == 23)
  910. {
  911. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterReading.Value=service->val.int64;
  912. } else if(service->idPath.id[7] == 47)
  913. {
  914. 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].TariffPMax.Value=service->val.int64;
  915. } else if(service->idPath.id[6] == 6)
  916. {
  917. 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].EPrice.Value=service->val.int64;
  918. }
  919. }
  920. else
  921. {
  922. return -1; /* wrong data type */
  923. }
  924. break;
  925. case 48: /*TariffStart*/
  926. if(service->val.type == UNSIGNED_INTEGER_32)
  927. {
  928. 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;
  929. }
  930. else
  931. {
  932. return -1; /* wrong data type */
  933. }
  934. break;
  935. case 46: /*TariffID*/
  936. if(service->val.type == ENUMERATION)
  937. {
  938. service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffID=service->val.enumeration;
  939. }
  940. else
  941. {
  942. return -1; /* wrong data type */
  943. }
  944. break;
  945. case 41: /*TariffDescription*/
  946. if(service->val.type == STRING)
  947. {
  948. /* string copy and string length assignment */
  949. memcpy(service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffDescription.data, service->val.string.codepoints,service->val.string.len);
  950. service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].TariffDescription.arraylen.data = service->val.string.len;
  951. }
  952. else
  953. {
  954. return -1; /* wrong data type */
  955. }
  956. /* is used */
  957. service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].isused.TariffDescription=1;
  958. break;
  959. case 18: /*MeterPubKey*/
  960. if(service->val.type == BINARY_HEX)
  961. {
  962. /* array copy and array length assignment */
  963. memcpy(service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterPubKey.data, service->val.binary.data,service->val.binary.len);
  964. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterPubKey.arraylen.data = service->val.binary.len;
  965. }
  966. else
  967. {
  968. return -1; /* wrong data type */
  969. }
  970. /* is used */
  971. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterPubKey=1;
  972. break;
  973. case 20: /*MeterStatus*/
  974. if(service->val.type == INTEGER_16)
  975. {
  976. if(service->idPath.id[2] == 23)
  977. {
  978. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.MeterStatus=service->val.int32;
  979. } else if(service->idPath.id[1] == 17)
  980. {
  981. service->v2gMsg.Body.MeteringReceiptReq.MeterInfo.MeterStatus=service->val.int32;
  982. }
  983. }
  984. else
  985. {
  986. return -1; /* wrong data type */
  987. }
  988. /* is used */
  989. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterStatus=1;
  990. break;
  991. case 38: /*TMeter*/
  992. if(service->val.type == INTEGER_64)
  993. {
  994. if(service->idPath.id[2] == 23)
  995. {
  996. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.TMeter=service->val.int64;
  997. } else if(service->idPath.id[1] == 17)
  998. {
  999. service->v2gMsg.Body.MeteringReceiptReq.MeterInfo.TMeter=service->val.int64;
  1000. }
  1001. }
  1002. else
  1003. {
  1004. return -1; /* wrong data type */
  1005. }
  1006. /* is used */
  1007. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.TMeter=1;
  1008. break;
  1009. } /* close switch(service->eqn.localPart) */
  1010. break;
  1011. } /* close switch(service->eqn.namespaceURI) */
  1012. return 0;
  1013. }
  1014. /**
  1015. * Deserialize an element of the EXI stream
  1016. * @return 0 = 0K; -1 = ERROR
  1017. */
  1018. static int deserializeElement(struct v2gService* service)
  1019. {
  1020. switch(service->eqn.namespaceURI) {
  1021. case 4:
  1022. switch(service->eqn.localPart) {
  1023. case 52:/* ServiceList */
  1024. /* is used */
  1025. service->v2gMsg.Body.ServiceDiscoveryRes.isused.ServiceList=1;
  1026. break;
  1027. case 16:/* MeteringAuthPubKey */
  1028. /* is used */
  1029. service->v2gMsg.Body.ServicePaymentSelectionRes.isused.MeteringAuthPubKey=1;
  1030. break;
  1031. case 9:/* EnergyProvider */
  1032. /* is used */
  1033. service->v2gMsg.Body.PowerDiscoveryRes.isused.EnergyProvider=1;
  1034. break;
  1035. case 65:/* TariffTable */
  1036. /* is used */
  1037. service->v2gMsg.Body.PowerDiscoveryRes.isused.TariffTable=1;
  1038. break;
  1039. case 25:/* PCurrent */
  1040. /* is used */
  1041. service->v2gMsg.Body.MeteringStatusRes.isused.PCurrent=1;
  1042. break;
  1043. case 15:/* MeterInfo */
  1044. /* is used */
  1045. service->v2gMsg.Body.MeteringStatusRes.isused.MeterInfo=1;
  1046. break;
  1047. case 61:/* SessionSetupRes */
  1048. /* is used */
  1049. service->v2gMsg.Body.isused.SessionSetupRes=1;
  1050. break;
  1051. case 50:/* ServiceDiscoveryRes */
  1052. /* is used */
  1053. service->v2gMsg.Body.isused.ServiceDiscoveryRes=1;
  1054. break;
  1055. case 55:/* ServicePaymentSelectionRes */
  1056. /* is used */
  1057. service->v2gMsg.Body.isused.ServicePaymentSelectionRes=1;
  1058. break;
  1059. case 35:/* PaymentDetailsRes */
  1060. /* is used */
  1061. service->v2gMsg.Body.isused.PaymentDetailsRes=1;
  1062. break;
  1063. case 43:/* PowerDiscoveryRes */
  1064. /* is used */
  1065. service->v2gMsg.Body.isused.PowerDiscoveryRes=1;
  1066. break;
  1067. case 13:/* LineLockRes */
  1068. /* is used */
  1069. service->v2gMsg.Body.isused.LineLockRes=1;
  1070. break;
  1071. case 39:/* PowerDeliveryRes */
  1072. /* is used */
  1073. service->v2gMsg.Body.isused.PowerDeliveryRes=1;
  1074. break;
  1075. case 23:/* MeteringStatusRes */
  1076. /* is used */
  1077. service->v2gMsg.Body.isused.MeteringStatusRes=1;
  1078. break;
  1079. case 19:/* MeteringReceiptRes */
  1080. /* is used */
  1081. service->v2gMsg.Body.isused.MeteringReceiptRes=1;
  1082. break;
  1083. }
  1084. break;case 5:
  1085. switch(service->eqn.localPart) {
  1086. case 33:/* ServiceSessionID */
  1087. /* is used */
  1088. service->v2gMsg.Header.SessionInformation.isused.ServiceSessionID=1;
  1089. break;
  1090. case 25:/* ProtocolVersion */
  1091. /* is used */
  1092. service->v2gMsg.Header.SessionInformation.isused.ProtocolVersion=1;
  1093. break;
  1094. case 13:/* FaultCode */
  1095. /* is used */
  1096. service->v2gMsg.Header.Notification.isused.FaultCode=1;
  1097. break;
  1098. case 14:/* FaultMsg */
  1099. /* is used */
  1100. service->v2gMsg.Header.Notification.isused.FaultMsg=1;
  1101. break;
  1102. case 10:/* EventList */
  1103. /* is used */
  1104. service->v2gMsg.Header.Notification.isused.EventList=1;
  1105. break;
  1106. case 31:/* ServiceName */
  1107. /* is used */
  1108. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceName=1;
  1109. break;
  1110. case 34:/* ServiceType */
  1111. /* is used */
  1112. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceType=1;
  1113. break;
  1114. case 32:/* ServiceScope */
  1115. /* is used */
  1116. service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.Service[service->v2gMsg.Body.ServiceDiscoveryRes.ServiceList.arraylen.Service].isused.ServiceScope=1;
  1117. break;
  1118. case 6:/* EPrice */
  1119. /* is used */
  1120. 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;
  1121. break;
  1122. case 41:/* TariffDescription */
  1123. /* is used */
  1124. service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.Tariff[service->v2gMsg.Body.PowerDiscoveryRes.TariffTable.arraylen.Tariff].isused.TariffDescription=1;
  1125. break;
  1126. case 16:/* MeterID */
  1127. /* is used */
  1128. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterID=1;
  1129. break;
  1130. case 18:/* MeterPubKey */
  1131. /* is used */
  1132. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterPubKey=1;
  1133. break;
  1134. case 19:/* MeterReading */
  1135. /* is used */
  1136. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterReading=1;
  1137. break;
  1138. case 20:/* MeterStatus */
  1139. /* is used */
  1140. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.MeterStatus=1;
  1141. break;
  1142. case 38:/* TMeter */
  1143. /* is used */
  1144. service->v2gMsg.Body.MeteringStatusRes.MeterInfo.isused.TMeter=1;
  1145. break;
  1146. }
  1147. break;case 6:
  1148. switch(service->eqn.localPart) {
  1149. case 6:/* Notification */
  1150. /* is used */
  1151. service->v2gMsg.Header.isused.Notification=1;
  1152. break;
  1153. }
  1154. break;
  1155. }
  1156. return 0;
  1157. }
  1158. /**
  1159. * Deserialize the EXI stream
  1160. * @return 0 = 0K; -1 = ERROR
  1161. */
  1162. static int deserializeMessage(struct v2gService* service)
  1163. {
  1164. int noEndOfDocument = 1; /* true */
  1165. int errno=0;
  1166. do {
  1167. exiDecodeNextEvent(&(service->inStream), &(service->stateDecode), &(service->event));
  1168. if (errno < 0) {
  1169. printf("[ERROR] %d \n", errno);
  1170. return errno;
  1171. }
  1172. switch (service->event) {
  1173. case START_DOCUMENT:
  1174. errno = exiDecodeStartDocument(&(service->inStream), &(service->stateDecode));
  1175. break;
  1176. case END_DOCUMENT:
  1177. errno = exiDecodeEndDocument(&(service->inStream), &(service->stateDecode));
  1178. noEndOfDocument = 0; /* false */
  1179. break;
  1180. case START_ELEMENT:
  1181. errno = exiDecodeStartElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
  1182. service->idPath.id[service->idPath.pos++]=service->eqn.localPart;
  1183. break;
  1184. case END_ELEMENT:
  1185. errno = exiDecodeEndElement(&(service->inStream), &(service->stateDecode), &(service->eqn));
  1186. service->idPath.pos--;
  1187. errno = deserializeElement(service);
  1188. break;
  1189. case CHARACTERS:
  1190. /* decode */
  1191. errno = exiDecodeCharacters(&(service->inStream), &(service->stateDecode), &(service->val));
  1192. /* assign character data to the v2g message structure */
  1193. errno = deserializeElementCharacter(service);
  1194. break;
  1195. case ATTRIBUTE:
  1196. /* decode */
  1197. /* errno = exiDecodeAttribute(&isStream, &stateDecode, &eqn, &val); */
  1198. break;
  1199. default:
  1200. /* ERROR */
  1201. return -1;
  1202. }
  1203. } while (noEndOfDocument);
  1204. return 0;
  1205. }
  1206. /* Initialize the v2g client */
  1207. 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)
  1208. {
  1209. /* init byte array */
  1210. service->val.binary = bytes;
  1211. /* init string array */
  1212. service->val.string = string;
  1213. /* init input / output stream */
  1214. service->inStream.data=inStream;
  1215. service->inStream.size=max_inStream_size;
  1216. service->outStream.data=outStream;
  1217. service->outStream.size=max_outStream_size;
  1218. return 0;
  1219. }