main_example.c 133 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709
  1. /*
  2. * Copyright (C) 2007-2015 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 Daniel.Peintner.EXT@siemens.com
  20. * @author Sebastian.Kaebisch@siemens.com
  21. * @version 0.9.3
  22. * @contact Joerg.Heuer@siemens.com
  23. *
  24. *
  25. ********************************************************************/
  26. #include <stdio.h>
  27. #include <stdarg.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include "EXITypes.h"
  31. #include "appHandEXIDatatypes.h"
  32. #include "appHandEXIDatatypesEncoder.h"
  33. #include "appHandEXIDatatypesDecoder.h"
  34. /* Activate support for DIN */
  35. #include "dinEXIDatatypes.h"
  36. #if DEPLOY_DIN_CODEC == SUPPORT_YES
  37. #include "dinEXIDatatypesEncoder.h"
  38. #include "dinEXIDatatypesDecoder.h"
  39. #endif /* DEPLOY_DIN_CODEC == SUPPORT_YES */
  40. /* Activate support for XMLDSIG */
  41. #include "xmldsigEXIDatatypes.h"
  42. #if DEPLOY_XMLDSIG_CODEC == SUPPORT_YES
  43. #include "xmldsigEXIDatatypesEncoder.h"
  44. #include "xmldsigEXIDatatypesDecoder.h"
  45. #endif /* DEPLOY_XMLDSIG_CODEC == SUPPORT_YES */
  46. #include "v2gEXIDatatypes.h"
  47. #include "v2gEXIDatatypesEncoder.h"
  48. #include "v2gEXIDatatypesDecoder.h"
  49. #include "v2gtp.h"
  50. #define BUFFER_SIZE 256
  51. uint8_t buffer1[BUFFER_SIZE];
  52. uint8_t buffer2[BUFFER_SIZE];
  53. #define ERROR_UNEXPECTED_REQUEST_MESSAGE -601
  54. #define ERROR_UNEXPECTED_SESSION_SETUP_RESP_MESSAGE -602
  55. #define ERROR_UNEXPECTED_SERVICE_DISCOVERY_RESP_MESSAGE -602
  56. #define ERROR_UNEXPECTED_SERVICE_DETAILS_RESP_MESSAGE -603
  57. #define ERROR_UNEXPECTED_PAYMENT_SERVICE_SELECTION_RESP_MESSAGE -604
  58. #define ERROR_UNEXPECTED_PAYMENT_DETAILS_RESP_MESSAGE -605
  59. #define ERROR_UNEXPECTED_AUTHORIZATION_RESP_MESSAGE -606
  60. #define ERROR_UNEXPECTED_CHARGE_PARAMETER_DISCOVERY_RESP_MESSAGE -607
  61. #define ERROR_UNEXPECTED_POWER_DELIVERY_RESP_MESSAGE -608
  62. #define ERROR_UNEXPECTED_CHARGING_STATUS_RESP_MESSAGE -609
  63. #define ERROR_UNEXPECTED_METERING_RECEIPT_RESP_MESSAGE -610
  64. #define ERROR_UNEXPECTED_SESSION_STOP_RESP_MESSAGE -611
  65. #define ERROR_UNEXPECTED_CABLE_CHECK_RESP_MESSAGE -612
  66. #define ERROR_UNEXPECTED_PRE_CHARGE_RESP_MESSAGE -612
  67. #define ERROR_UNEXPECTED_CURRENT_DEMAND_RESP_MESSAGE -613
  68. #define ERROR_UNEXPECTED_WELDING_DETECTION_RESP_MESSAGE -614
  69. static int writeStringToEXIString(char* string, exi_string_character_t* exiString) {
  70. int pos = 0;
  71. while(string[pos]!='\0')
  72. {
  73. exiString[pos] = string[pos];
  74. pos++;
  75. }
  76. return pos;
  77. }
  78. static void printASCIIString(exi_string_character_t* string, uint16_t len) {
  79. unsigned int i;
  80. for(i=0; i<len; i++) {
  81. printf("%c",(char)string[i]);
  82. }
  83. printf("\n");
  84. }
  85. static void printACEVSEStatus(struct v2gAC_EVSEStatusType* status)
  86. {
  87. printf("\tEVSEStatus:\n");
  88. printf("\t\tRCD=%d\n", status->RCD);
  89. printf("\t\tEVSENotification=%d\n", status->EVSENotification);
  90. printf("\t\tNotificationMaxDelay=%d\n", status->NotificationMaxDelay);
  91. }
  92. static void printDCEVSEStatus(struct v2gDC_EVSEStatusType* status)
  93. {
  94. if(status->EVSEIsolationStatus_isUsed) {
  95. printf("\tEVSEStatus:\n\t\tEVSEIsolationStatus=%d\n", status->EVSEIsolationStatus);
  96. }
  97. printf("\t\tEVSEStatusCode=%d\n", status->EVSEStatusCode);
  98. if(status->EVSENotification==v2gEVSENotificationType_None) {
  99. printf("\t\tEVSENotification=None_EVSENotificationType\n");
  100. }
  101. printf("\t\tNotificationMaxDelay=%d\n",status->NotificationMaxDelay);
  102. }
  103. static void printBinaryArray(uint8_t* byte, uint16_t len) {
  104. unsigned int i;
  105. for(i=0; i<len; i++) {
  106. printf("%d ",byte[i]);
  107. }
  108. printf("\n");
  109. }
  110. static void copyBytes(uint8_t* from, uint16_t len, uint8_t* to) {
  111. int i;
  112. for(i=0; i<len; i++) {
  113. to[i] = from[i];
  114. }
  115. }
  116. /* serializes EXI stream and adds V2G TP header */
  117. static int serializeEXI2Stream(struct v2gEXIDocument* exiIn, bitstream_t* stream) {
  118. int errn;
  119. *stream->pos = V2GTP_HEADER_LENGTH; /* v2gtp header */
  120. if( (errn = encode_v2gExiDocument(stream, exiIn)) == 0) {
  121. errn = write_v2gtpHeader(stream->data, (*stream->pos)-V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  122. }
  123. return errn;
  124. }
  125. /* deserializes V2G TP header and decodes right away EXI stream */
  126. static int deserializeStream2EXI(bitstream_t* streamIn, struct v2gEXIDocument* exi) {
  127. int errn;
  128. uint16_t payloadLength;
  129. *streamIn->pos = 0;
  130. if ( (errn = read_v2gtpHeader(streamIn->data, &payloadLength)) == 0) {
  131. *streamIn->pos += V2GTP_HEADER_LENGTH;
  132. errn = decode_v2gExiDocument(streamIn, exi);
  133. }
  134. return errn;
  135. }
  136. /** Example implementation of the app handshake protocol for the EVSE side */
  137. static int appHandshakeHandler(bitstream_t* iStream, bitstream_t* oStream) {
  138. struct appHandEXIDocument appHandResp;
  139. int i;
  140. struct appHandEXIDocument exiDoc;
  141. int errn = 0;
  142. uint16_t payloadLengthDec;
  143. if ( (errn = read_v2gtpHeader(iStream->data, &payloadLengthDec)) == 0) {
  144. *iStream->pos = V2GTP_HEADER_LENGTH;
  145. if( (errn = decode_appHandExiDocument(iStream, &exiDoc)) ) {
  146. /* an error occured */
  147. return errn;
  148. }
  149. }
  150. printf("EVSE side: List of application handshake protocols of the EV \n");
  151. for(i=0;i<exiDoc.supportedAppProtocolReq.AppProtocol.arrayLen;i++) {
  152. printf("\tProtocol entry #=%d\n",(i+1));
  153. printf("\t\tProtocolNamespace=");
  154. printASCIIString(exiDoc.supportedAppProtocolReq.AppProtocol.array[i].ProtocolNamespace.characters, exiDoc.supportedAppProtocolReq.AppProtocol.array[i].ProtocolNamespace.charactersLen);
  155. printf("\t\tVersion=%d.%d\n", exiDoc.supportedAppProtocolReq.AppProtocol.array[i].VersionNumberMajor, exiDoc.supportedAppProtocolReq.AppProtocol.array[i].VersionNumberMinor);
  156. printf("\t\tSchemaID=%d\n", exiDoc.supportedAppProtocolReq.AppProtocol.array[i].SchemaID);
  157. printf("\t\tPriority=%d\n", exiDoc.supportedAppProtocolReq.AppProtocol.array[i].Priority);
  158. }
  159. /* prepare response handshake response:
  160. * it is assumed, we support the 15118 1.0 version :-) */
  161. init_appHandEXIDocument(&appHandResp);
  162. appHandResp.supportedAppProtocolRes_isUsed = 1u;
  163. appHandResp.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  164. appHandResp.supportedAppProtocolRes.SchemaID = exiDoc.supportedAppProtocolReq.AppProtocol.array[0].SchemaID; /* signal the protocol by the provided schema id*/
  165. appHandResp.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  166. *oStream->pos = V2GTP_HEADER_LENGTH;
  167. if( (errn = encode_appHandExiDocument(oStream, &appHandResp)) == 0) {
  168. errn = write_v2gtpHeader(oStream->data, (*oStream->pos)-V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  169. }
  170. return errn;
  171. }
  172. static int appHandshake()
  173. {
  174. bitstream_t stream1;
  175. bitstream_t stream2;
  176. uint16_t payloadLengthDec;
  177. uint16_t pos1 = V2GTP_HEADER_LENGTH; /* v2gtp header */
  178. uint16_t pos2 = 0;
  179. struct appHandEXIDocument handshake;
  180. struct appHandEXIDocument handshakeResp;
  181. int errn = 0;
  182. char* ns0 = "urn:iso:15118:2:2010:MsgDef";
  183. char* ns1 = "urn:din:70121:2012:MsgDef";
  184. stream1.size = BUFFER_SIZE;
  185. stream1.data = buffer1;
  186. stream1.pos = &pos1;
  187. stream2.size = BUFFER_SIZE;
  188. stream2.data = buffer2;
  189. stream2.pos = &pos2;
  190. init_appHandEXIDocument(&handshake);
  191. printf("EV side: setup data for the supported application handshake request message\n");
  192. /* set up ISO/IEC 15118 Version 1.0 information */
  193. handshake.supportedAppProtocolReq_isUsed = 1u;
  194. handshake.supportedAppProtocolReq.AppProtocol.arrayLen = 2; /* we have only two protocols implemented */
  195. handshake.supportedAppProtocolReq.AppProtocol.array[0].ProtocolNamespace.charactersLen =
  196. writeStringToEXIString(ns0, handshake.supportedAppProtocolReq.AppProtocol.array[0].ProtocolNamespace.characters);
  197. handshake.supportedAppProtocolReq.AppProtocol.array[0].SchemaID = 1;
  198. handshake.supportedAppProtocolReq.AppProtocol.array[0].VersionNumberMajor = 1;
  199. handshake.supportedAppProtocolReq.AppProtocol.array[0].VersionNumberMinor = 0;
  200. handshake.supportedAppProtocolReq.AppProtocol.array[0].Priority = 1;
  201. handshake.supportedAppProtocolReq.AppProtocol.array[1].ProtocolNamespace.charactersLen =
  202. writeStringToEXIString(ns1, handshake.supportedAppProtocolReq.AppProtocol.array[1].ProtocolNamespace.characters);
  203. handshake.supportedAppProtocolReq.AppProtocol.array[1].SchemaID = 2;
  204. handshake.supportedAppProtocolReq.AppProtocol.array[1].VersionNumberMajor = 1;
  205. handshake.supportedAppProtocolReq.AppProtocol.array[1].VersionNumberMinor = 0;
  206. handshake.supportedAppProtocolReq.AppProtocol.array[1].Priority = 2;
  207. /* send app handshake request */
  208. if( (errn = encode_appHandExiDocument(&stream1, &handshake)) == 0) {
  209. if ( write_v2gtpHeader(stream1.data, pos1-V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE) == 0 ) {
  210. printf("EV side: send message to the EVSE\n");
  211. }
  212. }
  213. if (errn == 0) {
  214. /* read app handshake request & generate response */
  215. errn = appHandshakeHandler(&stream1, &stream2);
  216. }
  217. if (errn == 0) {
  218. /* check response */
  219. if ( (errn = read_v2gtpHeader(stream2.data, &payloadLengthDec)) == 0) {
  220. pos2 = V2GTP_HEADER_LENGTH;
  221. if(decode_appHandExiDocument(&stream2, &handshakeResp) == 0) {
  222. printf("EV side: Response of the EVSE \n");
  223. if(handshakeResp.supportedAppProtocolRes.ResponseCode == appHandresponseCodeType_OK_SuccessfulNegotiation) {
  224. printf("\t\tResponseCode=OK_SuccessfulNegotiation\n");
  225. printf("\t\tSchemaID=%d\n",handshakeResp.supportedAppProtocolRes.SchemaID);
  226. }
  227. }
  228. }
  229. }
  230. if (errn != 0) {
  231. printf("appHandshake error %d \n", errn);
  232. }
  233. return errn;
  234. }
  235. static int sessionSetup(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  236. printf("EVSE side: sessionSetup called\n" );
  237. printf("\tReceived data:\n");
  238. printf("\tHeader SessionID=");
  239. printBinaryArray(exiIn->V2G_Message.Header.SessionID.bytes, exiIn->V2G_Message.Header.SessionID.bytesLen);
  240. printf("\t\t EVCCID=%d\n", exiIn->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[0]);
  241. exiOut->V2G_Message_isUsed = 1u;
  242. /* generate an unique sessionID */
  243. init_v2gMessageHeaderType(&exiOut->V2G_Message.Header);
  244. exiOut->V2G_Message.Header.SessionID.bytes[0] = 1;
  245. exiOut->V2G_Message.Header.SessionID.bytes[1] = 2;
  246. exiOut->V2G_Message.Header.SessionID.bytes[2] = 3;
  247. exiOut->V2G_Message.Header.SessionID.bytes[3] = 4;
  248. exiOut->V2G_Message.Header.SessionID.bytes[4] = 5;
  249. exiOut->V2G_Message.Header.SessionID.bytes[5] = 6;
  250. exiOut->V2G_Message.Header.SessionID.bytes[6] = 7;
  251. exiOut->V2G_Message.Header.SessionID.bytes[7] = 8;
  252. exiOut->V2G_Message.Header.SessionID.bytesLen = 8;
  253. /* Prepare data for EV */
  254. init_v2gBodyType(&exiOut->V2G_Message.Body);
  255. exiOut->V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  256. init_v2gSessionSetupResType(&exiOut->V2G_Message.Body.SessionSetupRes);
  257. exiOut->V2G_Message.Body.SessionSetupRes.ResponseCode = v2gresponseCodeType_OK;
  258. exiOut->V2G_Message.Body.SessionSetupRes.EVSEID.characters[0] = 0;
  259. exiOut->V2G_Message.Body.SessionSetupRes.EVSEID.characters[1] = 20;
  260. exiOut->V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 2;
  261. exiOut->V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  262. exiOut->V2G_Message.Body.SessionSetupRes.EVSETimeStamp = 123456789;
  263. return 0;
  264. }
  265. static int serviceDiscovery(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  266. printf("EVSE side: serviceDiscovery called\n" );
  267. printf("\tReceived data:\n");
  268. printf("\tHeader SessionID=");
  269. printBinaryArray(exiIn->V2G_Message.Header.SessionID.bytes, exiIn->V2G_Message.Header.SessionID.bytesLen);
  270. printf("\t\t ServiceCategory=%d\n", exiIn->V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory);
  271. /* Prepare data for EV */
  272. exiOut->V2G_Message_isUsed = 1u;
  273. init_v2gBodyType(&exiOut->V2G_Message.Body);
  274. exiOut->V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  275. init_v2gServiceDiscoveryResType(&exiOut->V2G_Message.Body.ServiceDiscoveryRes);
  276. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 0u; /* we do not provide VAS */
  277. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = v2gresponseCodeType_OK;
  278. /* result->ChargeService.SupportedEnergyTransferMode = AC_single_phase_core_EnergyTransferModeType; */
  279. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = 1; /* ID of the charge service */
  280. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1u;
  281. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[0] = 'A';
  282. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[1] = 'C';
  283. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[2] = '_';
  284. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[3] = 'D';
  285. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[4] = 'C';
  286. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[5] = '\0';
  287. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = 5;
  288. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceScope_isUsed = 1u;
  289. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1;
  290. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = v2gserviceCategoryType_EVCharging;
  291. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceScope_isUsed = 1u;
  292. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceScope.characters[0] = 100;
  293. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceScope.characters[1] = '\0';
  294. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceScope.charactersLen = 1;
  295. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = v2gEnergyTransferModeType_DC_combo_core;
  296. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[1] = v2gEnergyTransferModeType_AC_single_phase_core;
  297. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 2;
  298. exiOut->V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = v2gpaymentOptionType_ExternalPayment; /* EVSE handles the payment */
  299. exiOut->V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[1] = v2gpaymentOptionType_Contract;
  300. exiOut->V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 2;
  301. if(exiIn->V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory==v2gserviceCategoryType_Internet || exiIn->V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory==v2gserviceCategoryType_OtherCustom || exiIn->V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory_isUsed == 0u) {
  302. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen = 2;
  303. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].FreeService=1;
  304. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceID=22; /* ID of the charge service */
  305. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceName_isUsed = 1u;
  306. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceName.characters[0]='W';
  307. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceName.characters[1]='W';
  308. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceName.characters[2]='W';
  309. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceName.charactersLen = 3;
  310. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceCategory= v2gserviceCategoryType_Internet;
  311. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[0].ServiceScope_isUsed = 0u;
  312. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].FreeService=0;
  313. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceID=33; /* ID of the charge service */
  314. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName_isUsed = 1u;
  315. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName.characters[0]='H';
  316. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName.characters[1]='T';
  317. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName.characters[2]='T';
  318. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName.characters[3]='P';
  319. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName.characters[4]='S';
  320. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceName.charactersLen = 5;
  321. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceCategory=v2gserviceCategoryType_Internet;
  322. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[1].ServiceScope_isUsed = 0u;
  323. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  324. } else {
  325. exiOut->V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 0u; /* no value added service requested */
  326. }
  327. return 0;
  328. }
  329. static int serviceDetail(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  330. printf("EVSE side: serviceDetail called\n" );
  331. printf("\tReceived data:\n");
  332. printf("\tHeader SessionID=");
  333. printBinaryArray(exiIn->V2G_Message.Header.SessionID.bytes, exiIn->V2G_Message.Header.SessionID.bytesLen);
  334. printf("\t\t ServiceDetailID=%d\n",exiIn->V2G_Message.Body.ServiceDetailReq.ServiceID);
  335. /* Prepare data for EV */
  336. exiOut->V2G_Message_isUsed = 1u;
  337. init_v2gBodyType(&exiOut->V2G_Message.Body);
  338. exiOut->V2G_Message.Body.ServiceDetailRes_isUsed= 1u;
  339. init_v2gServiceDetailResType(&exiOut->V2G_Message.Body.ServiceDetailRes);
  340. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceID = 1234;
  341. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1u;
  342. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 2;
  343. /* Parameter Set 1*/
  344. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].ParameterSetID = 1;
  345. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.arrayLen = 2;
  346. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.charactersLen = 8;
  347. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[0] = 'P';
  348. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[1] = 'r';
  349. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[2] = 'o';
  350. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[3] = 't';
  351. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[4]= 'o';
  352. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[5] = 'c';
  353. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[6] = 'o';
  354. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters[7] = 'l';
  355. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].intValue = 15119;
  356. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].intValue_isUsed = 1u;
  357. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.charactersLen = 4;
  358. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters[0] = 'N';
  359. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters[1] = 'a';
  360. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters[2] = 'm';
  361. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters[3] = 'e';
  362. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].stringValue_isUsed = 1u;
  363. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].stringValue.charactersLen = 3;
  364. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].stringValue.characters[0] = 'V';
  365. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].stringValue.characters[1] = '2';
  366. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].stringValue.characters[2] = 'G';
  367. /* Parameter Set 2 */
  368. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].ParameterSetID = 2;
  369. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.arrayLen = 1;
  370. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.charactersLen = 7;
  371. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[0] = 'C';
  372. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[1] = 'h';
  373. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[2] = 'a';
  374. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[3] = 'n';
  375. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[4] = 'n';
  376. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[5] = 'e';
  377. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters[6] = 'l';
  378. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].physicalValue_isUsed = 1u;
  379. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].physicalValue.Value = 1234;
  380. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].physicalValue.Unit = v2gunitSymbolType_m;
  381. exiOut->V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].physicalValue.Multiplier = 0;
  382. exiOut->V2G_Message.Body.ServiceDetailRes.ResponseCode = v2gresponseCodeType_OK;
  383. return 0;
  384. }
  385. static int paymentServiceSelection(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  386. int i;
  387. printf("EVSE side: paymentServiceSelection called\n" );
  388. printf("\tReceived data:\n");
  389. printf("\tHeader SessionID=");
  390. printBinaryArray(exiIn->V2G_Message.Header.SessionID.bytes, exiIn->V2G_Message.Header.SessionID.bytesLen);
  391. if(exiIn->V2G_Message.Body.PaymentServiceSelectionReq.SelectedPaymentOption == v2gpaymentOptionType_ExternalPayment) {
  392. printf("\t\t SelectedPaymentOption=ExternalPayment\n");
  393. }
  394. for(i=0; i<exiIn->V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.arrayLen;i++)
  395. {
  396. printf("\t\t ServiceID=%d\n", exiIn->V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[i].ServiceID);
  397. if(exiIn->V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[i].ParameterSetID_isUsed) {
  398. printf("\t\t ParameterSetID=%d\n", exiIn->V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[i].ParameterSetID);
  399. }
  400. }
  401. /* Prepare data for EV */
  402. exiOut->V2G_Message_isUsed = 1u;
  403. init_v2gBodyType(&exiOut->V2G_Message.Body);
  404. exiOut->V2G_Message.Body.PaymentServiceSelectionRes_isUsed= 1u;
  405. init_v2gPaymentServiceSelectionResType(&exiOut->V2G_Message.Body.PaymentServiceSelectionRes);
  406. exiOut->V2G_Message.Body.ServiceDetailRes.ResponseCode = v2gresponseCodeType_OK;
  407. return 0;
  408. }
  409. static int paymentDetails(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  410. printf("EVSE side: paymentDetails called\n" );
  411. printf("\tReceived data:\n");
  412. printf("\t\t eMAID=%d\n", exiIn->V2G_Message.Body.PaymentDetailsReq.eMAID.characters[0]);
  413. printf("\t\t ID=%c%c\n", exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Id.characters[0], exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Id.characters[1]);
  414. printf("\t\t Certificate=%c%c\n", exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Certificate.bytes[0], exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Certificate.bytes[1]);
  415. printf("\t\t SubCertificate 1=%c%c\n", exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[0].bytes[0], exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[0].bytes[1]);
  416. printf("\t\t SubCertificate 2=%c%c\n", exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[1].bytes[0], exiIn->V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[1].bytes[1]);
  417. /* Prepare data for EV */
  418. exiOut->V2G_Message_isUsed = 1u;
  419. init_v2gBodyType(&exiOut->V2G_Message.Body);
  420. exiOut->V2G_Message.Body.PaymentDetailsRes_isUsed = 1u;
  421. exiOut->V2G_Message.Body.PaymentDetailsRes.ResponseCode = v2gresponseCodeType_OK;
  422. exiOut->V2G_Message.Body.PaymentDetailsRes.GenChallenge.bytesLen = 1;
  423. exiOut->V2G_Message.Body.PaymentDetailsRes.GenChallenge.bytes[0] = 1;
  424. exiOut->V2G_Message.Body.PaymentDetailsRes.EVSETimeStamp = 123456;
  425. return 0;
  426. }
  427. static int authorization(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  428. printf("EVSE: Authorization called\n" );
  429. printf("\tReceived data:\n");
  430. if(exiIn->V2G_Message.Body.AuthorizationReq.GenChallenge_isUsed) {
  431. printf("\t\t\t GenChallenge=%d\n", exiIn->V2G_Message.Body.AuthorizationReq.GenChallenge.bytes[0]);
  432. }
  433. if(exiIn->V2G_Message.Body.AuthorizationReq.Id_isUsed ) {
  434. printf("\t\t\t ID=%c%c%c\n", exiIn->V2G_Message.Body.AuthorizationReq.Id.characters[0], exiIn->V2G_Message.Body.AuthorizationReq.Id.characters[1], exiIn->V2G_Message.Body.AuthorizationReq.Id.characters[2]);
  435. }
  436. /* Prepare data for EV */
  437. exiOut->V2G_Message_isUsed = 1u;
  438. init_v2gBodyType(&exiOut->V2G_Message.Body);
  439. exiOut->V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  440. exiOut->V2G_Message.Body.AuthorizationRes.ResponseCode = v2gresponseCodeType_OK;
  441. exiOut->V2G_Message.Body.AuthorizationRes.EVSEProcessing = v2gEVSEProcessingType_Finished;
  442. return 0;
  443. }
  444. static int chargeParameterDiscovery(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  445. printf("EVSE side: chargeParameterDiscovery called\n" );
  446. printf("\tReceived data:\n");
  447. printf("\t\t EVRequestedEnergyTransferType=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.RequestedEnergyTransferMode);
  448. /* check,if DC or AC is requested */
  449. if(exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.RequestedEnergyTransferMode == v2gEnergyTransferModeType_DC_core || exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter_isUsed == 1) {
  450. printf("\t\t MaxEntriesSAScheduleTuple=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.MaxEntriesSAScheduleTuple);
  451. printf("\t\t EVStatus:\n");
  452. printf("\t\t\t EVReady=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DC_EVStatus.EVReady);
  453. printf("\t\t\t EVRESSSOC=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DC_EVStatus.EVRESSSOC);
  454. printf("\t\t\t EVErrorCode=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  455. printf("\t\t DepartureTime=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DepartureTime);
  456. printf("\t\t EVMaximumCurrentLimit=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumCurrentLimit.Value);
  457. printf("\t\t EVMaximumPowerLimit=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumPowerLimit.Value);
  458. printf("\t\t EVMaximumVoltageLimit=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumVoltageLimit.Value);
  459. printf("\t\t EVEnergyCapacity=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyCapacity.Value);
  460. printf("\t\t EVEnergyRequest=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyRequest.Value);
  461. printf("\t\t FullSOC=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.FullSOC);
  462. printf("\t\t BulkSOC=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.BulkSOC);
  463. /* Prepare data for EV */
  464. exiOut->V2G_Message_isUsed = 1u;
  465. init_v2gBodyType(&exiOut->V2G_Message.Body);
  466. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  467. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.ResponseCode = v2gresponseCodeType_OK;
  468. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.EVSEProcessing = v2gEVSEProcessingType_Finished;
  469. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter_isUsed = 1u;
  470. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter_isUsed = 0u;
  471. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.DC_EVSEStatus.EVSEStatusCode = v2gDC_EVSEStatusCodeType_EVSE_Ready;
  472. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.DC_EVSEStatus.EVSEIsolationStatus = v2gisolationLevelType_Valid;
  473. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1;
  474. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.DC_EVSEStatus.EVSENotification = v2gEVSENotificationType_None;
  475. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.DC_EVSEStatus.NotificationMaxDelay = 10;
  476. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Multiplier = 0;
  477. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Unit = v2gunitSymbolType_A;
  478. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Value = 50;
  479. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumPowerLimit.Multiplier = 0;
  480. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumPowerLimit.Unit = v2gunitSymbolType_W;
  481. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumPowerLimit.Value = 20000;
  482. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumVoltageLimit.Multiplier = 0;
  483. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumVoltageLimit.Unit = v2gunitSymbolType_V;
  484. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumVoltageLimit.Value = 400;
  485. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Multiplier = 0;
  486. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Unit = v2gunitSymbolType_A;
  487. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Value = 5;
  488. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumVoltageLimit.Multiplier = 0;
  489. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumVoltageLimit.Unit = v2gunitSymbolType_V;
  490. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumVoltageLimit.Value = 200;
  491. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSECurrentRegulationTolerance.Multiplier = 0;
  492. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSECurrentRegulationTolerance.Unit = v2gunitSymbolType_A;
  493. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSECurrentRegulationTolerance.Value = 2;
  494. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSECurrentRegulationTolerance_isUsed = 1u;
  495. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEPeakCurrentRipple.Multiplier = 0;
  496. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEPeakCurrentRipple.Unit = v2gunitSymbolType_A;
  497. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEPeakCurrentRipple.Value = 1;
  498. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEEnergyToBeDelivered.Multiplier = 0;
  499. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEEnergyToBeDelivered.Unit = v2gunitSymbolType_W;
  500. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEEnergyToBeDelivered.Value = 5000;
  501. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEEnergyToBeDelivered_isUsed = 1u;
  502. /* set up a PMax schedule */
  503. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList_isUsed = 1u;
  504. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SAScheduleTupleID = 10;
  505. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff_isUsed = 0; /* no tariffs */
  506. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.arrayLen = 2;
  507. /* set up two PMax entries: #1 */
  508. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Value=20000;
  509. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Unit = v2gunitSymbolType_W;
  510. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Multiplier =0;
  511. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  512. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start=0;
  513. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 0;
  514. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Value=0;
  515. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Unit = v2gunitSymbolType_W;
  516. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Multiplier =0;
  517. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval_isUsed = 1u;
  518. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.start=1200; /* 20 min */
  519. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.duration_isUsed =0;
  520. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen =2; /* we set up two time entries */
  521. /* #2 */
  522. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SAScheduleTupleID = 15;
  523. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Value = 10000;
  524. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Unit = v2gunitSymbolType_W;
  525. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Multiplier =0;
  526. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start=0;
  527. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1;
  528. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 0u;
  529. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Value=0;
  530. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Unit = v2gunitSymbolType_W;
  531. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Multiplier =1;
  532. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.start=1800; /* 30 min */
  533. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval_isUsed = 1u;
  534. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.duration=3600;
  535. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.duration_isUsed = 1u;
  536. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.arrayLen =2; /* we set up two time entries */
  537. } else { /* AC related */
  538. printf("\t\t DepartureTime=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.DepartureTime);
  539. printf("\t\t EAmount=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EAmount.Value);
  540. printf("\t\t EVMaxCurrent=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxCurrent.Value);
  541. printf("\t\t EVMaxVoltage=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxVoltage.Value);
  542. printf("\t\t EVMinCurrent=%d\n", exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMinCurrent.Value);
  543. /* Prepare data for EV */
  544. exiOut->V2G_Message_isUsed = 1u;
  545. init_v2gBodyType(&exiOut->V2G_Message.Body);
  546. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  547. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.ResponseCode = v2gresponseCodeType_OK;
  548. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.EVSEProcessing = v2gEVSEProcessingType_Finished;
  549. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter_isUsed = 1u;
  550. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter_isUsed = 0u;
  551. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.AC_EVSEStatus.RCD =1;
  552. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.AC_EVSEStatus.EVSENotification = v2gEVSENotificationType_None;
  553. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.AC_EVSEStatus.NotificationMaxDelay=123;
  554. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSEMaxCurrent.Multiplier = 0;
  555. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSEMaxCurrent.Unit = v2gunitSymbolType_A;
  556. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSEMaxCurrent.Value = 100;
  557. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSENominalVoltage.Multiplier = 0;
  558. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSENominalVoltage.Unit = v2gunitSymbolType_V;
  559. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSENominalVoltage.Value = 300;
  560. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.EVSEProcessing = 1;
  561. /* set up a PMax schedule */
  562. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList_isUsed = 1u;
  563. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SAScheduleTupleID = 10;
  564. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff_isUsed = 0; /* no tariffs */
  565. /* set up two PMax entries: #1 */
  566. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Value=20000;
  567. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Unit = v2gunitSymbolType_W;
  568. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Multiplier =0;
  569. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start=0;
  570. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  571. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed =0;
  572. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Value=0;
  573. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Unit = v2gunitSymbolType_W;
  574. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].PMax.Multiplier =0;
  575. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.start=1200; /* 20 min */
  576. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval_isUsed = 1u;
  577. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[1].RelativeTimeInterval.duration_isUsed =0;
  578. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen =2; /* we set up two time entries */
  579. /* set up sale entries */
  580. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.NumEPriceLevels=2;
  581. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.NumEPriceLevels_isUsed = 1u;
  582. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffID=20;
  583. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.Id.characters[0]=100;
  584. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.Id.charactersLen=1;
  585. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.Id_isUsed =1;
  586. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].EPriceLevel=2;
  587. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].EPriceLevel_isUsed =1;
  588. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].ConsumptionCost.arrayLen =0;
  589. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].RelativeTimeInterval.start=0;
  590. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].RelativeTimeInterval_isUsed = 1;
  591. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].RelativeTimeInterval.duration=10;
  592. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SalesTariff.SalesTariffEntry.array[0].RelativeTimeInterval.duration_isUsed =1;
  593. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].EPriceLevel=3;
  594. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].RelativeTimeInterval.start=11;
  595. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].RelativeTimeInterval.duration=10;
  596. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].RelativeTimeInterval_isUsed = 1;
  597. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].RelativeTimeInterval.duration_isUsed =1;
  598. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.array[0].Cost.array[0].amount=10;
  599. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.array[0].Cost.array[0].amountMultiplier=1;
  600. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.array[0].Cost.array[0].amountMultiplier_isUsed =1;
  601. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.array[0].Cost.array[0].costKind= v2gcostKindType_RenewableGenerationPercentage;
  602. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.array[0].startValue.Value=123;
  603. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.array[0].Cost.arrayLen = 1;
  604. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].EPriceLevel_isUsed =1;
  605. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].SalesTariff.SalesTariffEntry.array[1].ConsumptionCost.arrayLen = 1;
  606. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  607. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 1u;
  608. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Value=0;
  609. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Multiplier = 0;
  610. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[1].PMaxSchedule.PMaxScheduleEntry.array[0].PMax.Value = 0;
  611. exiOut->V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.arrayLen = 2;
  612. }
  613. return 0;
  614. }
  615. static int powerDelivery(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  616. int i;
  617. printf("EVSE side: powerDelivery called\n" );
  618. printf("\tReceived data:\n");
  619. printf("\t\t ChargeProgress=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.ChargeProgress);
  620. printf("\t\t SAScheduleTupleID=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID);
  621. /* Prepare data for EV */
  622. exiOut->V2G_Message_isUsed = 1u;
  623. init_v2gBodyType(&exiOut->V2G_Message.Body);
  624. exiOut->V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  625. if(exiIn->V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter_isUsed) {
  626. printf("\t\t EVStatus:\n");
  627. printf("\t\t\t EVReady=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.DC_EVStatus.EVReady);
  628. printf("\t\t\t EVRESSSOC=%d\n",exiIn->V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.DC_EVStatus.EVRESSSOC);
  629. printf("\t\t\t EVErrorCode=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  630. printf("\t\t BulkChargingComplete=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.BulkChargingComplete);
  631. printf("\t\t ChargingComplete=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.ChargingComplete);
  632. if(exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile_isUsed) {
  633. printf("\t\t\tChargingProfile:\n");
  634. printf("\t\t\t SAScheduleTupleID=%d\n",exiIn->V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID );
  635. for(i=0;i<exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.arrayLen;i++) {
  636. printf("\t\t\t Entry#%d\n",i);
  637. printf("\t\t\t\t ChargingProfileEntryMaxPower=%d (%d %d) \n", exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[i].ChargingProfileEntryMaxPower.Value, exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[i].ChargingProfileEntryMaxPower.Unit, exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[i].ChargingProfileEntryMaxPower.Multiplier);
  638. printf("\t\t\t\t ChargingProfileEntryStart=%d\n",exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[i].ChargingProfileEntryStart);
  639. printf("\t\t\t\t ChargingProfileEntryMaxNumberOfPhasesInUse=%d\n", exiIn->V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[i].ChargingProfileEntryMaxNumberOfPhasesInUse);
  640. }
  641. }
  642. exiOut->V2G_Message.Body.PowerDeliveryRes.ResponseCode = v2gresponseCodeType_OK;
  643. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus.EVSEIsolationStatus =0;
  644. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1;
  645. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus.EVSEStatusCode = v2gDC_EVSEStatusCodeType_EVSE_Ready;
  646. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus.EVSENotification = v2gEVSENotificationType_None;
  647. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus.NotificationMaxDelay = 123;
  648. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus_isUsed = 1;
  649. exiOut->V2G_Message.Body.PowerDeliveryRes.AC_EVSEStatus_isUsed = 0;
  650. } else {
  651. exiOut->V2G_Message.Body.PowerDeliveryRes.ResponseCode = v2gresponseCodeType_OK;
  652. exiOut->V2G_Message.Body.PowerDeliveryRes.AC_EVSEStatus.RCD=0;
  653. exiOut->V2G_Message.Body.PowerDeliveryRes.AC_EVSEStatus.EVSENotification=3;
  654. exiOut->V2G_Message.Body.PowerDeliveryRes.AC_EVSEStatus.NotificationMaxDelay=12;
  655. exiOut->V2G_Message.Body.PowerDeliveryRes.AC_EVSEStatus_isUsed = 1;
  656. exiOut->V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus_isUsed = 0;
  657. }
  658. return 0;
  659. }
  660. static int chargingStatus(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  661. printf("EVSE side: chargingStatus called\n" );
  662. /* Prepare data for EV */
  663. exiOut->V2G_Message_isUsed = 1u;
  664. init_v2gBodyType(&exiOut->V2G_Message.Body);
  665. exiOut->V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  666. exiOut->V2G_Message.Body.ChargingStatusRes.ResponseCode = v2gresponseCodeType_OK;
  667. exiOut->V2G_Message.Body.ChargingStatusRes.EVSEID.characters[0]=12;
  668. exiOut->V2G_Message.Body.ChargingStatusRes.EVSEID.charactersLen =1;
  669. exiOut->V2G_Message.Body.ChargingStatusRes.AC_EVSEStatus.RCD=1;
  670. exiOut->V2G_Message.Body.ChargingStatusRes.AC_EVSEStatus.EVSENotification = v2gEVSENotificationType_None;
  671. exiOut->V2G_Message.Body.ChargingStatusRes.AC_EVSEStatus.NotificationMaxDelay=123;
  672. exiOut->V2G_Message.Body.ChargingStatusRes.ReceiptRequired=1;
  673. exiOut->V2G_Message.Body.ChargingStatusRes.ReceiptRequired_isUsed =1;
  674. exiOut->V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent.Multiplier = 2;
  675. exiOut->V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent.Unit = v2gunitSymbolType_A;
  676. exiOut->V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent.Value = 400;
  677. exiOut->V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent_isUsed =1;
  678. exiOut->V2G_Message.Body.ChargingStatusRes.SAScheduleTupleID=10;
  679. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo_isUsed =1;
  680. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterID.charactersLen =1;
  681. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterID.characters[0]=2;
  682. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterReading = 5000;
  683. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterStatus = 4321;
  684. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.TMeter =123456789;
  685. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.SigMeterReading.bytes[0]=123;
  686. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.SigMeterReading.bytesLen=1;
  687. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterReading_isUsed = 1;
  688. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterStatus_isUsed =1;
  689. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.TMeter_isUsed=1;
  690. exiOut->V2G_Message.Body.ChargingStatusRes.MeterInfo.SigMeterReading_isUsed =1;
  691. return 0;
  692. }
  693. static int meteringReceipt(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  694. printf("EVSE side: meteringReceipt called\n" );
  695. printf("\tReceived data:\n");
  696. printf("\t\t ID=%c%c%c\n", exiIn->V2G_Message.Body.MeteringReceiptReq.Id.characters[0], exiIn->V2G_Message.Body.MeteringReceiptReq.Id.characters[1], exiIn->V2G_Message.Body.MeteringReceiptReq.Id.characters[2]);
  697. printf("\t\t SAScheduleTupleID=%d\n", exiIn->V2G_Message.Body.MeteringReceiptReq.SAScheduleTupleID);
  698. printf("\t\t SessionID=%d\n", exiIn->V2G_Message.Body.MeteringReceiptReq.SessionID.bytes[1]);
  699. printf("\t\t MeterInfo.MeterStatus=%d\n", exiIn->V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterStatus);
  700. printf("\t\t MeterInfo.MeterID=%d\n", exiIn->V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterID.characters[0]);
  701. printf("\t\t MeterInfo.isused.MeterReading=%d\n", exiIn->V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterReading_isUsed);
  702. printf("\t\t MeterReading.Value=%lu\n", (long unsigned int)exiIn->V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterReading);
  703. printf("\t\t MeterInfo.TMeter=%li\n", (long int)exiIn->V2G_Message.Body.MeteringReceiptReq.MeterInfo.TMeter);
  704. /* Prepare data for EV */
  705. exiOut->V2G_Message_isUsed = 1u;
  706. init_v2gBodyType(&exiOut->V2G_Message.Body);
  707. exiOut->V2G_Message.Body.MeteringReceiptRes_isUsed = 1u;
  708. exiOut->V2G_Message.Body.MeteringReceiptRes.ResponseCode = v2gresponseCodeType_OK;
  709. exiOut->V2G_Message.Body.MeteringReceiptRes.AC_EVSEStatus.RCD=1;
  710. exiOut->V2G_Message.Body.MeteringReceiptRes.AC_EVSEStatus.EVSENotification= v2gEVSENotificationType_None;
  711. exiOut->V2G_Message.Body.MeteringReceiptRes.AC_EVSEStatus.NotificationMaxDelay=123;
  712. return 0;
  713. }
  714. static int sessionStop(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  715. printf("EVSE side: sessionStop called\n" );
  716. printf("\tReceived data:\n");
  717. printf("\tHeader SessionID=");
  718. printBinaryArray(exiIn->V2G_Message.Header.SessionID.bytes, exiIn->V2G_Message.Header.SessionID.bytesLen);
  719. printf("\t\t ChargingSession=%d\n", exiIn->V2G_Message.Body.SessionStopReq.ChargingSession);
  720. /* Prepare data for EV */
  721. exiOut->V2G_Message_isUsed = 1u;
  722. init_v2gBodyType(&exiOut->V2G_Message.Body);
  723. exiOut->V2G_Message.Body.SessionStopRes_isUsed = 1u;
  724. exiOut->V2G_Message.Body.SessionStopRes.ResponseCode = v2gresponseCodeType_OK;
  725. return 0;
  726. }
  727. static int cableCheck(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  728. printf("EVSE side: cableCheck called\n" );
  729. printf("\tReceived data:\n");
  730. printf("\t\t EVStatus:\n");
  731. printf("\t\t\t EVReady=%d\n", exiIn->V2G_Message.Body.CableCheckReq.DC_EVStatus.EVReady);
  732. printf("\t\t\t EVRESSSOC=%d\n", exiIn->V2G_Message.Body.CableCheckReq.DC_EVStatus.EVRESSSOC);
  733. printf("\t\t\t EVErrorCode=%d\n", exiIn->V2G_Message.Body.CableCheckReq.DC_EVStatus.EVErrorCode);
  734. /* Prepare data for EV */
  735. exiOut->V2G_Message_isUsed = 1u;
  736. init_v2gBodyType(&exiOut->V2G_Message.Body);
  737. exiOut->V2G_Message.Body.CableCheckRes_isUsed = 1u;
  738. exiOut->V2G_Message.Body.CableCheckRes.ResponseCode = v2gresponseCodeType_OK;
  739. exiOut->V2G_Message.Body.CableCheckRes.EVSEProcessing = v2gEVSEProcessingType_Finished;
  740. exiOut->V2G_Message.Body.CableCheckRes.DC_EVSEStatus.EVSEIsolationStatus= v2gisolationLevelType_Valid;
  741. exiOut->V2G_Message.Body.CableCheckRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  742. exiOut->V2G_Message.Body.CableCheckRes.DC_EVSEStatus.EVSEStatusCode = v2gDC_EVSEStatusCodeType_EVSE_Ready;
  743. exiOut->V2G_Message.Body.CableCheckRes.DC_EVSEStatus.EVSENotification= v2gEVSENotificationType_None;
  744. exiOut->V2G_Message.Body.CableCheckRes.DC_EVSEStatus.NotificationMaxDelay = 1234;
  745. return 0;
  746. }
  747. static int preCharge(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  748. printf("EVSE side: preCharge called\n" );
  749. printf("\tReceived data:\n");
  750. printf("\t\t EVStatus:\n");
  751. printf("\t\t\t EVReady=%d\n", exiIn->V2G_Message.Body.PreChargeReq.DC_EVStatus.EVReady);
  752. printf("\t\t\t EVRESSSOC=%d\n", exiIn->V2G_Message.Body.PreChargeReq.DC_EVStatus.EVRESSSOC);
  753. printf("\t\t\t EVErrorCode=%d\n", exiIn->V2G_Message.Body.PreChargeReq.DC_EVStatus.EVErrorCode);
  754. printf("\t\t EVTargetCurrent=%d (%d %d)\n", exiIn->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Value, exiIn->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Unit, exiIn->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Multiplier);
  755. printf("\t\t EVTargetVoltage=%d (%d %d)\n", exiIn->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Value, exiIn->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Unit, exiIn->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Multiplier);
  756. /* Prepare data for EV */
  757. exiOut->V2G_Message_isUsed = 1u;
  758. init_v2gBodyType(&exiOut->V2G_Message.Body);
  759. exiOut->V2G_Message.Body.PreChargeRes_isUsed = 1u;
  760. exiOut->V2G_Message.Body.PreChargeRes.ResponseCode = v2gresponseCodeType_OK;
  761. exiOut->V2G_Message.Body.PreChargeRes.DC_EVSEStatus.EVSEIsolationStatus= v2gisolationLevelType_Valid;
  762. exiOut->V2G_Message.Body.PreChargeRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  763. exiOut->V2G_Message.Body.PreChargeRes.DC_EVSEStatus.EVSEStatusCode = v2gDC_EVSEStatusCodeType_EVSE_Ready;
  764. exiOut->V2G_Message.Body.PreChargeRes.DC_EVSEStatus.EVSENotification = v2gEVSENotificationType_None;
  765. exiOut->V2G_Message.Body.PreChargeRes.DC_EVSEStatus.NotificationMaxDelay= 1234;
  766. exiOut->V2G_Message.Body.PreChargeRes.EVSEPresentVoltage.Multiplier = 0;
  767. exiOut->V2G_Message.Body.PreChargeRes.EVSEPresentVoltage.Unit = v2gunitSymbolType_V;
  768. exiOut->V2G_Message.Body.PreChargeRes.EVSEPresentVoltage.Value= 100;
  769. return 0;
  770. }
  771. static int currentDemand(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  772. printf("EVSE side: currentDemand called\n" );
  773. printf("\tReceived data:\n");
  774. printf("\t\t EVStatus:\n");
  775. printf("\t\t\t EVReady=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady);
  776. printf("\t\t\t EVRESSSOC=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC);
  777. printf("\t\t\t EVErrorCode=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode);
  778. printf("\t\t EVTargetCurrent=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value);
  779. printf("\t\t EVMaximumVoltageLimit=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Value);
  780. printf("\t\t EVMaximumPowerLimit=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Value);
  781. printf("\t\t EVMaximumCurrentLimit=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Value);
  782. printf("\t\t BulkChargingComplete=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.BulkChargingComplete);
  783. printf("\t\t ChargingComplete=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.ChargingComplete);
  784. printf("\t\t RemainingTimeToFullSoC=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Value);
  785. printf("\t\t RemainingTimeToBulkSoC=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Value);
  786. printf("\t\t EVTargetVoltage=%d\n", exiIn->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value);
  787. /* Prepare data for EV */
  788. exiOut->V2G_Message_isUsed = 1u;
  789. init_v2gBodyType(&exiOut->V2G_Message.Body);
  790. exiOut->V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  791. exiOut->V2G_Message.Body.CurrentDemandRes.ResponseCode = v2gresponseCodeType_OK;
  792. exiOut->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus= v2gisolationLevelType_Valid;
  793. exiOut->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1;
  794. exiOut->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEStatusCode = v2gDC_EVSEStatusCodeType_EVSE_Ready;
  795. exiOut->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSENotification= v2gEVSENotificationType_None;
  796. exiOut->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.NotificationMaxDelay=1234;
  797. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Multiplier = 0;
  798. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Unit = v2gunitSymbolType_V;
  799. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Value = 400;
  800. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Multiplier = 0;
  801. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Unit = v2gunitSymbolType_A;
  802. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Value = 45;
  803. exiOut->V2G_Message.Body.CurrentDemandRes.EVSECurrentLimitAchieved=0;
  804. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEVoltageLimitAchieved=1;
  805. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEPowerLimitAchieved=0;
  806. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Multiplier = 0;
  807. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Unit = v2gunitSymbolType_V;
  808. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Value = 400;
  809. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit_isUsed = 1u;
  810. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Multiplier = 0;
  811. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Unit = v2gunitSymbolType_A;
  812. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Value = 50;
  813. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit_isUsed = 1u;
  814. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Multiplier = 0;
  815. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Unit = v2gunitSymbolType_W;
  816. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Value = 20000;
  817. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit_isUsed = 1u;
  818. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEID.characters[0]=12;
  819. exiOut->V2G_Message.Body.CurrentDemandRes.EVSEID.charactersLen = 1;
  820. exiOut->V2G_Message.Body.CurrentDemandRes.SAScheduleTupleID = 123;
  821. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo_isUsed = 1u;
  822. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.charactersLen =1;
  823. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.characters[0]=2;
  824. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading = 500;
  825. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus = 4321;
  826. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter =123456789;
  827. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading_isUsed = 1;
  828. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus_isUsed =1;
  829. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter_isUsed =1;
  830. exiOut->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading_isUsed =0;
  831. exiOut->V2G_Message.Body.CurrentDemandRes.ReceiptRequired = 1;
  832. exiOut->V2G_Message.Body.CurrentDemandRes.ReceiptRequired_isUsed =1;
  833. return 0;
  834. }
  835. static int weldingDetection(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  836. printf("EVSE side: weldingDetection called\n" );
  837. printf("\tReceived data:\n");
  838. printf("\t\t EVStatus:\n");
  839. printf("\t\t\t EVReady=%d\n", exiIn->V2G_Message.Body.WeldingDetectionReq.DC_EVStatus.EVReady);
  840. printf("\t\t\t EVRESSSOC=%d\n", exiIn->V2G_Message.Body.WeldingDetectionReq.DC_EVStatus.EVRESSSOC);
  841. printf("\t\t\t EVErrorCode=%d\n", exiIn->V2G_Message.Body.WeldingDetectionReq.DC_EVStatus.EVErrorCode);
  842. /* Prepare data for EV */
  843. exiOut->V2G_Message_isUsed = 1u;
  844. init_v2gBodyType(&exiOut->V2G_Message.Body);
  845. exiOut->V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  846. exiOut->V2G_Message.Body.WeldingDetectionRes.ResponseCode = v2gresponseCodeType_OK;
  847. exiOut->V2G_Message.Body.WeldingDetectionRes.DC_EVSEStatus.EVSEIsolationStatus= v2gisolationLevelType_Valid;
  848. exiOut->V2G_Message.Body.WeldingDetectionRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1;
  849. exiOut->V2G_Message.Body.WeldingDetectionRes.DC_EVSEStatus.EVSEStatusCode = v2gDC_EVSEStatusCodeType_EVSE_Ready;
  850. exiOut->V2G_Message.Body.WeldingDetectionRes.DC_EVSEStatus.EVSENotification= v2gEVSENotificationType_None;
  851. exiOut->V2G_Message.Body.WeldingDetectionRes.DC_EVSEStatus.NotificationMaxDelay=123;
  852. exiOut->V2G_Message.Body.WeldingDetectionRes.EVSEPresentVoltage.Value = 1234;
  853. exiOut->V2G_Message.Body.WeldingDetectionRes.EVSEPresentVoltage.Unit = v2gunitSymbolType_V;
  854. exiOut->V2G_Message.Body.WeldingDetectionRes.EVSEPresentVoltage.Multiplier = 0;
  855. return 0;
  856. }
  857. static int create_response_message(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  858. int errn = ERROR_UNEXPECTED_REQUEST_MESSAGE;
  859. /* create response message as EXI document */
  860. if(exiIn->V2G_Message_isUsed) {
  861. init_v2gEXIDocument(exiOut);
  862. if (exiIn->V2G_Message.Body.SessionSetupReq_isUsed) {
  863. errn = sessionSetup(exiIn, exiOut);
  864. } else if (exiIn->V2G_Message.Body.ServiceDiscoveryReq_isUsed) {
  865. errn = serviceDiscovery(exiIn, exiOut);
  866. } else if (exiIn->V2G_Message.Body.ServiceDetailReq_isUsed) {
  867. errn = serviceDetail(exiIn, exiOut);
  868. } else if (exiIn->V2G_Message.Body.PaymentServiceSelectionReq_isUsed) {
  869. errn = paymentServiceSelection(exiIn, exiOut);
  870. } else if (exiIn->V2G_Message.Body.PaymentDetailsReq_isUsed) {
  871. errn = paymentDetails(exiIn, exiOut);
  872. } else if (exiIn->V2G_Message.Body.AuthorizationReq_isUsed) {
  873. errn = authorization(exiIn, exiOut);
  874. } else if (exiIn->V2G_Message.Body.ChargeParameterDiscoveryReq_isUsed) {
  875. errn = chargeParameterDiscovery(exiIn, exiOut);
  876. } else if (exiIn->V2G_Message.Body.PowerDeliveryReq_isUsed) {
  877. errn = powerDelivery(exiIn, exiOut);
  878. } else if (exiIn->V2G_Message.Body.ChargingStatusReq_isUsed) {
  879. errn = chargingStatus(exiIn, exiOut);
  880. } else if (exiIn->V2G_Message.Body.MeteringReceiptReq_isUsed) {
  881. errn = meteringReceipt(exiIn, exiOut);
  882. } else if (exiIn->V2G_Message.Body.SessionStopReq_isUsed) {
  883. errn = sessionStop(exiIn, exiOut);
  884. } else if (exiIn->V2G_Message.Body.CableCheckReq_isUsed) {
  885. errn = cableCheck(exiIn, exiOut);
  886. } else if (exiIn->V2G_Message.Body.PreChargeReq_isUsed) {
  887. errn = preCharge(exiIn, exiOut);
  888. } else if (exiIn->V2G_Message.Body.CurrentDemandReq_isUsed) {
  889. errn = currentDemand(exiIn, exiOut);
  890. } else if (exiIn->V2G_Message.Body.WeldingDetectionReq_isUsed) {
  891. errn = weldingDetection(exiIn, exiOut);
  892. }
  893. }
  894. return errn;
  895. }
  896. /* Adapt this to your system setup! */
  897. /* In this situation EV and EVSE is the same party */
  898. static int request_response(struct v2gEXIDocument* exiIn, struct v2gEXIDocument* exiOut) {
  899. int errn;
  900. bitstream_t stream1;
  901. bitstream_t stream2;
  902. uint16_t pos1;
  903. uint16_t pos2;
  904. stream1.size = BUFFER_SIZE;
  905. stream1.data = buffer1;
  906. stream1.pos = &pos1;
  907. stream2.size = BUFFER_SIZE;
  908. stream2.data = buffer2;
  909. stream2.pos = &pos2;
  910. /* EV side */
  911. errn = serializeEXI2Stream(exiIn, &stream1);
  912. /* --> Start of EVSE side */
  913. /* deserialize request message */
  914. if (errn == 0) {
  915. errn = deserializeStream2EXI(&stream1, exiOut);
  916. }
  917. /* create response message */
  918. if (errn == 0) {
  919. errn = create_response_message(exiOut, exiIn);
  920. }
  921. /* serialize response message */
  922. if (errn == 0) {
  923. errn = serializeEXI2Stream(exiIn, &stream2);
  924. }
  925. /* <-- End of EVSE side */
  926. /* EV side */
  927. /* deserialize response message */
  928. if (errn == 0) {
  929. errn = deserializeStream2EXI(&stream2, exiOut);
  930. }
  931. return errn;
  932. }
  933. static int ac_charging()
  934. {
  935. int errn = 0;
  936. int i, j;
  937. struct v2gEXIDocument exiIn;
  938. struct v2gEXIDocument exiOut;
  939. struct v2gServiceDiscoveryResType serviceDiscoveryRes;
  940. struct v2gServiceDetailResType serviceDetailRes;
  941. struct v2gPaymentServiceSelectionResType paymentServiceSelectionRes;
  942. struct v2gPaymentDetailsResType paymentDetailsRes;
  943. /* setup header information */
  944. init_v2gEXIDocument(&exiIn);
  945. exiIn.V2G_Message_isUsed = 1u;
  946. init_v2gMessageHeaderType(&exiIn.V2G_Message.Header);
  947. exiIn.V2G_Message.Header.SessionID.bytes[0] = 0; /* sessionID is always '0' at the beginning (the response contains the valid sessionID)*/
  948. exiIn.V2G_Message.Header.SessionID.bytes[1] = 0;
  949. exiIn.V2G_Message.Header.SessionID.bytes[2] = 0;
  950. exiIn.V2G_Message.Header.SessionID.bytes[3] = 0;
  951. exiIn.V2G_Message.Header.SessionID.bytes[4] = 0;
  952. exiIn.V2G_Message.Header.SessionID.bytes[5] = 0;
  953. exiIn.V2G_Message.Header.SessionID.bytes[6] = 0;
  954. exiIn.V2G_Message.Header.SessionID.bytes[7] = 0;
  955. exiIn.V2G_Message.Header.SessionID.bytesLen = 8; /* length of the byte session array is always 8*/
  956. exiIn.V2G_Message.Header.Notification_isUsed = 0u; /* no notification */
  957. exiIn.V2G_Message.Header.Signature_isUsed = 0u;
  958. /************************
  959. * sessionSetup *
  960. ************************/
  961. init_v2gBodyType(&exiIn.V2G_Message.Body);
  962. exiIn.V2G_Message.Body.SessionSetupReq_isUsed = 1u;
  963. init_v2gSessionSetupReqType(&exiIn.V2G_Message.Body.SessionSetupReq);
  964. exiIn.V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen = 1;
  965. exiIn.V2G_Message.Body.SessionSetupReq.EVCCID.bytes[0] = 10;
  966. printf("EV side: call EVSE sessionSetup");
  967. errn = request_response(&exiIn, &exiOut);
  968. if(errn == 0) {
  969. /* check, if this is the right response message */
  970. if(exiOut.V2G_Message.Body.SessionSetupRes_isUsed) {
  971. /* show results of EVSEs answer message */
  972. printf("EV side: received response message from EVSE\n");
  973. printf("\tHeader SessionID=");
  974. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  975. printf("\tResponseCode=%d\n", exiOut.V2G_Message.Body.SessionSetupRes.ResponseCode);
  976. printf("\tEVSEID=%d\n", exiOut.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]);
  977. printf("\tEVSETimeStamp=%li\n", (long int)exiOut.V2G_Message.Body.SessionSetupRes.EVSETimeStamp);
  978. } else {
  979. errn = ERROR_UNEXPECTED_SESSION_SETUP_RESP_MESSAGE;
  980. return errn;
  981. }
  982. }
  983. /*******************************************
  984. * serviceDiscovery *
  985. *******************************************/
  986. init_v2gBodyType(&exiIn.V2G_Message.Body);
  987. exiIn.V2G_Message.Body.ServiceDiscoveryReq_isUsed = 1u;
  988. init_v2gServiceDiscoveryReqType(&exiIn.V2G_Message.Body.ServiceDiscoveryReq);
  989. exiIn.V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory_isUsed = 1u;
  990. exiIn.V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory = v2gserviceCategoryType_Internet;
  991. exiIn.V2G_Message.Body.ServiceDiscoveryReq.ServiceScope_isUsed = 0u;
  992. printf("EV side: call EVSE serviceDiscovery");
  993. errn = request_response(&exiIn, &exiOut);
  994. if(errn == 0) {
  995. /* check, if this is the right response message */
  996. if(exiOut.V2G_Message.Body.ServiceDiscoveryRes_isUsed) {
  997. serviceDiscoveryRes = exiOut.V2G_Message.Body.ServiceDiscoveryRes;
  998. /* show results of EVSEs answer message */
  999. printf("EV side: received response message from EVSE\n");
  1000. printf("\tHeader SessionID=");
  1001. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1002. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode);
  1003. printf("\t ServiceID=%d\n", exiOut.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID);
  1004. printf("\t ServiceName=");
  1005. printASCIIString(serviceDiscoveryRes.ChargeService.ServiceName.characters, serviceDiscoveryRes.ChargeService.ServiceName.charactersLen);
  1006. if(serviceDiscoveryRes.PaymentOptionList.PaymentOption.array[1] == v2gpaymentOptionType_Contract) {
  1007. printf("\t PaymentOption=Contract_paymentOptionType\n");
  1008. }
  1009. if(serviceDiscoveryRes.ChargeService.FreeService==1) {
  1010. printf("\t ChargeService.FreeService=True\n");
  1011. }
  1012. if(serviceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] == v2gEnergyTransferModeType_DC_combo_core) {
  1013. printf("\t EnergyTransferMode=AC_single_DC_core\n");
  1014. }
  1015. if(serviceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[1] == v2gEnergyTransferModeType_AC_single_phase_core) {
  1016. printf("\t EnergyTransferMode=AC_single_phase_core_EnergyTransferModeType\n");
  1017. }
  1018. printf("\t Value added service list:\n");
  1019. for(i=0;i<serviceDiscoveryRes.ServiceList.Service.arrayLen;i++)
  1020. {
  1021. printf("\n\t\t ServiceID=%d\n", serviceDiscoveryRes.ServiceList.Service.array[i].ServiceID);
  1022. printf("\t\t ServiceName=");
  1023. printASCIIString(serviceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters, exiOut.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen );
  1024. if(serviceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory == v2gserviceCategoryType_Internet) {
  1025. printf("\t\t ServiceCategory=Internet\n");
  1026. }
  1027. if(serviceDiscoveryRes.ServiceList.Service.array[i].FreeService==1) {
  1028. printf("\t\t FreeService=True\n");
  1029. }
  1030. }
  1031. } else {
  1032. errn = ERROR_UNEXPECTED_SERVICE_DISCOVERY_RESP_MESSAGE;
  1033. return errn;
  1034. }
  1035. }
  1036. /*********************************
  1037. * ServiceDetails *
  1038. *********************************/
  1039. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1040. exiIn.V2G_Message.Body.ServiceDetailReq_isUsed = 1u;
  1041. init_v2gServiceDetailReqType(&exiIn.V2G_Message.Body.ServiceDetailReq);
  1042. exiIn.V2G_Message.Body.ServiceDetailReq.ServiceID = 22; /* Value Added Server ID */
  1043. printf("EV side: call EVSE ServiceDetail \n");
  1044. errn = request_response(&exiIn, &exiOut);
  1045. if(errn == 0) {
  1046. /* check, if this is the right response message */
  1047. if(exiOut.V2G_Message.Body.ServiceDetailRes_isUsed) {
  1048. serviceDetailRes = exiOut.V2G_Message.Body.ServiceDetailRes;
  1049. /* show results of EVSEs answer message */
  1050. printf("EV side: received response message from EVSE\n");
  1051. printf("\tHeader SessionID=");
  1052. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1053. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode);
  1054. printf("\t ServiceID=%d\n", exiOut.V2G_Message.Body.ServiceDetailRes.ServiceID);
  1055. if(serviceDetailRes.ServiceParameterList_isUsed) {
  1056. printf("\t\tLength=%d\n", serviceDetailRes.ServiceParameterList.ParameterSet.arrayLen );/*TEST*/
  1057. for(i=0; i<serviceDetailRes.ServiceParameterList.ParameterSet.arrayLen; i++)
  1058. {
  1059. printf("\t\tServiceSetID=%d\n", serviceDetailRes.ServiceParameterList.ParameterSet.array[i].ParameterSetID);
  1060. printf("\t\tParameters=%d\n", serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.arrayLen);
  1061. for(j=0; j<serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.arrayLen; j++)
  1062. {
  1063. printf("\t\t\t %d: ParameterName=", j+1);
  1064. printASCIIString(serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].Name.characters, exiOut.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].Name.charactersLen);
  1065. if(serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].shortValue_isUsed == 1u) {
  1066. printf("\t\t\t %d: StringValue=", j+1);
  1067. printASCIIString(serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].stringValue.characters, serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].stringValue.charactersLen);
  1068. } else if(serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].intValue_isUsed == 1u) {
  1069. printf("\t\t\t %d: IntValue=%d\n", j+1, serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].intValue);
  1070. } else if(serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].physicalValue_isUsed == 1u) {
  1071. printf("\t\t\t %d: PhysicalValue=%d (%d)\n", j+1, serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].physicalValue.Value, serviceDetailRes.ServiceParameterList.ParameterSet.array[i].Parameter.array[j].physicalValue.Multiplier);
  1072. }
  1073. }
  1074. }
  1075. }
  1076. } else {
  1077. errn = ERROR_UNEXPECTED_SERVICE_DETAILS_RESP_MESSAGE;
  1078. return errn;
  1079. }
  1080. }
  1081. /*******************************************
  1082. * ServicePaymentSelection *
  1083. *******************************************/
  1084. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1085. exiIn.V2G_Message.Body.PaymentServiceSelectionReq_isUsed = 1u;
  1086. init_v2gPaymentServiceSelectionReqType(&exiIn.V2G_Message.Body.PaymentServiceSelectionReq);
  1087. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedPaymentOption = v2gpaymentOptionType_ExternalPayment;
  1088. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.arrayLen = 2;
  1089. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[0].ServiceID = serviceDiscoveryRes.ChargeService.ServiceID; /* charge server ID */
  1090. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[0].ParameterSetID_isUsed = 0u; /* is not used */
  1091. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[1].ServiceID = serviceDiscoveryRes.ServiceList.Service.array[0].ServiceID;
  1092. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[1].ParameterSetID= serviceDetailRes.ServiceParameterList.ParameterSet.array[0].ParameterSetID;
  1093. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[1].ParameterSetID_isUsed = 1u;
  1094. printf("EV side: call EVSE ServicePaymentSelection \n");
  1095. errn = request_response(&exiIn, &exiOut);
  1096. if(errn == 0) {
  1097. /* check, if this is the right response message */
  1098. if(exiOut.V2G_Message.Body.PaymentServiceSelectionRes_isUsed) {
  1099. paymentServiceSelectionRes = exiOut.V2G_Message.Body.PaymentServiceSelectionRes;
  1100. /* show results of EVSEs answer message */
  1101. printf("EV side: received response message from EVSE\n");
  1102. printf("\tHeader SessionID=");
  1103. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1104. printf("\t ResponseCode=%d\n", paymentServiceSelectionRes.ResponseCode);
  1105. } else {
  1106. errn = ERROR_UNEXPECTED_PAYMENT_SERVICE_SELECTION_RESP_MESSAGE;
  1107. return errn;
  1108. }
  1109. }
  1110. /**********************************
  1111. * PaymentDetails *
  1112. **********************************/
  1113. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1114. exiIn.V2G_Message.Body.PaymentDetailsReq_isUsed = 1u;
  1115. init_v2gPaymentDetailsReqType(&exiIn.V2G_Message.Body.PaymentDetailsReq);
  1116. exiIn.V2G_Message.Body.PaymentDetailsReq.eMAID.characters[0] = 1;
  1117. exiIn.V2G_Message.Body.PaymentDetailsReq.eMAID.characters[1] = 123;
  1118. exiIn.V2G_Message.Body.PaymentDetailsReq.eMAID.charactersLen =2;
  1119. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Certificate.bytes[0] = 'C';
  1120. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Certificate.bytes[1] = 'e';
  1121. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Certificate.bytesLen = 2;
  1122. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates_isUsed = 1u;
  1123. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[0].bytes[0] = 'S';
  1124. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[0].bytes[1] = 'u';
  1125. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[0].bytesLen = 2;
  1126. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[1].bytes[0] = 'S';
  1127. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[1].bytes[1] = 'u';
  1128. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[1].bytes[2] = '2';
  1129. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.array[1].bytesLen = 3;
  1130. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.SubCertificates.Certificate.arrayLen =2;
  1131. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Id_isUsed = 1u;
  1132. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Id.charactersLen = 2;
  1133. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Id.characters[0] = 'I';
  1134. exiIn.V2G_Message.Body.PaymentDetailsReq.ContractSignatureCertChain.Id.characters[0] = 'd';
  1135. printf("EV side: call EVSE ServiceDetail \n");
  1136. errn = request_response(&exiIn, &exiOut);
  1137. if(errn == 0) {
  1138. /* check, if this is the right response message */
  1139. if(exiOut.V2G_Message.Body.PaymentDetailsRes_isUsed) {
  1140. paymentDetailsRes = exiOut.V2G_Message.Body.PaymentDetailsRes;
  1141. /* show results of EVSEs answer message */
  1142. printf("EV side: received response message from EVSE\n");
  1143. printf("\tHeader SessionID=");
  1144. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1145. printf("\t ResponseCode=%d\n", paymentDetailsRes.ResponseCode);
  1146. printf("\tEVSETimeStamp=%li\n", (long int) paymentDetailsRes.EVSETimeStamp);
  1147. printf("\tGenChallenge=%d\n", paymentDetailsRes.GenChallenge.bytes[0]);
  1148. } else {
  1149. errn = ERROR_UNEXPECTED_PAYMENT_DETAILS_RESP_MESSAGE;
  1150. return errn;
  1151. }
  1152. }
  1153. /*******************************************
  1154. * Authorization *
  1155. *******************************************/
  1156. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1157. exiIn.V2G_Message.Body.AuthorizationReq_isUsed = 1u;
  1158. init_v2gAuthorizationReqType(&exiIn.V2G_Message.Body.AuthorizationReq);
  1159. copyBytes(paymentDetailsRes.GenChallenge.bytes, paymentDetailsRes.GenChallenge.bytesLen, exiIn.V2G_Message.Body.AuthorizationReq.GenChallenge.bytes);
  1160. exiIn.V2G_Message.Body.AuthorizationReq.GenChallenge.bytesLen = paymentDetailsRes.GenChallenge.bytesLen;
  1161. exiIn.V2G_Message.Body.AuthorizationReq.GenChallenge_isUsed = 1u; /* no challenge needed here*/
  1162. exiIn.V2G_Message.Body.AuthorizationReq.Id_isUsed = 1u; /* no signature needed here */
  1163. exiIn.V2G_Message.Body.AuthorizationReq.Id.charactersLen = 3;
  1164. exiIn.V2G_Message.Body.AuthorizationReq.Id.characters[0] = 'I';
  1165. exiIn.V2G_Message.Body.AuthorizationReq.Id.characters[1] = 'd';
  1166. exiIn.V2G_Message.Body.AuthorizationReq.Id.characters[2] = '2';
  1167. printf("EV side: call EVSE Authorization \n");
  1168. errn = request_response(&exiIn, &exiOut);
  1169. if(errn == 0) {
  1170. /* check, if this is the right response message */
  1171. if(exiOut.V2G_Message.Body.AuthorizationRes_isUsed) {
  1172. /* show results of EVSEs answer message */
  1173. printf("EV side: received response message from EVSE\n");
  1174. printf("\tHeader SessionID=");
  1175. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1176. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.AuthorizationRes.ResponseCode);
  1177. if(exiOut.V2G_Message.Body.AuthorizationRes.EVSEProcessing == v2gEVSEProcessingType_Finished) {
  1178. printf("\t EVSEProcessing=Finished\n");
  1179. }
  1180. } else {
  1181. errn = ERROR_UNEXPECTED_AUTHORIZATION_RESP_MESSAGE;
  1182. return errn;
  1183. }
  1184. }
  1185. /*******************************************
  1186. * chargeParameterDiscovery *
  1187. *******************************************/
  1188. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1189. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq_isUsed = 1u;
  1190. init_v2gChargeParameterDiscoveryReqType(&exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq);
  1191. /* we use here AC based charging parameters */
  1192. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.RequestedEnergyTransferMode = v2gEnergyTransferModeType_AC_single_phase_core;
  1193. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.MaxEntriesSAScheduleTuple = 1234;
  1194. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter_isUsed = 1u;
  1195. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.DepartureTime = 12345;
  1196. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EAmount.Multiplier = 0;
  1197. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EAmount.Unit = v2gunitSymbolType_W;
  1198. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EAmount.Value = 100;
  1199. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxCurrent.Multiplier = 0;
  1200. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxCurrent.Unit = v2gunitSymbolType_A;
  1201. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxCurrent.Value = 200;
  1202. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxVoltage.Multiplier = 0;
  1203. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxVoltage.Unit = v2gunitSymbolType_V;
  1204. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMaxVoltage.Value = 400;
  1205. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMinCurrent.Multiplier = 0;
  1206. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMinCurrent.Unit = v2gunitSymbolType_A;
  1207. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.AC_EVChargeParameter.EVMinCurrent.Value = 500;
  1208. printf("EV side: call EVSE chargeParameterDiscovery");
  1209. errn = request_response(&exiIn, &exiOut);
  1210. if(errn == 0) {
  1211. /* check, if this is the right response message */
  1212. if(exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed) {
  1213. /* show results of EVSEs answer message */
  1214. printf("EV side: received response message from EVSE\n");
  1215. printf("\tHeader SessionID=");
  1216. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1217. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.ResponseCode);
  1218. printACEVSEStatus(&(exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.AC_EVSEStatus));
  1219. printf("\t EVSEProcessing=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.EVSEProcessing);
  1220. printf("\t EVSEMaxCurrent=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSEMaxCurrent.Value);
  1221. printf("\t EVSENominalVoltage=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.EVSENominalVoltage.Value);
  1222. } else {
  1223. errn = ERROR_UNEXPECTED_CHARGE_PARAMETER_DISCOVERY_RESP_MESSAGE;
  1224. return errn;
  1225. }
  1226. }
  1227. /*********************************
  1228. * PowerDelivery *
  1229. *********************************/
  1230. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1231. exiIn.V2G_Message.Body.PowerDeliveryReq_isUsed = 1u;
  1232. init_v2gPowerDeliveryReqType(&exiIn.V2G_Message.Body.PowerDeliveryReq);
  1233. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile_isUsed = 0;
  1234. exiIn.V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter_isUsed = 0; /* only used for DC charging */
  1235. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargeProgress = v2gchargeProgressType_Start;
  1236. exiIn.V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID = exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SAScheduleTupleID;
  1237. printf("EV side: call EVSE powerDelivery \n");
  1238. errn = request_response(&exiIn, &exiOut);
  1239. if(errn == 0) {
  1240. /* check, if this is the right response message */
  1241. if(exiOut.V2G_Message.Body.PowerDeliveryRes_isUsed) {
  1242. /* show results of EVSEs answer message */
  1243. printf("EV side: received response message from EVSE\n");
  1244. printf("\tHeader SessionID=");
  1245. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1246. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.PowerDeliveryRes.ResponseCode);
  1247. printACEVSEStatus(&(exiOut.V2G_Message.Body.PowerDeliveryRes.AC_EVSEStatus));
  1248. } else {
  1249. errn = ERROR_UNEXPECTED_POWER_DELIVERY_RESP_MESSAGE;
  1250. return errn;
  1251. }
  1252. }
  1253. /*********************************
  1254. * Setup data for chargingStatus *
  1255. *********************************/
  1256. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1257. exiIn.V2G_Message.Body.ChargingStatusReq_isUsed = 1u;
  1258. init_v2gChargingStatusReqType(&exiIn.V2G_Message.Body.ChargingStatusReq);
  1259. printf("EV side: call EVSE chargingStatus \n");
  1260. errn = request_response(&exiIn, &exiOut);
  1261. if(errn == 0) {
  1262. /* check, if this is the right response message */
  1263. if(exiOut.V2G_Message.Body.ChargingStatusRes_isUsed) {
  1264. /* show results of EVSEs answer message */
  1265. printf("EV side: received response message from EVSE\n");
  1266. printf("\tHeader SessionID=");
  1267. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1268. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.ResponseCode);
  1269. printACEVSEStatus(&(exiOut.V2G_Message.Body.ChargingStatusRes.AC_EVSEStatus));
  1270. printf("\tReceiptRequired=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.ReceiptRequired);
  1271. printf("\tEVSEID=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.EVSEID.characters[0]);
  1272. printf("\tSAScheduleTupleID=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.SAScheduleTupleID);
  1273. printf("\tEVSEMaxCurrent=%d (%d %d)\n", exiOut.V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent.Value, exiOut.V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent.Unit, exiOut.V2G_Message.Body.ChargingStatusRes.EVSEMaxCurrent.Multiplier);
  1274. printf("\tisused.MeterInfo=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.MeterInfo_isUsed);
  1275. printf("\t\tMeterInfo.MeterID=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterID.characters[0]);
  1276. printf("\t\tMeterInfo.MeterReading.Value=%li\n", (long int)exiOut.V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterReading);
  1277. printf("\t\tMeterInfo.MeterStatus=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.MeterInfo.MeterStatus);
  1278. printf("\t\tMeterInfo.TMeter=%li\n", (long int)exiOut.V2G_Message.Body.ChargingStatusRes.MeterInfo.TMeter);
  1279. printf("\t\tMeterInfo.SigMeterReading.data=%d\n", exiOut.V2G_Message.Body.ChargingStatusRes.MeterInfo.SigMeterReading.bytes[0]);
  1280. } else {
  1281. errn = ERROR_UNEXPECTED_CHARGING_STATUS_RESP_MESSAGE;
  1282. return errn;
  1283. }
  1284. }
  1285. /***********************************
  1286. * MeteringReceipt *
  1287. ***********************************/
  1288. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1289. exiIn.V2G_Message.Body.MeteringReceiptReq_isUsed = 1u;
  1290. init_v2gMeteringReceiptReqType(&exiIn.V2G_Message.Body.MeteringReceiptReq);
  1291. exiIn.V2G_Message.Body.MeteringReceiptReq.SessionID.bytes[0] = 22;
  1292. exiIn.V2G_Message.Body.MeteringReceiptReq.SAScheduleTupleID = 12;
  1293. exiIn.V2G_Message.Body.MeteringReceiptReq.SAScheduleTupleID_isUsed =1;
  1294. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterStatus = 2;
  1295. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterStatus_isUsed = 1;
  1296. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterID.charactersLen =1;
  1297. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterID.characters[0]=3;
  1298. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterReading = 100;
  1299. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.MeterReading_isUsed = 1;
  1300. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.SigMeterReading_isUsed = 0;
  1301. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.TMeter =123456789;
  1302. exiIn.V2G_Message.Body.MeteringReceiptReq.MeterInfo.TMeter_isUsed = 1;
  1303. exiIn.V2G_Message.Body.MeteringReceiptReq.Id.characters[0]='I';
  1304. exiIn.V2G_Message.Body.MeteringReceiptReq.Id.characters[1]='d';
  1305. exiIn.V2G_Message.Body.MeteringReceiptReq.Id.characters[2]='3';
  1306. exiIn.V2G_Message.Body.MeteringReceiptReq.Id.charactersLen =3;
  1307. exiIn.V2G_Message.Body.MeteringReceiptReq.Id_isUsed =1; /* message is signed */
  1308. printf("EV side: call EVSE meteringReceipt \n");
  1309. errn = request_response(&exiIn, &exiOut);
  1310. if(errn == 0) {
  1311. /* check, if this is the right response message */
  1312. if(exiOut.V2G_Message.Body.MeteringReceiptRes_isUsed) {
  1313. /* show results of EVSEs answer message */
  1314. printf("EV side: received response message from EVSE\n");
  1315. printf("\tHeader SessionID=");
  1316. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1317. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.MeteringReceiptRes.ResponseCode);
  1318. } else {
  1319. errn = ERROR_UNEXPECTED_METERING_RECEIPT_RESP_MESSAGE;
  1320. return errn;
  1321. }
  1322. }
  1323. /***********************************
  1324. * SessionStop *
  1325. ***********************************/
  1326. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1327. exiIn.V2G_Message.Body.SessionStopReq_isUsed = 1u;
  1328. init_v2gSessionStopReqType(&exiIn.V2G_Message.Body.SessionStopReq);
  1329. exiIn.V2G_Message.Body.SessionStopReq.ChargingSession = 1;
  1330. printf("EV side: call EVSE stopSession \n");
  1331. errn = request_response(&exiIn, &exiOut);
  1332. if(errn == 0) {
  1333. /* check, if this is the right response message */
  1334. if(exiOut.V2G_Message.Body.SessionStopRes_isUsed) {
  1335. /* show results of EVSEs answer message */
  1336. printf("EV side: received response message from EVSE\n");
  1337. printf("\tHeader SessionID=");
  1338. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1339. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.SessionStopRes.ResponseCode);
  1340. } else {
  1341. errn = ERROR_UNEXPECTED_SESSION_STOP_RESP_MESSAGE;
  1342. return errn;
  1343. }
  1344. }
  1345. return errn;
  1346. }
  1347. static int dc_charging() {
  1348. int errn = 0;
  1349. int i, j;
  1350. struct v2gEXIDocument exiIn;
  1351. struct v2gEXIDocument exiOut;
  1352. struct v2gServiceDiscoveryResType serviceDiscoveryRes;
  1353. struct v2gChargeParameterDiscoveryResType chargeParameterDiscoveryRes;
  1354. /* struct v2gServiceDetailResType serviceDetailRes;
  1355. struct v2gPaymentServiceSelectionResType paymentServiceSelectionRes;
  1356. struct v2gPaymentDetailsResType paymentDetailsRes; */
  1357. /* setup header information */
  1358. init_v2gEXIDocument(&exiIn);
  1359. exiIn.V2G_Message_isUsed = 1u;
  1360. init_v2gMessageHeaderType(&exiIn.V2G_Message.Header);
  1361. exiIn.V2G_Message.Header.SessionID.bytes[0] = 0; /* sessionID is always '0' at the beginning (the response contains the valid sessionID)*/
  1362. exiIn.V2G_Message.Header.SessionID.bytes[1] = 0;
  1363. exiIn.V2G_Message.Header.SessionID.bytes[2] = 0;
  1364. exiIn.V2G_Message.Header.SessionID.bytes[3] = 0;
  1365. exiIn.V2G_Message.Header.SessionID.bytes[4] = 0;
  1366. exiIn.V2G_Message.Header.SessionID.bytes[5] = 0;
  1367. exiIn.V2G_Message.Header.SessionID.bytes[6] = 0;
  1368. exiIn.V2G_Message.Header.SessionID.bytes[7] = 0;
  1369. exiIn.V2G_Message.Header.SessionID.bytesLen = 8; /* length of the byte session array is always 8 */
  1370. exiIn.V2G_Message.Header.Notification_isUsed = 0u; /* no notification */
  1371. exiIn.V2G_Message.Header.Signature_isUsed = 0u;
  1372. /************************
  1373. * sessionSetup *
  1374. ************************/
  1375. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1376. exiIn.V2G_Message.Body.SessionSetupReq_isUsed = 1u;
  1377. init_v2gSessionSetupReqType(&exiIn.V2G_Message.Body.SessionSetupReq);
  1378. exiIn.V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen = 1;
  1379. exiIn.V2G_Message.Body.SessionSetupReq.EVCCID.bytes[0] = 20;
  1380. printf("EV side: call EVSE sessionSetup");
  1381. errn = request_response(&exiIn, &exiOut);
  1382. if(errn == 0) {
  1383. /* check, if this is the right response message */
  1384. if(exiOut.V2G_Message.Body.SessionSetupRes_isUsed) {
  1385. /* show results of EVSEs answer message */
  1386. printf("EV side: received response message from EVSE\n");
  1387. printf("\tHeader SessionID=");
  1388. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1389. printf("\tResponseCode=%d\n", exiOut.V2G_Message.Body.SessionSetupRes.ResponseCode);
  1390. printf("\tEVSEID=%d\n", exiOut.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]);
  1391. printf("\tEVSETimeStamp=%li\n", (long int)exiOut.V2G_Message.Body.SessionSetupRes.EVSETimeStamp);
  1392. } else {
  1393. errn = ERROR_UNEXPECTED_SESSION_SETUP_RESP_MESSAGE;
  1394. return errn;
  1395. }
  1396. }
  1397. /*******************************************
  1398. * serviceDiscovery *
  1399. *******************************************/
  1400. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1401. exiIn.V2G_Message.Body.ServiceDiscoveryReq_isUsed = 1u;
  1402. init_v2gServiceDiscoveryReqType(&exiIn.V2G_Message.Body.ServiceDiscoveryReq);
  1403. exiIn.V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory_isUsed = 1u;
  1404. exiIn.V2G_Message.Body.ServiceDiscoveryReq.ServiceCategory = v2gserviceCategoryType_EVCharging;
  1405. printf("EV side: call EVSE serviceDiscovery");
  1406. errn = request_response(&exiIn, &exiOut);
  1407. if(errn == 0) {
  1408. /* check, if this is the right response message */
  1409. if(exiOut.V2G_Message.Body.ServiceDiscoveryRes_isUsed) {
  1410. serviceDiscoveryRes = exiOut.V2G_Message.Body.ServiceDiscoveryRes;
  1411. /* show results of EVSEs answer message */
  1412. printf("EV side: received response message from EVSE\n");
  1413. printf("\tHeader SessionID=");
  1414. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1415. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode);
  1416. printf("\t ServiceID=%d\n", exiOut.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID);
  1417. printf("\t ServiceName=");
  1418. printASCIIString(serviceDiscoveryRes.ChargeService.ServiceName.characters, serviceDiscoveryRes.ChargeService.ServiceName.charactersLen);
  1419. printf("\t PaymentOption=%d\n", serviceDiscoveryRes.PaymentOptionList.PaymentOption.array[1]);
  1420. printf("\t EnergyTransferType=%d\n", serviceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[1]);
  1421. printf("\t FreeService=%d\n", serviceDiscoveryRes.ChargeService.FreeService);
  1422. printf("\t ServiceCategory=%d\n", serviceDiscoveryRes.ChargeService.ServiceCategory);
  1423. printf("\t ServiceScope=%d\n", serviceDiscoveryRes.ChargeService.ServiceScope.characters[0]);
  1424. } else {
  1425. errn = ERROR_UNEXPECTED_SERVICE_DISCOVERY_RESP_MESSAGE;
  1426. return errn;
  1427. }
  1428. }
  1429. /*******************************************
  1430. * ServicePaymentSelection *
  1431. *******************************************/
  1432. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1433. exiIn.V2G_Message.Body.PaymentServiceSelectionReq_isUsed = 1u;
  1434. init_v2gPaymentServiceSelectionReqType(&exiIn.V2G_Message.Body.PaymentServiceSelectionReq);
  1435. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedPaymentOption = v2gpaymentOptionType_ExternalPayment;
  1436. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.arrayLen = 1; /* only one service was selected */
  1437. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[0].ServiceID = serviceDiscoveryRes.ChargeService.ServiceID; /* charge server ID */
  1438. exiIn.V2G_Message.Body.PaymentServiceSelectionReq.SelectedServiceList.SelectedService.array[0].ParameterSetID_isUsed = 0u; /* is not used */
  1439. printf("EV side: call EVSE ServicePaymentSelection \n");
  1440. errn = request_response(&exiIn, &exiOut);
  1441. if(errn == 0) {
  1442. /* check, if this is the right response message */
  1443. if(exiOut.V2G_Message.Body.PaymentServiceSelectionRes_isUsed) {
  1444. /* show results of EVSEs answer message */
  1445. printf("EV side: received response message from EVSE\n");
  1446. printf("\tHeader SessionID=");
  1447. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1448. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode);
  1449. } else {
  1450. errn = ERROR_UNEXPECTED_PAYMENT_SERVICE_SELECTION_RESP_MESSAGE;
  1451. return errn;
  1452. }
  1453. }
  1454. /*******************************************
  1455. * Authorization *
  1456. *******************************************/
  1457. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1458. exiIn.V2G_Message.Body.AuthorizationReq_isUsed = 1u;
  1459. init_v2gAuthorizationReqType(&exiIn.V2G_Message.Body.AuthorizationReq);
  1460. exiIn.V2G_Message.Body.AuthorizationReq.GenChallenge_isUsed =0; /* no challenge needed here*/
  1461. exiIn.V2G_Message.Body.AuthorizationReq.Id_isUsed =0 ; /* no signature needed here */
  1462. printf("EV side: call EVSE Authorization \n");
  1463. errn = request_response(&exiIn, &exiOut);
  1464. if(errn == 0) {
  1465. /* check, if this is the right response message */
  1466. if(exiOut.V2G_Message.Body.AuthorizationRes_isUsed) {
  1467. /* show results of EVSEs answer message */
  1468. printf("EV side: received response message from EVSE\n");
  1469. printf("\tHeader SessionID=");
  1470. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1471. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.AuthorizationRes.ResponseCode);
  1472. if(exiOut.V2G_Message.Body.AuthorizationRes.EVSEProcessing == v2gEVSEProcessingType_Finished) {
  1473. printf("\t EVSEProcessing=Finished\n");
  1474. }
  1475. } else {
  1476. errn = ERROR_UNEXPECTED_AUTHORIZATION_RESP_MESSAGE;
  1477. return errn;
  1478. }
  1479. }
  1480. /*******************************************
  1481. * chargeParameterDiscovery *
  1482. *******************************************/
  1483. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1484. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq_isUsed = 1u;
  1485. init_v2gChargeParameterDiscoveryReqType(&exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq);
  1486. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter_isUsed = 1u;
  1487. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DC_EVStatus.EVRESSSOC = 89;
  1488. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DC_EVStatus.EVReady = 1;
  1489. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DC_EVStatus.EVErrorCode = v2gDC_EVErrorCodeType_NO_ERROR;
  1490. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DepartureTime_isUsed = 1u;
  1491. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.DepartureTime = 123456789;
  1492. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumCurrentLimit.Multiplier = 0;
  1493. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumCurrentLimit.Unit = v2gunitSymbolType_A;
  1494. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumCurrentLimit.Value = 60;
  1495. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumPowerLimit_isUsed = 1u;
  1496. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumPowerLimit.Multiplier = 0;
  1497. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumPowerLimit.Unit = v2gunitSymbolType_W;
  1498. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumPowerLimit.Value = 20000;
  1499. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumVoltageLimit.Multiplier = 0;
  1500. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumVoltageLimit.Unit = v2gunitSymbolType_V;
  1501. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVMaximumVoltageLimit.Value = 420;
  1502. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyCapacity_isUsed = 1u;
  1503. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyCapacity.Multiplier = 0;
  1504. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyCapacity.Unit = v2gunitSymbolType_W;
  1505. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyCapacity.Value = 15000;
  1506. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyRequest_isUsed = 1u;
  1507. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyRequest.Multiplier = 0;
  1508. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyRequest.Unit = v2gunitSymbolType_W;
  1509. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.EVEnergyRequest.Value = 5000;
  1510. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.FullSOC_isUsed = 1u;
  1511. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.FullSOC = 99;
  1512. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.BulkSOC_isUsed = 1u;
  1513. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter.BulkSOC = 80;
  1514. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.RequestedEnergyTransferMode = v2gEnergyTransferModeType_DC_core;
  1515. exiIn.V2G_Message.Body.ChargeParameterDiscoveryReq.DC_EVChargeParameter_isUsed = 1u;
  1516. printf("EV side: call EVSE chargeParameterDiscovery");
  1517. errn = request_response(&exiIn, &exiOut);
  1518. if(errn == 0) {
  1519. /* check, if this is the right response message */
  1520. if(exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed) {
  1521. chargeParameterDiscoveryRes = exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes;
  1522. /* show results of EVSEs answer message */
  1523. printf("EV side: received response message from EVSE\n");
  1524. printf("\tHeader SessionID=");
  1525. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1526. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.ResponseCode);
  1527. printACEVSEStatus(&(exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.AC_EVSEChargeParameter.AC_EVSEStatus));
  1528. printf("\tEVSEMaximumCurrentLimit=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumCurrentLimit.Value);
  1529. printf("\tEVSEMaximumPowerLimit=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumPowerLimit.Value);
  1530. printf("\tEVSEMaximumVoltageLimit=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMaximumVoltageLimit.Value);
  1531. printf("\tEVSEMinimumCurrentLimit=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumCurrentLimit.Value);
  1532. printf("\tEVSEMinimumVoltageLimit=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEMinimumVoltageLimit.Value);
  1533. printf("\tEVSECurrentRegulationTolerance=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSECurrentRegulationTolerance.Value);
  1534. printf("\tEVSEPeakCurrentRipple=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEPeakCurrentRipple.Value);
  1535. printf("\tEVSEEnergyToBeDelivered=%d\n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.DC_EVSEChargeParameter.EVSEEnergyToBeDelivered.Value);
  1536. printf("\tSAScheduleList: \n");
  1537. for(i=0; i< exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.arrayLen;i++)
  1538. {
  1539. printf("\t\t Tuple#%d: \n",(i+1));
  1540. printf("\t\t SAScheduleTupleID=%d: \n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].SAScheduleTupleID);
  1541. for(j=0; j< exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.arrayLen;j++)
  1542. {
  1543. printf("\t\t\t Entry#%d: \n",(j+1));
  1544. printf("\t\t\t\t PMax=%d (%d %d) \n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.array[j].PMax.Value, exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.array[j].PMax.Unit, exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.array[j].PMax.Multiplier);
  1545. printf("\t\t\t\t Start=%d \n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.array[j].RelativeTimeInterval.start);
  1546. if(exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.array[j].RelativeTimeInterval.duration_isUsed) {
  1547. printf("\t\t\t\t Duration=%d \n", exiOut.V2G_Message.Body.ChargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[i].PMaxSchedule.PMaxScheduleEntry.array[j].RelativeTimeInterval.duration);
  1548. }
  1549. }
  1550. }
  1551. } else {
  1552. errn = ERROR_UNEXPECTED_CHARGE_PARAMETER_DISCOVERY_RESP_MESSAGE;
  1553. return errn;
  1554. }
  1555. }
  1556. /*****************************
  1557. * cableCheck *
  1558. *****************************/
  1559. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1560. exiIn.V2G_Message.Body.CableCheckReq_isUsed = 1u;
  1561. init_v2gCableCheckReqType(&exiIn.V2G_Message.Body.CableCheckReq);
  1562. exiIn.V2G_Message.Body.CableCheckReq.DC_EVStatus.EVErrorCode = 1;
  1563. exiIn.V2G_Message.Body.CableCheckReq.DC_EVStatus.EVReady = 1;
  1564. exiIn.V2G_Message.Body.CableCheckReq.DC_EVStatus.EVRESSSOC = 12;
  1565. printf("EV side: call EVSE cableCheck \n");
  1566. errn = request_response(&exiIn, &exiOut);
  1567. if(errn == 0) {
  1568. /* check, if this is the right response message */
  1569. if(exiOut.V2G_Message.Body.CableCheckRes_isUsed) {
  1570. /* show results of EVSEs answer message */
  1571. printf("EV side: received response message from EVSE\n");
  1572. printf("\tHeader SessionID=");
  1573. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1574. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.CableCheckRes.ResponseCode);
  1575. if(exiOut.V2G_Message.Body.CableCheckRes.EVSEProcessing==v2gEVSEProcessingType_Finished) {
  1576. printf("\tEVSEProcessing=Finished\n");
  1577. }
  1578. printDCEVSEStatus(&(exiOut.V2G_Message.Body.CableCheckRes.DC_EVSEStatus));
  1579. } else {
  1580. errn = ERROR_UNEXPECTED_CABLE_CHECK_RESP_MESSAGE;
  1581. return errn;
  1582. }
  1583. }
  1584. /*****************************
  1585. * preCharge *
  1586. *****************************/
  1587. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1588. exiIn.V2G_Message.Body.PreChargeReq_isUsed = 1u;
  1589. init_v2gPreChargeReqType(&exiIn.V2G_Message.Body.PreChargeReq);
  1590. exiIn.V2G_Message.Body.PreChargeReq.DC_EVStatus.EVErrorCode = 1;
  1591. exiIn.V2G_Message.Body.PreChargeReq.DC_EVStatus.EVReady = 1;
  1592. exiIn.V2G_Message.Body.PreChargeReq.DC_EVStatus.EVRESSSOC = 12;
  1593. exiIn.V2G_Message.Body.PreChargeReq.EVTargetCurrent.Multiplier = 0;
  1594. exiIn.V2G_Message.Body.PreChargeReq.EVTargetCurrent.Unit = v2gunitSymbolType_A;
  1595. exiIn.V2G_Message.Body.PreChargeReq.EVTargetCurrent.Value = 100;
  1596. exiIn.V2G_Message.Body.PreChargeReq.EVTargetVoltage.Multiplier = 0;
  1597. exiIn.V2G_Message.Body.PreChargeReq.EVTargetVoltage.Unit = v2gunitSymbolType_V;
  1598. exiIn.V2G_Message.Body.PreChargeReq.EVTargetVoltage.Value = 200;
  1599. printf("EV side: call EVSE preCharge \n");
  1600. errn = request_response(&exiIn, &exiOut);
  1601. if(errn == 0) {
  1602. /* check, if this is the right response message */
  1603. if(exiOut.V2G_Message.Body.PreChargeRes_isUsed) {
  1604. /* show results of EVSEs answer message */
  1605. printf("EV side: received response message from EVSE\n");
  1606. printf("\tHeader SessionID=");
  1607. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1608. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.PreChargeRes.ResponseCode);
  1609. printDCEVSEStatus(&exiOut.V2G_Message.Body.PreChargeRes.DC_EVSEStatus);
  1610. printf("\tEVSEPresentVoltage=%d (%d %d)\n", exiOut.V2G_Message.Body.PreChargeRes.EVSEPresentVoltage.Value, exiOut.V2G_Message.Body.PreChargeRes.EVSEPresentVoltage.Unit, exiOut.V2G_Message.Body.PreChargeRes.EVSEPresentVoltage.Multiplier);
  1611. } else {
  1612. errn = ERROR_UNEXPECTED_PRE_CHARGE_RESP_MESSAGE;
  1613. return errn;
  1614. }
  1615. }
  1616. /*****************************
  1617. * powerDelivery *
  1618. *****************************/
  1619. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1620. exiIn.V2G_Message.Body.PowerDeliveryReq_isUsed = 1u;
  1621. init_v2gPowerDeliveryReqType(&exiIn.V2G_Message.Body.PowerDeliveryReq);
  1622. exiIn.V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.DC_EVStatus = exiIn.V2G_Message.Body.PreChargeReq.DC_EVStatus;
  1623. exiIn.V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.BulkChargingComplete = 0;
  1624. exiIn.V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.BulkChargingComplete_isUsed = 1u;
  1625. exiIn.V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter.ChargingComplete = 1;
  1626. exiIn.V2G_Message.Body.PowerDeliveryReq.DC_EVPowerDeliveryParameter_isUsed = 1u; /* DC parameters are send */
  1627. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargeProgress = v2gchargeProgressType_Start;
  1628. /* we are using a charging profile */
  1629. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile_isUsed = 1u;
  1630. exiIn.V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID = chargeParameterDiscoveryRes.SAScheduleList.SAScheduleTuple.array[0].SAScheduleTupleID;
  1631. /* set up 3 entries */
  1632. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.arrayLen=3;
  1633. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[0].ChargingProfileEntryMaxPower.Value=0;
  1634. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[0].ChargingProfileEntryMaxPower.Unit = v2gunitSymbolType_W;
  1635. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[0].ChargingProfileEntryMaxPower.Multiplier=2;
  1636. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[0].ChargingProfileEntryStart=0;
  1637. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[0].ChargingProfileEntryMaxNumberOfPhasesInUse=1;
  1638. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[0].ChargingProfileEntryMaxNumberOfPhasesInUse_isUsed=1;
  1639. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[1].ChargingProfileEntryMaxPower.Value=20000;
  1640. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[1].ChargingProfileEntryMaxPower.Unit = v2gunitSymbolType_W;
  1641. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[1].ChargingProfileEntryMaxPower.Multiplier = 1;
  1642. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[1].ChargingProfileEntryMaxNumberOfPhasesInUse=3;
  1643. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[1].ChargingProfileEntryMaxNumberOfPhasesInUse_isUsed=1;
  1644. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[1].ChargingProfileEntryStart=300; /* 5min */
  1645. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[2].ChargingProfileEntryMaxPower.Value=0;
  1646. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[2].ChargingProfileEntryStart=1200; /* 20min */
  1647. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[2].ChargingProfileEntryMaxNumberOfPhasesInUse=3;
  1648. exiIn.V2G_Message.Body.PowerDeliveryReq.ChargingProfile.ProfileEntry.array[2].ChargingProfileEntryMaxNumberOfPhasesInUse_isUsed=1;
  1649. printf("EV side: call EVSE powerDelivery \n");
  1650. errn = request_response(&exiIn, &exiOut);
  1651. if(errn == 0) {
  1652. /* check, if this is the right response message */
  1653. if(exiOut.V2G_Message.Body.PowerDeliveryRes_isUsed) {
  1654. /* show results of EVSEs answer message */
  1655. printf("EV side: received response message from EVSE\n");
  1656. printf("\tHeader SessionID=");
  1657. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1658. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.PowerDeliveryRes.ResponseCode);
  1659. printDCEVSEStatus(&exiOut.V2G_Message.Body.PowerDeliveryRes.DC_EVSEStatus);
  1660. } else {
  1661. errn = ERROR_UNEXPECTED_PRE_CHARGE_RESP_MESSAGE;
  1662. return errn;
  1663. }
  1664. }
  1665. /*****************************
  1666. * currentDemand *
  1667. *****************************/
  1668. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1669. exiIn.V2G_Message.Body.CurrentDemandReq_isUsed = 1u;
  1670. init_v2gCurrentDemandReqType(&exiIn.V2G_Message.Body.CurrentDemandReq);
  1671. exiIn.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC = 12;
  1672. exiIn.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady = 1;
  1673. exiIn.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode = 1;
  1674. exiIn.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier = 0;
  1675. exiIn.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit = v2gunitSymbolType_A;
  1676. exiIn.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value = 100;
  1677. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Multiplier = 0;
  1678. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Unit = v2gunitSymbolType_V;
  1679. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Value = 420;
  1680. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit_isUsed = 1u;
  1681. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Multiplier = 0;
  1682. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Unit = v2gunitSymbolType_W;
  1683. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Value = 20000;
  1684. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit_isUsed = 1u;
  1685. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Multiplier = 0;
  1686. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Unit = v2gunitSymbolType_A;
  1687. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Value = 60;
  1688. exiIn.V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit_isUsed = 1u;
  1689. exiIn.V2G_Message.Body.CurrentDemandReq.BulkChargingComplete_isUsed = 1u;
  1690. exiIn.V2G_Message.Body.CurrentDemandReq.BulkChargingComplete = 0;
  1691. exiIn.V2G_Message.Body.CurrentDemandReq.ChargingComplete = 1;
  1692. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Multiplier = 0;
  1693. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Unit = v2gunitSymbolType_s;
  1694. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Value = 300; /* 5 min*/
  1695. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC_isUsed = 1u;
  1696. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Multiplier = 0;
  1697. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Unit = v2gunitSymbolType_s;
  1698. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Value = 120; /* 3 min */
  1699. exiIn.V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC_isUsed = 1u;
  1700. exiIn.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier = 0;
  1701. exiIn.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit = v2gunitSymbolType_V;
  1702. exiIn.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value = 400;
  1703. printf("EV side: call EVSE currentDemand \n");
  1704. errn = request_response(&exiIn, &exiOut);
  1705. if(errn == 0) {
  1706. /* check, if this is the right response message */
  1707. if(exiOut.V2G_Message.Body.CurrentDemandRes_isUsed) {
  1708. /* show results of EVSEs answer message */
  1709. printf("EV side: received response message from EVSE\n");
  1710. printf("\tHeader SessionID=");
  1711. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1712. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.ResponseCode);
  1713. printDCEVSEStatus(&exiOut.V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus);
  1714. printf("\t EVSEPresentVoltage=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Value);
  1715. printf("\t EVSEPresentCurrent=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Value);
  1716. printf("\t EVSECurrentLimitAchieved=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSECurrentLimitAchieved);
  1717. printf("\t EVSEVoltageLimitAchieved=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEVoltageLimitAchieved);
  1718. printf("\t EVSEPowerLimitAchieved=%d\n" ,exiOut.V2G_Message.Body.CurrentDemandRes.EVSEPowerLimitAchieved);
  1719. printf("\t EVSEMaximumVoltageLimit=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Value);
  1720. printf("\t EVSEMaximumCurrentLimit=%d (%d %d) \n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Value, exiOut.V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Unit, exiOut.V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Multiplier);
  1721. printf("\t EVSEMaximumPowerLimit=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Value);
  1722. printf("\tReceiptRequired=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.ReceiptRequired);
  1723. printf("\tEVSEID=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.EVSEID.characters[0]);
  1724. printf("\tisused.MeterInfo=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.MeterInfo_isUsed);
  1725. printf("\t\tMeterInfo.MeterID=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.characters[0]);
  1726. printf("\t\tMeterInfo.MeterReading.Value=%lu\n", (long unsigned int)exiOut.V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading);
  1727. printf("\t\tMeterInfo.MeterStatus=%d\n", exiOut.V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus);
  1728. printf("\t\tMeterInfo.TMeter=%li\n", (long int)exiOut.V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter);
  1729. } else {
  1730. errn = ERROR_UNEXPECTED_CURRENT_DEMAND_RESP_MESSAGE;
  1731. return errn;
  1732. }
  1733. }
  1734. /*****************************
  1735. * weldingDetection *
  1736. *****************************/
  1737. init_v2gBodyType(&exiIn.V2G_Message.Body);
  1738. exiIn.V2G_Message.Body.WeldingDetectionReq_isUsed = 1u;
  1739. init_v2gWeldingDetectionReqType(&exiIn.V2G_Message.Body.WeldingDetectionReq);
  1740. exiIn.V2G_Message.Body.WeldingDetectionReq.DC_EVStatus.EVRESSSOC = 100;
  1741. printf("EV side: call EVSE weldingDetection \n");
  1742. errn = request_response(&exiIn, &exiOut);
  1743. if(errn == 0) {
  1744. /* check, if this is the right response message */
  1745. if(exiOut.V2G_Message.Body.WeldingDetectionRes_isUsed) {
  1746. /* show results of EVSEs answer message */
  1747. printf("EV side: received response message from EVSE\n");
  1748. printf("\tHeader SessionID=");
  1749. printBinaryArray(exiOut.V2G_Message.Header.SessionID.bytes, exiOut.V2G_Message.Header.SessionID.bytesLen);
  1750. printf("\t ResponseCode=%d\n", exiOut.V2G_Message.Body.WeldingDetectionRes.ResponseCode);
  1751. printDCEVSEStatus(&exiOut.V2G_Message.Body.WeldingDetectionRes.DC_EVSEStatus);
  1752. printf("\tEVSEPresentVoltage=%d (%d %d)\n", exiOut.V2G_Message.Body.WeldingDetectionRes.EVSEPresentVoltage.Value, exiOut.V2G_Message.Body.WeldingDetectionRes.EVSEPresentVoltage.Unit, exiOut.V2G_Message.Body.WeldingDetectionRes.EVSEPresentVoltage.Multiplier);
  1753. } else {
  1754. errn = ERROR_UNEXPECTED_CURRENT_DEMAND_RESP_MESSAGE;
  1755. return errn;
  1756. }
  1757. }
  1758. return errn;
  1759. }
  1760. #if DEPLOY_DIN_CODEC == SUPPORT_YES
  1761. static int din_test() {
  1762. int errn = 0;
  1763. struct dinEXIDocument exiDin1;
  1764. struct dinEXIDocument exiDin2;
  1765. bitstream_t stream1;
  1766. bitstream_t stream2;
  1767. uint16_t pos1 = 0;
  1768. uint16_t pos2 = 0;
  1769. stream1.size = BUFFER_SIZE;
  1770. stream1.data = buffer1;
  1771. stream1.pos = &pos1;
  1772. stream2.size = BUFFER_SIZE;
  1773. stream2.data = buffer2;
  1774. stream2.pos = &pos2;
  1775. /* SetupSessionReq */
  1776. /* BMW: 80 9A 00 11 D0 20 00 03 C1 FC 30 00 43 F8 00 */
  1777. buffer1[0] = 0x80;
  1778. buffer1[1] = 0x9A;
  1779. buffer1[2] = 0x00;
  1780. buffer1[3] = 0x11;
  1781. buffer1[4] = 0xD0;
  1782. buffer1[5] = 0x20;
  1783. buffer1[6] = 0x00;
  1784. buffer1[7] = 0x03;
  1785. buffer1[8] = 0xC1;
  1786. buffer1[9] = 0xFC;
  1787. buffer1[10] = 0x30;
  1788. buffer1[11] = 0x00;
  1789. buffer1[12] = 0x43;
  1790. buffer1[13] = 0xF8;
  1791. buffer1[14] = 0x00;
  1792. errn = decode_dinExiDocument(&stream1, &exiDin1);
  1793. if(errn != 0) {
  1794. printf("\n\nDIN test error %d!\n", errn);
  1795. return errn;
  1796. } else if (pos1 != 15) {
  1797. printf("\n\nDIN warning. not all bytes read!\n");
  1798. errn = -1;
  1799. return errn;
  1800. }
  1801. /* SetupSessionReq */
  1802. /* Chevy: 80 9A 02 00 00 00 00 00 00 00 00 11 D0 18 00 60 8C 44 09 94 00 */
  1803. buffer2[0] = 0x80;
  1804. buffer2[1] = 0x9A;
  1805. buffer2[2] = 0x02;
  1806. buffer2[3] = 0x00;
  1807. buffer2[4] = 0x00;
  1808. buffer2[5] = 0x00;
  1809. buffer2[6] = 0x00;
  1810. buffer2[7] = 0x00;
  1811. buffer2[8] = 0x00;
  1812. buffer2[9] = 0x00;
  1813. buffer2[10] = 0x00;
  1814. buffer2[11] = 0x11;
  1815. buffer2[12] = 0xD0;
  1816. buffer2[13] = 0x18;
  1817. buffer2[14] = 0x00;
  1818. buffer2[15] = 0x60;
  1819. buffer2[16] = 0x8C;
  1820. buffer2[17] = 0x44;
  1821. buffer2[18] = 0x09;
  1822. buffer2[19] = 0x94;
  1823. buffer2[20] = 0x00;
  1824. errn = decode_dinExiDocument(&stream2, &exiDin2);
  1825. if(errn != 0) {
  1826. printf("\n\nDIN test error %d!\n", errn);
  1827. return errn;
  1828. } else if (pos2 != 21) {
  1829. printf("\n\nDIN warning. not all bytes read!\n");
  1830. errn = -1;
  1831. return errn;
  1832. }
  1833. /* sessionStopReq */
  1834. pos2 = 0; /* reset position */
  1835. /* V: 0x80, 0x9a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x91, 0xf0 */
  1836. buffer2[0] = 0x80;
  1837. buffer2[1] = 0x9a;
  1838. buffer2[2] = 0x02;
  1839. buffer2[3] = 0x00;
  1840. buffer2[4] = 0x00;
  1841. buffer2[5] = 0x00;
  1842. buffer2[6] = 0x00;
  1843. buffer2[7] = 0x00;
  1844. buffer2[8] = 0x00;
  1845. buffer2[9] = 0x00;
  1846. buffer2[10] = 0x03;
  1847. buffer2[11] = 0x91;
  1848. buffer2[12] = 0xf0;
  1849. errn = decode_dinExiDocument(&stream2, &exiDin2);
  1850. if(errn != 0) {
  1851. printf("\n\nDIN test error %d!\n", errn);
  1852. return errn;
  1853. } else if (pos2 != 13) {
  1854. printf("\n\nDIN warning. not all bytes read!\n");
  1855. errn = -1;
  1856. return errn;
  1857. } else if(exiDin2.V2G_Message_isUsed == 0 || exiDin2.V2G_Message.Body.SessionStopReq_isUsed == 0) {
  1858. printf("\n\nDIN warning. no sessionStopReq message!\n");
  1859. errn = -1;
  1860. return errn;
  1861. }
  1862. if(errn == 0) {
  1863. printf("DIN test passed\n");
  1864. } else {
  1865. printf("DIN test error %d!\n", errn);
  1866. }
  1867. return errn;
  1868. }
  1869. #endif /* DEPLOY_DIN_CODEC == SUPPORT_YES */
  1870. #if DEPLOY_XMLDSIG_CODEC == SUPPORT_YES
  1871. #if DEPLOY_ISO_CODEC_FRAGMENT == SUPPORT_YES
  1872. static int xmldsig_test() {
  1873. int errn = 0, i;
  1874. bitstream_t stream1;
  1875. uint16_t pos1 = 0;
  1876. stream1.size = BUFFER_SIZE;
  1877. stream1.data = buffer1;
  1878. stream1.pos = &pos1;
  1879. bitstream_t stream2;
  1880. uint16_t pos2 = 0;
  1881. stream2.size = BUFFER_SIZE;
  1882. stream2.data = buffer2;
  1883. stream2.pos = &pos2;
  1884. struct v2gEXIFragment exiV2G_AR;
  1885. struct xmldsigEXIFragment exiXMLDSIG_SI;
  1886. int sizeIsoStream1 = 25;
  1887. int isoStream1[] = {0x80, 0x04, 0x01, 0x52, 0x51, 0x0C, 0x40, 0x82, 0x9B, 0x7B, 0x6B, 0x29, 0x02, 0x93, 0x0B, 0x73, 0x23, 0x7B, 0x69, 0x02, 0x23, 0x0B, 0xA3, 0x09, 0xE8};
  1888. int sizeIsoStream2 = 209;
  1889. int isoStream2[] = {0x80, 0x81, 0x12, 0xB4, 0x3A, 0x3A, 0x38, 0x1D, 0x17, 0x97, 0xBB, 0xBB, 0xBB, 0x97, 0x3B, 0x99, 0x97, 0x37, 0xB9, 0x33, 0x97, 0xAA, 0x29, 0x17, 0xB1, 0xB0, 0xB7, 0x37, 0xB7, 0x34, 0xB1, 0xB0, 0xB6, 0x16, 0xB2, 0xBC, 0x34, 0x97, 0xA1, 0xAB, 0x43, 0xA3, 0xA3, 0x81, 0xD1, 0x79, 0x7B, 0xBB, 0xBB, 0xB9, 0x73, 0xB9, 0x99, 0x73, 0x7B, 0x93, 0x39, 0x79, 0x91, 0x81, 0x81, 0x89, 0x79, 0x81, 0xA1, 0x7B, 0xC3, 0x6B, 0x63, 0x23, 0x9B, 0x4B, 0x39, 0x6B, 0x6B, 0x7B, 0x93, 0x29, 0x1B, 0x2B, 0x1B, 0x23, 0x9B, 0x09, 0x6B, 0x9B, 0x43, 0x09, 0x91, 0xA9, 0xB2, 0x20, 0x62, 0x34, 0x94, 0x43, 0x10, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x63, 0x61, 0x6E, 0x6F, 0x6E, 0x69, 0x63, 0x61, 0x6C, 0x2D, 0x65, 0x78, 0x69, 0x2F, 0x48, 0x52, 0xD0, 0xE8, 0xE8, 0xE0, 0x74, 0x5E, 0x5E, 0xEE, 0xEE, 0xEE, 0x5C, 0xEE, 0x66, 0x5C, 0xDE, 0xE4, 0xCE, 0x5E, 0x64, 0x60, 0x60, 0x62, 0x5E, 0x60, 0x68, 0x5E, 0xF0, 0xDA, 0xD8, 0xCA, 0xDC, 0xC6, 0x46, 0xE6, 0xD0, 0xC2, 0x64, 0x6A, 0x6C, 0x84, 0x1A, 0x36, 0xBC, 0x07, 0xA0, 0x0C, 0xB7, 0xDC, 0xAD, 0x66, 0x2F, 0x30, 0x88, 0xA6, 0x0A, 0x3D, 0x6A, 0x99, 0x43, 0x1F, 0x81, 0xC1, 0x22, 0xC2, 0xE9, 0xF1, 0x67, 0x8E, 0xF5, 0x31, 0xE9, 0x55, 0x23, 0x70};
  1890. uint8_t digestValue[] = {0xD1, 0xB5, 0xE0, 0x3D, 0x00, 0x65, 0xBE, 0xE5, 0x6B, 0x31, 0x79, 0x84, 0x45, 0x30, 0x51, 0xEB, 0x54, 0xCA, 0x18, 0xFC, 0x0E, 0x09, 0x16, 0x17, 0x4F, 0x8B, 0x3C, 0x77, 0xA9, 0x8F, 0x4A, 0xA9}; /* 32 Bytes */
  1891. /*
  1892. <v2gci_b:AuthorizationReq xmlns:v2gci_b="urn:iso:15118:2:2013:MsgBody" v2gci_b:Id="ID1">
  1893. <v2gci_b:GenChallenge>U29tZSBSYW5kb20gRGF0YQ==</v2gci_b:GenChallenge>
  1894. </v2gci_b:AuthorizationReq>
  1895. */
  1896. init_v2gEXIFragment(&exiV2G_AR);
  1897. exiV2G_AR.AuthorizationReq_isUsed = 1u;
  1898. init_v2gAuthorizationReqType(&exiV2G_AR.AuthorizationReq);
  1899. exiV2G_AR.AuthorizationReq.Id_isUsed = 1;
  1900. exiV2G_AR.AuthorizationReq.Id.charactersLen = 3;
  1901. exiV2G_AR.AuthorizationReq.Id.characters[0] = 'I';
  1902. exiV2G_AR.AuthorizationReq.Id.characters[1] = 'D';
  1903. exiV2G_AR.AuthorizationReq.Id.characters[2] = '1';
  1904. exiV2G_AR.AuthorizationReq.GenChallenge_isUsed = 1;
  1905. /* base64 U29tZSBSYW5kb20gRGF0YQ== */
  1906. exiV2G_AR.AuthorizationReq.GenChallenge.bytesLen = 16;
  1907. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[0] = 0x53;
  1908. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[1] = 0x6F;
  1909. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[2] = 0x6D;
  1910. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[3] = 0x65;
  1911. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[4] = 0x20;
  1912. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[5] = 0x52;
  1913. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[6] = 0x61;
  1914. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[7] = 0x6E;
  1915. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[8] = 0x64;
  1916. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[9] = 0x6F;
  1917. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[10] = 0x6D;
  1918. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[11] = 0x20;
  1919. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[12] = 0x44;
  1920. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[13] = 0x61;
  1921. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[14] = 0x74;
  1922. exiV2G_AR.AuthorizationReq.GenChallenge.bytes[15] = 0x61;
  1923. /* encode fragment with ISO schema */
  1924. errn = encode_v2gExiFragment(&stream1, &exiV2G_AR);
  1925. if((*stream1.pos) != sizeIsoStream1) {
  1926. errn = -1;
  1927. printf("EXI1 stream length does not match !\n");
  1928. return errn;
  1929. } else {
  1930. for(i=0; i<sizeIsoStream1; i++) {
  1931. if(stream1.data[i] != isoStream1[i]) {
  1932. errn = -1;
  1933. printf("EXI1 stream does not match at position %d !\n", i);
  1934. return errn;
  1935. }
  1936. }
  1937. }
  1938. /* TODO Create Hash for stream 1 etc ... */
  1939. /* SHA-256 is "0bXgPQBlvuVrMXmERTBR61TKGPwOCRYXT4s8d6mPSqk=" */
  1940. /*
  1941. <xmlsig:SignedInfo xmlns:xmlsig="http://www.w3.org/2000/09/xmldsig#" >
  1942. <xmlsig:CanonicalizationMethod Algorithm="http://www.w3.org/TR/canonical-exi/"/>
  1943. <xmlsig:SignatureMethod
  1944. Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"/>
  1945. <xmlsig:Reference URI="#ID1">
  1946. <xmlsig:Transforms>
  1947. <xmlsig:Transform Algorithm="http://www.w3.org/TR/canonical-exi/"/>
  1948. </xmlsig:Transforms>
  1949. <xmlsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
  1950. <xmlsig:DigestValue>0bXgPQBlvuVrMXmERTBR61TK
  1951. GPwOCRYXT4s8d6mPSqk=</xmlsig:DigestValue>
  1952. </xmlsig:Reference>
  1953. </xmlsig:SignedInfo>
  1954. */
  1955. /* encode SignedInfo element with xmldsig schema */
  1956. char arrayCanonicalEXI[35] = {"http://www.w3.org/TR/canonical-exi/"};
  1957. char arrayxmldsigSHA256[51] = {"http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"};
  1958. char arrayxmlencSHA256[39] = {"http://www.w3.org/2001/04/xmlenc#sha256"};
  1959. init_xmldsigEXIFragment(&exiXMLDSIG_SI);
  1960. exiXMLDSIG_SI.SignedInfo_isUsed = 1;
  1961. init_xmldsigSignedInfoType(&exiXMLDSIG_SI.SignedInfo);
  1962. {
  1963. init_xmldsigCanonicalizationMethodType(&exiXMLDSIG_SI.SignedInfo.CanonicalizationMethod);
  1964. exiXMLDSIG_SI.SignedInfo.CanonicalizationMethod.Algorithm.charactersLen = 35;
  1965. strncpy(exiXMLDSIG_SI.SignedInfo.CanonicalizationMethod.Algorithm.characters, arrayCanonicalEXI, 35);
  1966. exiXMLDSIG_SI.SignedInfo.SignatureMethod.HMACOutputLength_isUsed = 0;
  1967. exiXMLDSIG_SI.SignedInfo.SignatureMethod.Algorithm.charactersLen = 51;
  1968. strncpy(exiXMLDSIG_SI.SignedInfo.SignatureMethod.Algorithm.characters, arrayxmldsigSHA256, 51);
  1969. exiXMLDSIG_SI.SignedInfo.Reference.arrayLen = 1;
  1970. /* "#ID1" */
  1971. exiXMLDSIG_SI.SignedInfo.Reference.array[0].URI_isUsed = 1;
  1972. exiXMLDSIG_SI.SignedInfo.Reference.array[0].URI.charactersLen = 4;
  1973. exiXMLDSIG_SI.SignedInfo.Reference.array[0].URI.characters[0] = '#';
  1974. exiXMLDSIG_SI.SignedInfo.Reference.array[0].URI.characters[1] = 'I';
  1975. exiXMLDSIG_SI.SignedInfo.Reference.array[0].URI.characters[2] = 'D';
  1976. exiXMLDSIG_SI.SignedInfo.Reference.array[0].URI.characters[3] = '1';
  1977. /* "http://www.w3.org/TR/canonical-exi/" */
  1978. exiXMLDSIG_SI.SignedInfo.Reference.array[0].Transforms_isUsed = 1;
  1979. exiXMLDSIG_SI.SignedInfo.Reference.array[0].Transforms.Transform.arrayLen = 1;
  1980. exiXMLDSIG_SI.SignedInfo.Reference.array[0].Transforms.Transform.array[0].Algorithm.charactersLen = 35;
  1981. strncpy(exiXMLDSIG_SI.SignedInfo.Reference.array[0].Transforms.Transform.array[0].Algorithm.characters, arrayCanonicalEXI, 35); /* Will copy 35 characters from arrayCanonicalEXI to characters */
  1982. exiXMLDSIG_SI.SignedInfo.Reference.array[0].Transforms.Transform.array[0].XPath.arrayLen = 0;
  1983. exiXMLDSIG_SI.SignedInfo.Reference.array[0].DigestMethod.Algorithm.charactersLen = 39;
  1984. strncpy(exiXMLDSIG_SI.SignedInfo.Reference.array[0].DigestMethod.Algorithm.characters, arrayxmlencSHA256, 39);
  1985. /* "0bXgPQBlvuVrMXmERTBR61TKGPwOCRYXT4s8d6mPSqk=" --> 16 Bytes 536F6D652052616E646F6D2044617461 */
  1986. exiXMLDSIG_SI.SignedInfo.Reference.array[0].DigestValue.bytesLen = 32;
  1987. memcpy(exiXMLDSIG_SI.SignedInfo.Reference.array[0].DigestValue.bytes, digestValue, 32);
  1988. }
  1989. errn = encode_xmldsigExiFragment(&stream2, &exiXMLDSIG_SI);
  1990. if((*stream2.pos) != sizeIsoStream2) {
  1991. errn = -1;
  1992. printf("EXI2 stream length does not match !\n");
  1993. return errn;
  1994. } else {
  1995. for(i=0; i<sizeIsoStream2; i++) {
  1996. if(stream2.data[i] != isoStream2[i]) {
  1997. errn = -1;
  1998. printf("EXI2 stream does not match at position %d !\n", i);
  1999. return errn;
  2000. }
  2001. }
  2002. }
  2003. if(errn == 0) {
  2004. printf("XMLDSIG test passed\n");
  2005. } else {
  2006. printf("XMLDSIG test error %d!\n", errn);
  2007. }
  2008. return errn;
  2009. }
  2010. #endif /* DEPLOY_ISO_CODEC_FRAGMENT */
  2011. #endif /* DEPLOY_XMLDSIG_CODEC == SUPPORT_YES */
  2012. #define ASK_FOR_USER_INPUT 0
  2013. int main_example(int argc, char *argv[]) {
  2014. int errn = 0;
  2015. #if DEPLOY_DIN_CODEC == SUPPORT_YES
  2016. printf("+++ Start simple DIN test +++\n");
  2017. errn = din_test();
  2018. printf("+++ Terminate simple DIN test +++\n\n");
  2019. if(errn != 0) {
  2020. printf("\nDIN test error %d!\n", errn);
  2021. return errn;
  2022. }
  2023. #endif /* DEPLOY_DIN_CODEC == SUPPORT_YES */
  2024. #if DEPLOY_XMLDSIG_CODEC == SUPPORT_YES
  2025. #if DEPLOY_ISO_CODEC_FRAGMENT == SUPPORT_YES
  2026. printf("+++ Start simple XMLDSIG test +++\n");
  2027. errn = xmldsig_test();
  2028. printf("+++ Terminate simple XMLDSIG test +++\n\n");
  2029. if(errn != 0) {
  2030. printf("\nXMLDSIG test error %d!\n", errn);
  2031. return errn;
  2032. }
  2033. #endif /* DEPLOY_ISO_CODEC_FRAGMENT */
  2034. #endif /* DEPLOY_XMLDSIG_CODEC == SUPPORT_YES */
  2035. printf("+++ Start application handshake protocol example +++\n\n");
  2036. errn = appHandshake();
  2037. printf("+++ Terminate application handshake protocol example +++\n\n");
  2038. if(errn != 0) {
  2039. printf("\n\nHandshake error %d!\n", errn);
  2040. return errn;
  2041. }
  2042. #if ASK_FOR_USER_INPUT != 0
  2043. printf("\n\nPlease press enter for AC charging!\n");
  2044. fflush(stdout);
  2045. getchar();
  2046. #endif /* ASK_FOR_USER_INPUT */
  2047. printf("+++ Start V2G client / service example for AC charging +++\n\n");
  2048. errn = ac_charging();
  2049. printf("\n+++Terminate V2G Client / Service example for AC charging +++\n");
  2050. if(errn != 0) {
  2051. printf("\n\nAC_charging error %d!\n", errn);
  2052. return errn;
  2053. }
  2054. #if ASK_FOR_USER_INPUT != 0
  2055. printf("Please press enter for DC charging!\n");
  2056. fflush(stdout);
  2057. getchar();
  2058. #endif /* ASK_FOR_USER_INPUT */
  2059. printf("+++ Start V2G client / service example for DC charging +++\n\n");
  2060. errn = dc_charging();
  2061. printf("\n+++Terminate V2G client / service example for DC charging +++");
  2062. if(errn != 0) {
  2063. printf("\n\nDC_charging error %d!\n", errn);
  2064. return errn;
  2065. }
  2066. return errn;
  2067. }