SeccComm.c 712 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987
  1. /*===========================================================================
  2. Combined Charging System (CCS): SECC
  3. EVComm.c
  4. initiated by Vern, Joseph
  5. (since 2019/07/19)
  6. =============================================================================*/
  7. #include <netinet/ip.h>
  8. #include <arpa/inet.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12. #include <linux/termios.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <time.h>
  16. #include <stdlib.h>
  17. #include <sys/ipc.h>
  18. #include <sys/shm.h>
  19. #include <sys/mman.h>
  20. #include <linux/sockios.h>
  21. #include <linux/socket.h>
  22. #include <sys/socket.h>
  23. #include <netinet/in.h>
  24. #include <sys/time.h>
  25. #include <sys/timeb.h>
  26. #include <math.h>//for pow
  27. #include <unistd.h>
  28. #include <linux/if_packet.h>
  29. #include <netinet/if_ether.h>
  30. #include <net/if.h>
  31. #include <netinet/ether.h>
  32. #include <errno.h>
  33. #include <linux/can.h>
  34. #include <linux/can/raw.h>
  35. #include <openssl/ssl.h>
  36. #include <openssl/err.h>
  37. #include "define.h"
  38. #include "SeccComm.h"
  39. #include "NidNmk.h"
  40. #include "SeccComm.h"
  41. #include "CsuComm.h"
  42. #include "./exi_engine/api/api.h"
  43. #include "./exi_engine/appHandshake/appHandEXIDatatypes.h"
  44. #include "./exi_engine/transport/v2gtp.h"
  45. int MeterSMId[8];
  46. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  47. struct StatusCodeData *ShmStatusCodeData;
  48. struct CcsData *ShmCcsData;
  49. struct InternalComm *ShmInternalComm;
  50. //struct InternalCommAC *ShmInternalCommAC;
  51. struct appHandEXIDocument ccs_handshake;
  52. struct dinEXIDocument ccs_exi_doc_DIN;
  53. struct iso1EXIDocument ccs_exi_doc_ISO1;
  54. struct iso2EXIDocument ccs_exi_doc_ISO2;
  55. unsigned char V2GTP_Tx_buf[V2GTP_MSG_TX_BUFFER_SIZE]; //64*1024 ﺿ65,536 = 65.5KB
  56. unsigned char buf_log_evcomm[SIZE_OF_LOG_BUFFER];
  57. unsigned char buf_log_evcomm_fork1[SIZE_OF_LOG_BUFFER];
  58. unsigned char buf_log_evcomm_fork2[SIZE_OF_LOG_BUFFER];
  59. unsigned char buf_log_evcomm_fork3[SIZE_OF_LOG_BUFFER];
  60. pid_t CP_Detection_Pid = 0;
  61. pid_t PP_Detection_Pid = 0;
  62. pid_t Error_Monitor_Pid = 0;
  63. int TcpAcceptFd;
  64. #ifdef SUPPORT_TLS_CONNECTION
  65. SSL_CTX *ctx;
  66. SSL *ssl;
  67. unsigned char EvSecurity;
  68. #endif
  69. enum MsgFlowStatus V2gFlowStatus;
  70. int RawSock,UdpSock,TcpSock;
  71. unsigned char *V2gtpMsgRxBuf, *V2gtpMsgTxBuf;
  72. unsigned short Aag[64];
  73. struct MmeHeader SendMmePacket;
  74. int SendMmePacketSize;
  75. unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
  76. struct sockaddr_ll DestSocketAddress;
  77. struct ifreq Req;
  78. unsigned int PwmStartTime;
  79. struct timeb SeqStartTime, SeqEndTime;
  80. unsigned char AagGroupsNum, MnbcSoundNum, AttenProfileCnt;
  81. unsigned char NewNmkKey[16], Nid[7];
  82. int writeStringToEXIString(unsigned char* string, exi_string_character_t* exiString)
  83. {
  84. int pos = 0;
  85. while(string[pos]!='\0')
  86. {
  87. exiString[pos] = string[pos];
  88. pos++;
  89. }
  90. return pos;
  91. }
  92. /*===========================================================================
  93. FUNCTION: Check_V2G_Flow_Status
  94. DESCRIPTION:
  95. PRE-CONDITION:
  96. INPUT:
  97. OUTPUT:
  98. GLOBAL VARIABLES:
  99. =============================================================================*/
  100. unsigned char Check_V2G_Flow_Status()
  101. {
  102. unsigned char result = 0;
  103. switch (ShmCcsData->CommProtocol)
  104. {
  105. case V2GT_MSG_PROTOCOL_DIN70121: //0
  106. {
  107. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  108. break;
  109. }
  110. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  111. {
  112. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  113. break;
  114. }
  115. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  116. {
  117. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  118. break;
  119. }
  120. default:
  121. break;
  122. }
  123. return result;
  124. }
  125. /*===========================================================================
  126. FUNCTION: StoreLogMsg
  127. DESCRIPTION:
  128. PRE-CONDITION:
  129. INPUT:
  130. OUTPUT:
  131. GLOBAL VARIABLES:
  132. =============================================================================*/
  133. #if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  134. int StoreLogMsg2(unsigned char *DataString)
  135. {
  136. static unsigned char Buf[1024];
  137. static time_t CurrentTime;
  138. static struct tm *tm;
  139. static struct timeval tv;
  140. memset(Buf, 0, sizeof(Buf));
  141. CurrentTime = time(NULL);
  142. tm = localtime(&CurrentTime);
  143. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  144. #ifdef AWCCS
  145. sprintf(Buf, "echo \"[%04d%02d%02d: %02d:%02d:%02d.%06d][SECC][%d][%02d]%s\" >> /Storage/SystemLog/[%04d.%02d]CCS-SystemLog",
  146. tm->tm_year + 1900,
  147. tm->tm_mon + 1,
  148. tm->tm_mday,
  149. tm->tm_hour,
  150. tm->tm_min,
  151. tm->tm_sec,
  152. tv.tv_usec,
  153. EVCOMM_SYS_INFO.CpState,
  154. Check_V2G_Flow_Status(),
  155. DataString,
  156. tm->tm_year + 1900,
  157. tm->tm_mon + 1);
  158. #else
  159. sprintf(Buf, "echo \"[%04d%02d%02d: %02d:%02d:%02d.%06d][SECC][%d][%02d]%s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  160. tm->tm_year + 1900,
  161. tm->tm_mon + 1,
  162. tm->tm_mday,
  163. tm->tm_hour,
  164. tm->tm_min,
  165. tm->tm_sec,
  166. tv.tv_usec,
  167. EVCOMM_SYS_INFO.CpState,
  168. Check_V2G_Flow_Status(),
  169. DataString,
  170. tm->tm_year + 1900,
  171. tm->tm_mon + 1);
  172. #endif
  173. system(Buf);
  174. DEBUG_PRINTF_EVCOMM_SYSTEM_LOG("[%02d:%02d:%02d.%06d][SECC][%d][%02d]%s \n",
  175. tm->tm_hour,
  176. tm->tm_min,
  177. tm->tm_sec,
  178. tv.tv_usec,
  179. EVCOMM_SYS_INFO.CpState,
  180. Check_V2G_Flow_Status(),
  181. DataString);
  182. //Reset the buf_log_evcomm Buffer, i.e. DataString
  183. memset(buf_log_evcomm, 0, SIZE_OF_LOG_BUFFER);
  184. }
  185. #endif
  186. /*===========================================================================
  187. FUNCTION: CAN_Tx_MSG
  188. DESCRIPTION:
  189. PRE-CONDITION:
  190. INPUT:
  191. OUTPUT:
  192. GLOBAL VARIABLES:
  193. =============================================================================*/
  194. int CAN_Tx_MSG(int Fd, unsigned int MsgId, unsigned char SlaveAddress, unsigned char DataLength, unsigned char *SendData)
  195. {
  196. struct can_frame frame;
  197. struct timeb StartTime, EndTime;
  198. unsigned int tmp = 0;
  199. int nbytes = 0;
  200. int i = 0;
  201. //Protection: To avoid unexpected length for CAN bus payload.
  202. if (DataLength > 8)
  203. {
  204. DataLength = 8;
  205. }
  206. memset(&frame, 0, sizeof(struct can_frame));
  207. frame.can_id = 0x80000000 | CAN_SEND_DIRECTION | MsgId | SlaveAddress; //0x80000000: extension ID format
  208. frame.can_dlc = DataLength;
  209. memcpy(frame.data, SendData, DataLength);
  210. nbytes = write(Fd, &frame, sizeof(struct can_frame));
  211. #if 0
  212. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][CAN_Tx_MSG] <%X> ", frame.can_id);
  213. for (i = 0; i < frame.can_dlc; i++)
  214. {
  215. DEBUG_PRINTF_EVCOMM_DETAIL("%02X ", frame.data[i]);
  216. }
  217. DEBUG_PRINTF_EVCOMM_DETAIL("(%d Bytes)\n", frame.can_dlc);
  218. #endif
  219. return nbytes;
  220. }
  221. /*===========================================================================
  222. FUNCTION: Proc_EVStopRes
  223. DESCRIPTION:
  224. PRE-CONDITION:
  225. INPUT:
  226. OUTPUT:
  227. GLOBAL VARIABLES:
  228. =============================================================================*/
  229. int Proc_EVStopRes(int Fd)
  230. {
  231. int nbytes;
  232. unsigned char Buffer[8];
  233. memset(Buffer, 0, sizeof(Buffer));
  234. if (CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency == TRUE)
  235. {
  236. Buffer[0] = EV_EMERGENCY_STOP; //2
  237. }
  238. else
  239. {
  240. Buffer[0] = EV_NORMAL_STOP; //1
  241. }
  242. /*
  243. if(strlen(ShmStatusCodeData->PresentStatusCode[0]) > 0)
  244. {
  245. memcpy(Buffer + 2, ShmStatusCodeData->PresentStatusCode[0], 6);
  246. }
  247. */
  248. Buffer[1] = ShmStatusCodeData->PresentStatusCode[0][0];
  249. Buffer[2] = ShmStatusCodeData->PresentStatusCode[0][1];
  250. Buffer[3] = ShmStatusCodeData->PresentStatusCode[0][2];
  251. Buffer[4] = ShmStatusCodeData->PresentStatusCode[0][3];
  252. Buffer[5] = ShmStatusCodeData->PresentStatusCode[0][4];
  253. Buffer[6] = ShmStatusCodeData->PresentStatusCode[0][5];
  254. nbytes = CAN_Tx_MSG(Fd, CAN_CMD_EV_STOP_EVENT, ShmInternalComm->SlaveAddress, 7, Buffer);
  255. //system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //for test only
  256. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  257. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_EVStopRes] Sending STOP Command to CSU");
  258. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = FALSE;
  259. return nbytes;
  260. }
  261. /*===========================================================================
  262. FUNCTION: Sniffer_Candump
  263. DESCRIPTION:
  264. 1. Only used in End_Process(), which is in fork2 of SeccComm task.
  265. PRE-CONDITION:
  266. INPUT:
  267. OUTPUT:
  268. 0: accept
  269. -1: invalid
  270. GLOBAL VARIABLES:
  271. =============================================================================*/
  272. int Sniffer_Candump(char cmd)
  273. {
  274. #if (CANDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  275. if (cmd == ENABLE)
  276. {
  277. SAVE_SYS_LOG_MSG_EVCOMM("[candump]init");
  278. system("cd /mnt/;rm -rf candump/");
  279. system("cd /mnt/;mkdir candump");
  280. SAVE_SYS_LOG_MSG_EVCOMM("[candump]on");
  281. system("cd /mnt/candump;candump -l can0 &");
  282. return 0;
  283. }
  284. else if (cmd == DISABLE)
  285. {
  286. SAVE_SYS_LOG_MSG_EVCOMM("[candump]off");
  287. system("killall candump");
  288. SAVE_SYS_LOG_MSG_EVCOMM("[candump]save");
  289. system("cd /;cp -rfv /mnt/candump /Storage/SystemLog/");
  290. return 0;
  291. }
  292. else
  293. {
  294. sprintf(buf_log_evcomm_fork2, "[candump]unexpected cmd(%d)", cmd);
  295. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  296. return -1;
  297. }
  298. #endif
  299. }
  300. /*===========================================================================
  301. FUNCTION: Sniffer_Tcpdump
  302. DESCRIPTION:
  303. PRE-CONDITION:
  304. INPUT:
  305. OUTPUT:
  306. GLOBAL VARIABLES:
  307. =============================================================================*/
  308. int Sniffer_Tcpdump(char cmd)
  309. {
  310. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  311. if (cmd == ENABLE)
  312. {
  313. SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]init...");
  314. system("cd /mnt/;rm -rf tcpdump/");
  315. system("cd /mnt/;mkdir tcpdump");
  316. unsigned char buf[256];
  317. time_t CurrentTime;
  318. struct tm *tm;
  319. struct timeval tv;
  320. memset(buf, 0, sizeof(buf));
  321. CurrentTime = time(NULL);
  322. tm = localtime(&CurrentTime);
  323. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  324. sprintf(buf,
  325. "tcpdump -i eth1 -w /mnt/tcpdump/[%s][%04d%02d%02d-%02d:%02d:%02d.%06d]packets.pcap&",
  326. FIRMWARE_VERSION,
  327. tm->tm_year + 1900,
  328. tm->tm_mon + 1,
  329. tm->tm_mday,
  330. tm->tm_hour,
  331. tm->tm_min,
  332. tm->tm_sec,
  333. tv.tv_usec
  334. );
  335. SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]on");
  336. system(buf);
  337. return 0;
  338. }
  339. else if (cmd == DISABLE)
  340. {
  341. SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]off");
  342. system("killall tcpdump");
  343. SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]wait: 2s");
  344. sleep(1);
  345. SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]wait: 1s");
  346. sleep(1);
  347. SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]save");
  348. system("cd /;cp -rfv /mnt/tcpdump /Storage/SystemLog/");
  349. return 0;
  350. }
  351. else
  352. {
  353. sprintf(buf_log_evcomm, "[tcpdump]unexpected cmd(%d)", cmd);
  354. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  355. return -1;
  356. }
  357. #endif
  358. }
  359. /*===========================================================================
  360. FUNCTION: Check_V2G_Flow_Status_pre
  361. DESCRIPTION:
  362. PRE-CONDITION:
  363. INPUT:
  364. OUTPUT:
  365. GLOBAL VARIABLES:
  366. =============================================================================*/
  367. unsigned char Check_V2G_Flow_Status_pre()
  368. {
  369. unsigned char result = 0;
  370. switch (ShmCcsData->CommProtocol)
  371. {
  372. case V2GT_MSG_PROTOCOL_DIN70121: //0
  373. {
  374. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre;
  375. break;
  376. }
  377. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  378. {
  379. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre;
  380. break;
  381. }
  382. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  383. {
  384. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre;
  385. break;
  386. }
  387. default:
  388. break;
  389. }
  390. return result;
  391. }
  392. /*===========================================================================
  393. FUNCTION: Update_V2G_Flow_Status
  394. DESCRIPTION:
  395. PRE-CONDITION:
  396. INPUT:
  397. OUTPUT:
  398. 1. V2gFlowStatus
  399. GLOBAL VARIABLES:
  400. 1. V2gFlowStatus
  401. =============================================================================*/
  402. int Update_V2G_Flow_Status(unsigned int state_new)
  403. {
  404. unsigned char state_now;
  405. state_now = Check_V2G_Flow_Status();
  406. if (/*EVCOMM_SYS_INFO.End_Process_inused == TRUE ||*/
  407. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused == TRUE)
  408. {
  409. if (state_now != Performance_Timeout && //253
  410. state_now != Sequence_Timeout && //254
  411. state_now != Other_Fault) //255
  412. {
  413. sprintf(buf_log_evcomm,
  414. "[Warning]state(%d) change: ignored (End_Process_inused:%d, FW_Update_Task_inused:%d)",
  415. state_new,
  416. EVCOMM_SYS_INFO.End_Process_inused,
  417. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused
  418. );
  419. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  420. return -1;
  421. }
  422. }
  423. if (state_now != state_new)
  424. {
  425. //Step 1: Check if Error Occours
  426. if (state_now == Performance_Timeout || //253
  427. state_now == Sequence_Timeout || //254
  428. state_now == Other_Fault) //255
  429. {
  430. if (state_new != IDLE)
  431. {
  432. if (EVCOMM_SYS_INFO.State_Change_Ignored_Notice == FALSE)
  433. {
  434. EVCOMM_SYS_INFO.State_Change_Ignored_Notice = TRUE;
  435. sprintf(buf_log_evcomm,
  436. "[Warning]state(%d) change: ignored(now in error state)",
  437. state_new,
  438. state_now);
  439. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  440. }
  441. return -1;
  442. }
  443. }
  444. //Updating the state formally.
  445. sprintf(buf_log_evcomm,
  446. "[stt]%02d >> %02d",
  447. state_now,
  448. state_new
  449. );
  450. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  451. V2gFlowStatus = state_new;
  452. state_now = state_new;
  453. switch (ShmCcsData->CommProtocol)
  454. {
  455. case V2GT_MSG_PROTOCOL_DIN70121: //0
  456. {
  457. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  458. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus = V2gFlowStatus;
  459. //break;
  460. }
  461. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  462. {
  463. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  464. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus = V2gFlowStatus;
  465. //break;
  466. }
  467. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  468. {
  469. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  470. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus = V2gFlowStatus;
  471. //break;
  472. }
  473. default:
  474. break;
  475. }
  476. }
  477. }
  478. double DiffTimeb(struct timeb ST, struct timeb ET)
  479. {
  480. //return milli-second
  481. double StartTime, EndTime;
  482. double t_diff;
  483. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  484. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  485. t_diff = EndTime - StartTime;
  486. if (t_diff < 0)
  487. {
  488. #if 0
  489. if (t_diff < -1000) //1000ms
  490. {
  491. sprintf(buf_log_evcomm,
  492. "[Warning]StartTime(%.02lf) > EndTime(%.02lf), d(%.02lf)",
  493. StartTime,
  494. EndTime,
  495. t_diff);
  496. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  497. }
  498. #endif
  499. return -1;
  500. }
  501. return t_diff;
  502. }
  503. double DiffTimeb_fork1_Error_Monitor(struct timeb ST, struct timeb ET)
  504. {
  505. //return milli-second
  506. static double StartTime, EndTime;
  507. static double t_diff;
  508. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  509. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  510. t_diff = EndTime - StartTime;
  511. if (t_diff < 0)
  512. {
  513. #if 0
  514. if (t_diff < -1000) //1000ms
  515. {
  516. sprintf(buf_log_evcomm_fork2,
  517. "[fork1][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  518. StartTime,
  519. EndTime,
  520. t_diff);
  521. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  522. }
  523. #endif
  524. return -1;
  525. }
  526. return t_diff;
  527. }
  528. double DiffTimeb_fork2_Error_Monitor(struct timeb ST, struct timeb ET)
  529. {
  530. //return milli-second
  531. static double StartTime, EndTime;
  532. static double t_diff;
  533. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  534. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  535. t_diff = EndTime - StartTime;
  536. if (t_diff < 0)
  537. {
  538. #if 0
  539. if (t_diff < -1000) //1000ms
  540. {
  541. sprintf(buf_log_evcomm_fork2,
  542. "[fork2][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  543. StartTime,
  544. EndTime,
  545. t_diff);
  546. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  547. }
  548. #endif
  549. return -1;
  550. }
  551. return t_diff;
  552. }
  553. int CreateShareMemory()
  554. {
  555. int MeterSMId;
  556. //create ShmSysConfigAndInfo
  557. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  558. {
  559. SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmget ShmSysConfigAndInfo NG");
  560. return 0;
  561. }
  562. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  563. {
  564. SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmat ShmSysConfigAndInfo NG");
  565. return 0;
  566. }
  567. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  568. //create ShmStatusCodeData
  569. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  570. {
  571. SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmget ShmStatusCodeData NG");
  572. return 0;
  573. }
  574. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  575. {
  576. SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmat ShmStatusCodeData NG");
  577. return 0;
  578. }
  579. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  580. //create ShmCcsData
  581. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  582. {
  583. SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmget ShmCcsData NG");
  584. return 0;
  585. }
  586. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  587. {
  588. SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmat ShmCcsData NG");
  589. return 0;
  590. }
  591. memset(ShmCcsData,0,sizeof(struct CcsData));
  592. return 1;
  593. }
  594. void DetachShareMemory()
  595. {
  596. if(MeterSMId[0]>0)
  597. {
  598. shmdt(ShmSysConfigAndInfo);
  599. shmctl(MeterSMId[0], IPC_RMID, 0);
  600. }
  601. if(MeterSMId[1]>0)
  602. {
  603. shmdt(ShmStatusCodeData);
  604. shmctl(MeterSMId[1], IPC_RMID, 0);
  605. }
  606. if(MeterSMId[2]>0)
  607. {
  608. shmdt(ShmCcsData);
  609. shmctl(MeterSMId[2], IPC_RMID, 0);
  610. }
  611. if(MeterSMId[3]>0)
  612. {
  613. shmdt(ShmInternalComm);
  614. shmctl(MeterSMId[3], IPC_RMID, 0);
  615. }
  616. /*if(MeterSMId[4]>0)
  617. {
  618. shmdt(ShmInternalCommAC);
  619. shmctl(MeterSMId[4], IPC_RMID, 0);
  620. }*/
  621. }
  622. /*===========================================================================
  623. FUNCTION: ShareMemory_Init
  624. DESCRIPTION:
  625. PRE-CONDITION:
  626. INPUT:
  627. OUTPUT:
  628. GLOBAL VARIABLES:
  629. =============================================================================*/
  630. int ShareMemory_Init()
  631. {
  632. memset(MeterSMId,0,sizeof(MeterSMId));
  633. //create ShmSysConfigAndInfo
  634. if ((MeterSMId[0] = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  635. {
  636. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmSysConfigAndInfo NG");
  637. return 0;
  638. }
  639. else if ((ShmSysConfigAndInfo = shmat(MeterSMId[0], NULL, 0)) == (void *) -1)
  640. {
  641. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmSysConfigAndInfo NG");
  642. return 0;
  643. }
  644. //create ShmStatusCodeData
  645. if ((MeterSMId[1] = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  646. {
  647. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmStatusCodeData NG");
  648. return 0;
  649. }
  650. else if ((ShmStatusCodeData = shmat(MeterSMId[1], NULL, 0)) == (void *) -1)
  651. {
  652. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmStatusCodeData NG");
  653. return 0;
  654. }
  655. //create ShmCcsData
  656. if ((MeterSMId[2] = shmget(ShmCcsCommKey, sizeof(struct CcsData), 0777)) < 0)
  657. {
  658. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmCcsData NG");
  659. return 0;
  660. }
  661. else if ((ShmCcsData = shmat(MeterSMId[2], NULL, 0)) == (void *) -1)
  662. {
  663. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmCcsData NG");
  664. return 0;
  665. }
  666. //create ShmInternalComm
  667. if ((MeterSMId[3] = shmget(ShmInternalCommKey, sizeof(struct InternalComm), 0777)) < 0)
  668. {
  669. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmInternalComm NG");
  670. return 0;
  671. }
  672. else if ((ShmInternalComm = shmat(MeterSMId[3], NULL, 0)) == (void *) -1)
  673. {
  674. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmInternalComm NG");
  675. return 0;
  676. }
  677. #if 0
  678. //create ShmInternalCommAC
  679. if ((MeterSMId[4] = shmget(ShmInternalCommACKey, sizeof(struct InternalCommAC), 0777)) < 0)
  680. {
  681. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmInternalCommAC NG");
  682. return 0;
  683. }
  684. else if ((ShmInternalCommAC = shmat(MeterSMId[4], NULL, 0)) == (void *) -1)
  685. {
  686. SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmInternalCommAC NG");
  687. return 0;
  688. }
  689. #endif
  690. //[To-Do] The initialization here is reduntant and should be removed partially.
  691. //SHM_Init_supportedAppProtocolRes(ShmCcsData);
  692. //SHM_Init_din_SessionSetupRes(ShmCcsData);
  693. //SHM_Init_din_ServiceDiscoveryRes(ShmCcsData);
  694. //SHM_Init_din_ServiceAndPaymentSelectionRes(ShmCcsData);
  695. //SHM_Init_din_ContractAuthenticationRes(ShmCcsData);
  696. SHM_Init_din_ChargeParameterDiscoveryRes(ShmCcsData);
  697. SHM_Init_din_CableCheckRes(ShmCcsData);
  698. SHM_Init_din_PreChargeRes(ShmCcsData);
  699. SHM_Init_din_PowerDeliveryRes(ShmCcsData);
  700. SHM_Init_din_CurrentDemandRes(ShmCcsData);
  701. SHM_Init_din_WeldingDetectionRes(ShmCcsData);
  702. SHM_Init_din_SessionStopRes(ShmCcsData);
  703. return 1;
  704. }
  705. /*===========================================================================
  706. FUNCTION: GetEthMac
  707. DESCRIPTION:
  708. 1. Accessing current CsuMac address, if Eth = eth1
  709. 2. The address of eth1(for QCA7000) is a random number, which will be modified
  710. after each time of booting up system.
  711. PRE-CONDITION:
  712. INPUT:
  713. OUTPUT:
  714. GLOBAL VARIABLES:
  715. =============================================================================*/
  716. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  717. {
  718. //Parameters:MAC,IP,Mask,Gateway
  719. int fd, rd = 0;
  720. unsigned char addr[18], Buffer[128];
  721. memset(Buffer, 0, sizeof(Buffer));
  722. sprintf(Buffer, "cat /sys/class/net/%s/address > /mnt/GetEthInfo", Eth); //CsuMac (Eth = eth1)
  723. system(Buffer);
  724. fd = open("/mnt/GetEthInfo", O_RDONLY);
  725. if(fd < 0)
  726. {
  727. system("rm -f /mnt/GetEthInfo");
  728. SAVE_SYS_LOG_MSG_EVCOMM("GetEthMac: MAC Address open error");
  729. return 0;
  730. }
  731. memset(mac, 0, 6);
  732. memset(addr, 0, sizeof(addr));
  733. rd = read(fd, addr, 17);
  734. close(fd);
  735. system("rm -f /mnt/GetEthInfo");
  736. sscanf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); //CsuMac (Eth = eth1)
  737. sprintf(buf_log_evcomm,
  738. "[GetEthMac]EVSE MACAddr(CsuMac): %02x:%02x:%02x:%02x:%02x:%02x",
  739. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); //CsuMac (Eth = eth1)
  740. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  741. return 1;
  742. }
  743. /*===========================================================================
  744. FUNCTION: ReadAdcVolt
  745. DESCRIPTION:
  746. 1. fork1
  747. PRE-CONDITION:
  748. INPUT:
  749. OUTPUT:
  750. GLOBAL VARIABLES:
  751. =============================================================================*/
  752. float ReadAdcVolt(unsigned char AdcChannel)
  753. {
  754. //AIN0=CCS GUN Temp 1
  755. //AIN1=CCS GUN Temp 2
  756. //AIN2=CCS_Proximity/2
  757. //AIN3=pilot voltage
  758. if(AdcChannel == 3)
  759. {
  760. int fd,count,AvgTimes;
  761. unsigned char SampleBuf[4];
  762. float TmpVolt, MinSample, AvgSample = 0;
  763. fd = open("/sys/bus/iio/devices/iio\:device0/in_voltage3_raw", O_RDONLY);
  764. if(fd > 0)
  765. {
  766. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  767. for(AvgTimes = 0; AvgTimes < 3; AvgTimes++) //period = 60~91 ms(renice -10, , CurrentDemand()) /*+++ 20200909, vern, extend detection time for interference ---*/
  768. {
  769. count = 0;
  770. MinSample = 2306;
  771. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  772. while(count < 30) //period = 21~42ms (renice -10, CurrentDemand())/*+++ 20200909, vern, extend detection time for interference ---*/
  773. {
  774. //re-sampling period = 3~13ms (renice -10, SLAC())
  775. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  776. read(fd, SampleBuf, 4); //period = 3.2~10ms (renice -10, SLAC())
  777. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  778. TmpVolt = atoi(SampleBuf);
  779. if((TmpVolt < 2306) && (TmpVolt > 0))//positive voltage
  780. {
  781. if(TmpVolt < MinSample)
  782. {
  783. MinSample = TmpVolt;
  784. }
  785. count++;
  786. }
  787. lseek(fd, 0, SEEK_SET);
  788. }
  789. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  790. AvgSample += MinSample;
  791. }
  792. AvgSample /= AvgTimes;
  793. close(fd);
  794. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  795. return ((0.954-(1.8*AvgSample/4095))/0.06);
  796. }
  797. else
  798. {
  799. return -1;
  800. }
  801. }
  802. else
  803. {
  804. FILE *fp;
  805. unsigned char str[64];
  806. unsigned char AdcValue[8];
  807. if(AdcChannel > 7)
  808. {
  809. return -1;
  810. }
  811. memset(str,0,sizeof(str));
  812. memset(AdcValue,0,sizeof(AdcValue));
  813. sprintf(str, "cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw", AdcChannel);
  814. fp=popen(str, "r");
  815. if(fgets(AdcValue,sizeof(AdcValue),fp) == NULL)
  816. {
  817. pclose(fp);
  818. return -1;
  819. }
  820. pclose(fp);
  821. //Vin = Vref *D / (2^n - 1)
  822. return ((float)1.8*(float)atoi(AdcValue))/4095;
  823. }
  824. }
  825. /*===========================================================================
  826. FUNCTION: ReadAdcVolt
  827. DESCRIPTION:
  828. //AIN0=CCS GUN Temp 1
  829. //AIN1=CCS GUN Temp 2
  830. //AIN2=CCS_Proximity/2
  831. //AIN3=pilot voltage
  832. PRE-CONDITION:
  833. INPUT:
  834. OUTPUT:
  835. GLOBAL VARIABLES:
  836. =============================================================================*/
  837. float ReadAdcVolt_PP_fork3()
  838. {
  839. int fd, AvgTimes;
  840. unsigned char SampleBuf[4];
  841. float TmpVolt = 0;
  842. float AvgSample = 0;
  843. float V_pp = 0;
  844. fd = open("/sys/bus/iio/devices/iio\:device0/in_voltage2_raw", O_RDONLY); //PP
  845. if(fd > 0)
  846. {
  847. for(AvgTimes = 0; AvgTimes < 5; AvgTimes++) //get 5 samples
  848. {
  849. read(fd, SampleBuf, 4);
  850. TmpVolt = atoi(SampleBuf);
  851. lseek(fd, 0, SEEK_SET);
  852. AvgSample += TmpVolt;
  853. }
  854. close(fd);
  855. AvgSample /= AvgTimes;
  856. V_pp = (1.8*AvgSample)/4095; //PP
  857. //CCS1: plug : 0.61<=V_pp<=1.18
  858. //CCS2:plug : 1.2<=V_pp<=2.4
  859. #if 0
  860. printf("PP_adc = %.02f, PP_v = %.02f\n", AvgSample, V_pp);
  861. usleep(3000000); //300ms
  862. #endif
  863. usleep(20000); //20ms
  864. return V_pp;
  865. }
  866. else
  867. {
  868. return -1;
  869. }
  870. }
  871. /*===========================================================================
  872. FUNCTION: Qca7kPowerReset
  873. DESCRIPTION:
  874. PRE-CONDITION:
  875. INPUT:
  876. OUTPUT:
  877. GLOBAL VARIABLES:
  878. =============================================================================*/
  879. void Qca7kPowerReset()
  880. {
  881. //printf("\n[CCS Board]Reset QCA7000...\n");
  882. system("echo 1 > /sys/class/gpio/gpio88/value");
  883. usleep(500000);
  884. system("echo 0 > /sys/class/gpio/gpio88/value");
  885. }
  886. /*===========================================================================
  887. FUNCTION: SwitchCpStateE
  888. DESCRIPTION:
  889. PRE-CONDITION:
  890. INPUT:
  891. OUTPUT:
  892. GLOBAL VARIABLES:
  893. =============================================================================*/
  894. int SwitchCpStateE(unsigned char OnOff)
  895. {
  896. if((OnOff != ENABLE) && (OnOff != DISABLE))
  897. {
  898. return -1;
  899. }
  900. struct ChargingInfoData *ccs;
  901. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  902. ccs->SwitchCpStateE_status = OnOff;
  903. //OnOff = 1 => switch State to E
  904. //OnOff = 0 => return noraml
  905. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  906. {
  907. if(OnOff == DISABLE)
  908. {
  909. //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: released\n");
  910. // CSUCOMMAC_SHM.CpSetStateE = DISABLE;
  911. }
  912. else
  913. {
  914. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  915. //CSUCOMMAC_SHM.CpSetStateE = ENABLE;
  916. //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: enabled!\n");
  917. }
  918. }
  919. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  920. {
  921. if(OnOff == DISABLE)
  922. {
  923. //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: released\n");
  924. system("echo 0 > /sys/class/gpio/gpio86/value");
  925. }
  926. else
  927. {
  928. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  929. system("echo 1 > /sys/class/gpio/gpio86/value");
  930. //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: enabled!\n");
  931. }
  932. }
  933. #endif
  934. if (ccs->SwitchCpStateE_status_pre != ccs->SwitchCpStateE_status)
  935. {
  936. sprintf(buf_log_evcomm,
  937. "SwitchCpStateE: %d >> %d",
  938. ccs->SwitchCpStateE_status_pre,
  939. ccs->SwitchCpStateE_status
  940. );
  941. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  942. ccs->SwitchCpStateE_status_pre = ccs->SwitchCpStateE_status;
  943. }
  944. }
  945. /*===========================================================================
  946. FUNCTION: OutputCpPwmDuty
  947. DESCRIPTION:
  948. PRE-CONDITION:
  949. INPUT:
  950. OUTPUT:
  951. GLOBAL VARIABLES:
  952. =============================================================================*/
  953. int OutputCpPwmDuty(unsigned char Duty)
  954. {
  955. int DutyInNanoSec;
  956. struct ChargingInfoData *ccs;
  957. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  958. if((Duty < 0)||(Duty > 100))
  959. {
  960. return -1;
  961. }
  962. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  963. {
  964. //CSUCOMMAC_SHM.CpSetPWMDuty = Duty;
  965. }
  966. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  967. {
  968. DutyInNanoSec = 10000 * Duty;
  969. sprintf(buf_log_evcomm, "echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle", DutyInNanoSec);//nanoseconds
  970. system(buf_log_evcomm);
  971. }
  972. #endif
  973. ccs->CpDuty = Duty;
  974. //CP Duty
  975. if (ccs->CpDuty != ccs->CpDuty_pre)
  976. {
  977. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  978. sprintf(buf_log_evcomm, "CP Duty: %d\% >> %d\%", ccs->CpDuty_pre, ccs->CpDuty);
  979. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  980. ccs->CpDuty_pre = ccs->CpDuty;
  981. }
  982. return 0;
  983. }
  984. /*===========================================================================
  985. FUNCTION: Check_Plugin_Status_Update_fork1
  986. DESCRIPTION:
  987. PRE-CONDITION:
  988. INPUT:
  989. OUTPUT:
  990. GLOBAL VARIABLES:
  991. =============================================================================*/
  992. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  993. void Check_Plugin_Status_Update_fork1(struct ChargingInfoData *ccs)
  994. {
  995. if (ccs->ConnectorPlugIn != ccs->ConnectorPlugIn_new)
  996. {
  997. sprintf(buf_log_evcomm_fork1, "[fork1]Plugin: %d >> %d (CP=%.2fV, PP=%.2fV)",
  998. ccs->ConnectorPlugIn,
  999. ccs->ConnectorPlugIn_new,
  1000. ccs->CpVoltage,
  1001. ccs->PpVoltage
  1002. );
  1003. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
  1004. ccs->ConnectorPlugIn_pre = ccs->ConnectorPlugIn;
  1005. ccs->ConnectorPlugIn = ccs->ConnectorPlugIn_new;
  1006. //ccs->CpVoltage_pre = ccs->CpVoltage;
  1007. }
  1008. }
  1009. //#endif
  1010. /*===========================================================================
  1011. FUNCTION: ConnectorPlugIn
  1012. DESCRIPTION:
  1013. PRE-CONDITION:
  1014. INPUT:
  1015. OUTPUT:
  1016. GLOBAL VARIABLES:
  1017. =============================================================================*/
  1018. int CheckConnectorPlugIn()
  1019. {
  1020. //return 0 => unplug
  1021. //return 1 => plug-in
  1022. //float TmpProximity;
  1023. //unsigned char Rtn = 0;
  1024. static struct ChargingInfoData *ccs;
  1025. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1026. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1027. return (int)ccs->ConnectorPlugIn;
  1028. #else
  1029. return TRUE;
  1030. #endif
  1031. /*
  1032. // PP Detection
  1033. TmpProximity = ReadAdcVolt(ADC_CHANNEL_AIN2_PP);
  1034. //[CAUTION] This function takes a period of time to deal with.
  1035. //Designers should avoid to call it in main function, repeatly.
  1036. if(((FIRMWARE_VERSION & 0x0000FF00) >> 8) == 0x01)
  1037. {
  1038. //UL version: judge with CP and proximity
  1039. //TmpProximity = ReadAdcVolt(ADC_CHANNEL_AIN2_PP);
  1040. //SAVE_SYS_LOG_MSG_EVCOMM("Connector: UL");
  1041. if((ccs->CpState >= 2) &&
  1042. (ccs->CpState <= 5) &&
  1043. (TmpProximity >= 0.4) &&
  1044. (TmpProximity <= 0.9))
  1045. {
  1046. Rtn = 1;
  1047. }
  1048. }
  1049. else
  1050. {
  1051. //SAVE_SYS_LOG_MSG_EVCOMM("Connector: CE");
  1052. //CE version: judge with CP only
  1053. if((ccs->CpState >=2 ) &&
  1054. (ccs->CpState <=5 ))
  1055. {
  1056. Rtn = 1;
  1057. }
  1058. }
  1059. */
  1060. //CE version: judge with CP only
  1061. /*
  1062. if((ccs->CpState >= 2 ) &&
  1063. (ccs->CpState <= 5 ))
  1064. {
  1065. Rtn = TRUE;
  1066. }
  1067. ccs->ConnectorPlugIn = Rtn;
  1068. //ccs->PpVoltage = TmpProximity;
  1069. return Rtn;
  1070. */
  1071. }
  1072. /*===========================================================================
  1073. FUNCTION: Check_CP_State_Error_fork1
  1074. DESCRIPTION:
  1075. PRE-CONDITION:
  1076. INPUT:
  1077. OUTPUT:
  1078. GLOBAL VARIABLES:
  1079. =============================================================================*/
  1080. int Check_CP_State_Error_fork1(struct ChargingInfoData *ccs)
  1081. {
  1082. #if (CP_PROTECTION_MECHANISM == DISABLE)
  1083. {
  1084. return -1;
  1085. }
  1086. #endif
  1087. unsigned char state = 0;
  1088. double time_diff = 0;
  1089. state = Check_V2G_Flow_Status();
  1090. //SLAC, SLAAC, SDP, ..., ChargeParameterDiscovery
  1091. if (state >= CM_SLAC_PARM_CONF && //by considering 15118(SLAC first)
  1092. state < ChargeParameterDiscoveryRequest &&
  1093. state != IDLE &&
  1094. state != CM_SET_KEY_REQ &&
  1095. state != CM_SET_KEY_CNF &&
  1096. state != CM_VALIDATE_REQ &&
  1097. state != CM_VALIDATE_CNF)
  1098. {
  1099. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  1100. {
  1101. if((ccs->CpState != 2) && (ccs->CpState != 3))
  1102. {
  1103. if (ccs->CpState_err == FALSE)
  1104. {
  1105. SAVE_SYS_LOG_MSG_EVCOMM("[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1106. //CPD: ChargeParameterDiscovery
  1107. }
  1108. ccs->CpState_err = TRUE;
  1109. }
  1110. }
  1111. #else
  1112. {
  1113. #ifdef AWCCS
  1114. if((ccs->CpState != 2) && (ccs->CpState != 3))
  1115. {
  1116. if (ccs->CpState_err == FALSE)
  1117. {
  1118. SAVE_SYS_LOG_MSG_EVCOMM("[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1119. //CPD: ChargeParameterDiscovery
  1120. }
  1121. ccs->CpState_err = TRUE;
  1122. }
  1123. #else
  1124. if(ccs->CpState != 3)
  1125. {
  1126. if (ccs->CpState_err == FALSE)
  1127. {
  1128. SAVE_SYS_LOG_MSG_EVCOMM("[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1129. //CPD: ChargeParameterDiscovery
  1130. }
  1131. ccs->CpState_err = TRUE;
  1132. }
  1133. #endif
  1134. }
  1135. #endif
  1136. }
  1137. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1138. {
  1139. //ChargeParameterDiscovery
  1140. if(state >= ChargeParameterDiscoveryRequest && //35
  1141. state <= ChargeParameterDiscoveryResponse) //36
  1142. {
  1143. if(ccs->CpState != 3)
  1144. {
  1145. if (ccs->CpState_err == FALSE)
  1146. {
  1147. SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CPD");
  1148. //PRC: Precharge
  1149. //CUD: CurrentDemand
  1150. }
  1151. ccs->CpState_err = TRUE;
  1152. }
  1153. }
  1154. //ChargingStatus
  1155. if(state >= ChargingStatusRequest && //43
  1156. state <= ChargingStatusResponse) //44
  1157. {
  1158. if(ccs->CpState != 4 && ccs->CpState != 5)
  1159. {
  1160. if (ccs->CpState_err == FALSE)
  1161. {
  1162. SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CGS");
  1163. //PRC: Precharge
  1164. //CUD: CurrentDemand
  1165. }
  1166. ccs->CpState_err = TRUE;
  1167. }
  1168. }
  1169. }
  1170. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1171. {
  1172. //ChargeParameterDiscovery, CableCheck
  1173. if (state >= ChargeParameterDiscoveryRequest && //35
  1174. state <= CableCheckResponse) //38
  1175. {
  1176. if(ccs->CableCheckPreCountDownDone == FALSE &&
  1177. state >= CableCheckRequest)
  1178. {
  1179. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1180. time_diff = DiffTimeb_fork1_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1181. if(time_diff >= V2G_SECC_CP_Timeout_CableCheck) //2 sec
  1182. {
  1183. sprintf(buf_log_evcomm_fork1,
  1184. "[fork1][CP]check C(4),D(5): ON (%.02lf of %dms)",
  1185. time_diff,
  1186. V2G_SECC_CP_Timeout_CableCheck);
  1187. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
  1188. ccs->CableCheckPreCountDownDone = TRUE;
  1189. }
  1190. }
  1191. if(ccs->CableCheckPreCountDownDone == TRUE)
  1192. {
  1193. if(ccs->CpState != 4 && ccs->CpState != 5)
  1194. {
  1195. if (ccs->CpState_err == FALSE)
  1196. {
  1197. SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CPD and CCK (after CNT)");
  1198. //CPD: ChargeParameterDiscovery
  1199. //CCK: CableCheck
  1200. //CNT: count down
  1201. }
  1202. ccs->CpState_err = TRUE;
  1203. }
  1204. }
  1205. else
  1206. {
  1207. if(ccs->CpState != 3 && ccs->CpState != 4 && ccs->CpState != 5)
  1208. {
  1209. if (ccs->CpState_err == FALSE)
  1210. {
  1211. SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CPD and CCK (before CNT)");
  1212. //CPD: ChargeParameterDiscovery
  1213. //CCK: CableCheck
  1214. //CNT: count down
  1215. }
  1216. ccs->CpState_err = TRUE;
  1217. }
  1218. }
  1219. }
  1220. //Precharge, CurrentDemand
  1221. if(state >= PreChargeRequest && //39
  1222. state <= CurrentDemandResponse) //46
  1223. {
  1224. //if(ccs->CpState != 4 && ccs->CpState != 5)
  1225. if( ccs->CpState <=1)
  1226. {
  1227. if (ccs->CpState_err == FALSE)
  1228. {
  1229. SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]PRC and CUD");
  1230. //PRC: Precharge
  1231. //CUD: CurrentDemand
  1232. }
  1233. ccs->CpState_err = TRUE;
  1234. }
  1235. }
  1236. }
  1237. #endif
  1238. if(ccs->CpState_err == TRUE && ccs->CpState_err_logged == FALSE)
  1239. {
  1240. OutputCpPwmDuty(100);
  1241. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  1242. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1243. //CCS_SECC_CP_State_Error (023889)
  1244. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1245. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1246. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1247. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1248. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1249. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1250. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1251. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1252. sprintf(buf_log_evcomm_fork1, "[fork1][Erorr]CP(%d) Error in state %d(%d)",
  1253. ccs->CpState,
  1254. state,
  1255. ccs->CableCheckPreCountDownDone
  1256. );
  1257. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
  1258. ccs->CpState_err_logged = TRUE;
  1259. }
  1260. return 0;
  1261. }
  1262. /*===========================================================================
  1263. FUNCTION: Check_CP_State_Update_fork1
  1264. DESCRIPTION:
  1265. PRE-CONDITION:
  1266. INPUT:
  1267. OUTPUT:
  1268. GLOBAL VARIABLES:
  1269. =============================================================================*/
  1270. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  1271. void Check_CP_State_Update_fork1(struct ChargingInfoData *ccs)
  1272. {
  1273. //CP Voltage
  1274. /*
  1275. //Issues waiting to debug
  1276. //[CAUTION] This function shall not be used in charging state.
  1277. if (((int)(ccs->CpVoltage * 10)) != ((int)(ccs->CpVoltage_pre * 10)))
  1278. {
  1279. memset(buf, 0, sizeof(buf));
  1280. sprintf(buf, "CP Voltage: %.2lf >> %.2lf (%d >> %d)",
  1281. ccs->CpVoltage_pre,
  1282. ccs->CpVoltage,
  1283. (int)(ccs->CpVoltage_pre * 10),
  1284. (int)(ccs->CpVoltage * 10)
  1285. );
  1286. SAVE_SYS_LOG_MSG_EVCOMM(buf);
  1287. ccs->CpVoltage_pre = ccs->CpVoltage;
  1288. }
  1289. */
  1290. //CP State
  1291. if (ccs->CpState != ccs->CpState_pre)
  1292. {
  1293. sprintf(buf_log_evcomm_fork1, "[fork1]CP State: %d >> %d (%.2fV)",
  1294. ccs->CpState_pre,
  1295. ccs->CpState,
  1296. ccs->CpVoltage
  1297. );
  1298. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
  1299. ccs->CpState_pre = ccs->CpState;
  1300. }
  1301. }
  1302. //#endif
  1303. /*===========================================================================
  1304. FUNCTION: CP_Detection
  1305. DESCRIPTION:
  1306. 1. In order to detect CP in efficient response time, we creat an independent
  1307. thead for this procedure.
  1308. 2. The priority of this thread is set as the same as other tasks.
  1309. 3. fork1
  1310. PRE-CONDITION:
  1311. INPUT:
  1312. OUTPUT:
  1313. GLOBAL VARIABLES:
  1314. =============================================================================*/
  1315. void CP_Detection()
  1316. {
  1317. pid_t tmp = 0;
  1318. // struct timeb StartTime, EndTime;
  1319. unsigned char Statetmp;
  1320. float TotalTmpVolt;
  1321. struct ChargingInfoData *ccs;
  1322. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1323. if(CP_Detection_Pid == 0)
  1324. {
  1325. tmp = fork();
  1326. if(tmp > 0)
  1327. {
  1328. CP_Detection_Pid = tmp;
  1329. #if 1
  1330. unsigned char buf[64];
  1331. memset(buf, 0, sizeof(buf));
  1332. //sprintf(buf, "renice -20 -p %d", tmp);
  1333. sprintf(buf, "renice -10 -p %d", tmp);
  1334. system(buf);
  1335. #endif
  1336. return;
  1337. }
  1338. }
  1339. while(1)
  1340. {
  1341. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  1342. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  1343. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1344. {
  1345. usleep(100000);
  1346. ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
  1347. ccs->CpState = ShmInternalComm->AC_CpPresentState;
  1348. }
  1349. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1350. {
  1351. TotalTmpVolt = ReadAdcVolt(3);
  1352. ccs->CpVoltage = TotalTmpVolt;
  1353. if (ccs->CpVoltage_pre != ccs->CpVoltage)
  1354. {
  1355. ccs->CpVoltage_pre = ccs->CpVoltage;
  1356. }
  1357. //printf("TotalTmpVolt = %.02f\n", TotalTmpVolt);
  1358. //If CP voltage is higer than 13.5V
  1359. if(TotalTmpVolt >= 13.5)
  1360. {
  1361. //Pilot Error
  1362. if((ccs->CpState == 1) &&
  1363. (TotalTmpVolt < 13.75))
  1364. {
  1365. //V_cp = 13.5 ~ 13.75
  1366. Statetmp = 1;
  1367. }
  1368. else
  1369. {
  1370. //V_cp = 13.5 ~
  1371. Statetmp = 8;
  1372. }
  1373. }
  1374. else if((TotalTmpVolt >= 10.5) && (TotalTmpVolt < 13.5)) //V_cp = 10.5 ~ 13.5
  1375. {
  1376. //State A (12V)
  1377. if((ccs->CpState >= 2) &&
  1378. (ccs->CpState <= 3) &&
  1379. (TotalTmpVolt < 10.75))
  1380. {
  1381. if((ccs->CpDuty >= 5) &&
  1382. (ccs->CpDuty < 100))
  1383. {
  1384. Statetmp = 3;
  1385. }
  1386. else
  1387. {
  1388. Statetmp = 2;
  1389. }
  1390. }
  1391. else if((ccs->CpState == 8) &&
  1392. (TotalTmpVolt >= 13.25))
  1393. {
  1394. Statetmp = 8;
  1395. }
  1396. else
  1397. {
  1398. Statetmp = 1;
  1399. }
  1400. }
  1401. else if((TotalTmpVolt >= 7.5) && (TotalTmpVolt < 10.5))
  1402. {
  1403. //State B (9V)
  1404. if((ccs->CpState == 4) && (TotalTmpVolt < 7.75))
  1405. {
  1406. Statetmp = 4;
  1407. }
  1408. else if((ccs->CpState == 1) && (TotalTmpVolt >= 10.25))
  1409. {
  1410. Statetmp = 1;
  1411. }
  1412. else
  1413. {
  1414. if((ccs->CpDuty >= 5) && (ccs->CpDuty < 100))
  1415. {
  1416. Statetmp = 3;
  1417. }
  1418. else
  1419. {
  1420. Statetmp = 2;
  1421. }
  1422. }
  1423. }
  1424. else if((TotalTmpVolt >= 4.5) && (TotalTmpVolt < 7.5))
  1425. {
  1426. //State C (6V)
  1427. if((ccs->CpState == 5) && (TotalTmpVolt < 4.75))
  1428. {
  1429. Statetmp = 5;
  1430. }
  1431. else if((ccs->CpState >= 2) && (ccs->CpState <= 3) && (TotalTmpVolt >= 7.25))
  1432. {
  1433. if((ccs->CpDuty >= 5)&&(ccs->CpDuty < 100))
  1434. {
  1435. Statetmp = 3;
  1436. }
  1437. else
  1438. {
  1439. Statetmp = 2;
  1440. }
  1441. }
  1442. else
  1443. {
  1444. Statetmp = 4;
  1445. }
  1446. }
  1447. else if((TotalTmpVolt >= 1.5) && (TotalTmpVolt < 4.5))
  1448. {
  1449. //State D (3V)
  1450. if((ccs->CpState == 6)&&(TotalTmpVolt < 1.75))
  1451. {
  1452. Statetmp = 6;
  1453. }
  1454. else if((ccs->CpState == 4)&&(TotalTmpVolt >= 4.25))
  1455. {
  1456. Statetmp = 4;
  1457. }
  1458. else
  1459. {
  1460. Statetmp = 5;
  1461. }
  1462. }
  1463. else if((TotalTmpVolt >= -1.5) && (TotalTmpVolt < 1.5)) //V_cp = -1.5V ~ 1.5V
  1464. {
  1465. //State E (0V)
  1466. if((ccs->CpState == 8) &&
  1467. (TotalTmpVolt < -1.25))
  1468. {
  1469. Statetmp = 8;
  1470. }
  1471. else if((ccs->CpState == 5) &&
  1472. (TotalTmpVolt >= 1.25))
  1473. {
  1474. Statetmp = 5;
  1475. }
  1476. else
  1477. {
  1478. Statetmp = 6;
  1479. }
  1480. }
  1481. else if((TotalTmpVolt >= -13.5) && (TotalTmpVolt < -10.5)) //V_cp = -10.5V ~ -13.5V
  1482. {
  1483. //State F (-12V)
  1484. if((ccs->CpState == 8) &&
  1485. (TotalTmpVolt >= -10.75))
  1486. {
  1487. Statetmp = 8;
  1488. }
  1489. else
  1490. {
  1491. Statetmp = 7;
  1492. }
  1493. }
  1494. else
  1495. {
  1496. //null
  1497. }
  1498. ccs->CpState = Statetmp;
  1499. }
  1500. #endif
  1501. Check_CP_State_Update_fork1(ccs);
  1502. #ifndef AWCCS
  1503. Check_CP_State_Error_fork1(ccs);
  1504. #endif
  1505. //Updating Plugin status
  1506. #if (PP_PROTECTION_MECHANISM == ENABLE)
  1507. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) &&
  1508. (ShmInternalComm->CCSConnectorType>0?((EVCOMM_SYS_INFO.PpVoltage > 1.2)&&(EVCOMM_SYS_INFO.PpVoltage <= 2.4)):((EVCOMM_SYS_INFO.PpVoltage > 0.61)&&(EVCOMM_SYS_INFO.PpVoltage <= 1.185)))
  1509. )
  1510. #else
  1511. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
  1512. #endif
  1513. {
  1514. ccs->ConnectorPlugIn_new = TRUE;
  1515. }
  1516. else
  1517. {
  1518. ccs->ConnectorPlugIn_new = FALSE;
  1519. OutputCpPwmDuty(100);
  1520. }
  1521. Check_Plugin_Status_Update_fork1(ccs);
  1522. //ftime(&EndTime);
  1523. //DEBUG_PRINTF_EVCOMM_DETAIL("duration:%.02lf\n", DiffTimeb(StartTime, EndTime));
  1524. }//while
  1525. }
  1526. /*===========================================================================
  1527. FUNCTION: PP_Detection
  1528. DESCRIPTION:
  1529. 0. SeccComm fork3
  1530. 1. In order to detect CP in efficient response time, we creat an independent
  1531. thead for this procedure.
  1532. 2. The priority of this thread is set as the same as other tasks.
  1533. PRE-CONDITION:
  1534. INPUT:
  1535. OUTPUT:
  1536. GLOBAL VARIABLES:
  1537. =============================================================================*/
  1538. void PP_Detection()
  1539. {
  1540. pid_t tmp = 0;
  1541. // struct timeb StartTime, EndTime;
  1542. unsigned char Statetmp;
  1543. float TotalTmpVolt;
  1544. if(PP_Detection_Pid == 0)
  1545. {
  1546. tmp = fork();
  1547. if(tmp > 0)
  1548. {
  1549. PP_Detection_Pid = tmp;
  1550. #if 0
  1551. unsigned char buf[64];
  1552. memset(buf, 0, sizeof(buf));
  1553. sprintf(buf, "renice -10 -p %d", tmp);
  1554. system(buf);
  1555. #endif
  1556. return;
  1557. }
  1558. }
  1559. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1560. while(1)
  1561. {
  1562. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1563. EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
  1564. if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
  1565. {
  1566. if((( (ShmInternalComm->CCSConnectorType>0?((EVCOMM_SYS_INFO.PpVoltage > 1.2)&&(EVCOMM_SYS_INFO.PpVoltage <= 2.4)):((EVCOMM_SYS_INFO.PpVoltage > 0.61)&&(EVCOMM_SYS_INFO.PpVoltage <= 1.185))))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn==FALSE))
  1567. ||(( (ShmInternalComm->CCSConnectorType>0?((EVCOMM_SYS_INFO.PpVoltage <= 1.2)||(EVCOMM_SYS_INFO.PpVoltage > 2.4)):((EVCOMM_SYS_INFO.PpVoltage <= 0.61)||(EVCOMM_SYS_INFO.PpVoltage > 1.185))))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn==TRUE)))
  1568. {
  1569. // plug-in : CCS1 (0.61 < V <1.185), CCS2 (1.2 < V <2.4)
  1570. sprintf(buf_log_evcomm_fork3,
  1571. "[fork3]PP(%.2f >> %.2fV)",
  1572. EVCOMM_SYS_INFO.PpVoltage_pre,
  1573. EVCOMM_SYS_INFO.PpVoltage
  1574. );
  1575. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork3);
  1576. EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
  1577. }
  1578. }
  1579. #if 0
  1580. sleep(5);
  1581. printf("V_pp = %.02f\n", TotalTmpVolt);
  1582. #endif
  1583. }//while
  1584. }
  1585. /*===========================================================================
  1586. FUNCTION: Error_Monitor
  1587. DESCRIPTION:
  1588. 1. This function only works in SeccComm fork2.
  1589. PRE-CONDITION:
  1590. INPUT:
  1591. OUTPUT:
  1592. GLOBAL VARIABLES:
  1593. =============================================================================*/
  1594. void Error_Monitor()
  1595. {
  1596. pid_t tmp = 0;
  1597. double time_diff = 0;
  1598. unsigned char status = 0;
  1599. struct ChargingInfoData *ccs;
  1600. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1601. if(Error_Monitor_Pid == 0)
  1602. {
  1603. tmp = fork(); //SeccComm fork2
  1604. if(tmp > 0)
  1605. {
  1606. Error_Monitor_Pid = tmp;
  1607. #if 0
  1608. unsigned char buf[64];
  1609. memset(buf, 0, sizeof(buf));
  1610. sprintf(buf, "renice -20 -p %d", tmp);
  1611. system(buf);
  1612. #endif
  1613. return;
  1614. }
  1615. }
  1616. while(1)
  1617. {
  1618. //Step 0
  1619. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  1620. {
  1621. //If the End_Process is in processing, disable Error_Monitor.
  1622. continue;
  1623. }
  1624. //Step1 1: Check and Response to Plugin Status
  1625. if(CheckConnectorPlugIn() == FALSE)
  1626. {
  1627. status = Check_V2G_Flow_Status();
  1628. if (status > IDLE &&
  1629. status < Performance_Timeout &&
  1630. status != CM_SET_KEY_REQ &&
  1631. status != CM_SET_KEY_CNF &&
  1632. EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  1633. {
  1634. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1635. //SAVE_SYS_LOG_MSG_EVCOMM("[fork2] Emergency Stop (due to Connector is plugged out during communication.)");
  1636. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Plug out Error => End_Process");
  1637. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1638. //CCS_SECC_CP_State_Error (023889)
  1639. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1640. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1641. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1642. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1643. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1644. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1645. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1646. End_Process();
  1647. #else
  1648. //SAVE_SYS_LOG_MSG_EVCOMM("CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped" );
  1649. #endif
  1650. }
  1651. }
  1652. //Step 2: Check for V2G_SECC_Sequence_Timeout
  1653. //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  1654. #if 1
  1655. status = Check_V2G_Flow_Status();
  1656. if (status >= SupportedAppProtocolRequest &&
  1657. status < SessionStopRequest)
  1658. {
  1659. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1660. time_diff = DiffTimeb_fork2_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1661. if(time_diff > V2G_SECC_Sequence_Timeout) //60s
  1662. {
  1663. sprintf(buf_log_evcomm_fork2,
  1664. "[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n",
  1665. status,
  1666. time_diff,
  1667. V2G_SECC_Sequence_Timeout);
  1668. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1669. Update_V2G_Flow_Status(Sequence_Timeout);
  1670. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1671. //CCS_SECC_TIMEOUT_V2G_Sequence_Time (023844)
  1672. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1673. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1674. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1675. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1676. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  1677. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  1678. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1679. End_Process();
  1680. break;
  1681. }
  1682. else if (time_diff > 4000) //4s
  1683. {
  1684. //Check for CSU command of "Stop by EVSE"
  1685. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown)
  1686. {
  1687. SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]EVSE_Shutdown");
  1688. Update_V2G_Flow_Status(Other_Fault);
  1689. }
  1690. else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1691. {
  1692. SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]EVSE_EmergencyShutdown");
  1693. Update_V2G_Flow_Status(Other_Fault);
  1694. }
  1695. else if (ShmInternalComm->ChargingPermission == FALSE)
  1696. {
  1697. if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
  1698. {
  1699. SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]ChargingPermission = FALSE");
  1700. Update_V2G_Flow_Status(Other_Fault);
  1701. }
  1702. }
  1703. else
  1704. {
  1705. //null
  1706. }
  1707. }
  1708. else
  1709. {
  1710. //null
  1711. }
  1712. }
  1713. #endif
  1714. //Step 3: Check and Response to Error V2gFlowStatus
  1715. status = Check_V2G_Flow_Status();
  1716. if (status == Performance_Timeout ||
  1717. status == Sequence_Timeout ||
  1718. status == Other_Fault)
  1719. {
  1720. sprintf(buf_log_evcomm_fork2,
  1721. "[fork2]Timeout or Fault State(%d) => End_Process",
  1722. status);
  1723. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1724. //Normal Stop
  1725. //alarm and duty to 100%
  1726. //OutputCpPwmDuty(100);
  1727. //SwitchCpStateE(ENABLE); //Set CP duty as 100% and set CP state as E (0V).
  1728. //[Joseph/ To-Do] Set State E (0V) via GPIO setting
  1729. End_Process();
  1730. }
  1731. //Step 4: Check and Response to CP State Error
  1732. if(ccs->CpState_err == TRUE)
  1733. {
  1734. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]CP Error => End_Process");
  1735. Update_V2G_Flow_Status(Other_Fault);
  1736. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1737. //CCS_SECC_CP_State_Error (023889)
  1738. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1739. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1740. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1741. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1742. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1743. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1744. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1745. End_Process();
  1746. }
  1747. //Step 5: Check and Response to Shutdown Commnad from CSU
  1748. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown ||
  1749. EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1750. {
  1751. if (Check_V2G_Flow_Status() <= SLACC_SDP_TCP_Connection)
  1752. {
  1753. sprintf(buf_log_evcomm_fork2,
  1754. "[fork2]EVSE Shutdown(%d) => End_Process",
  1755. EVCOMM_SYS_INFO.DC_EVSEStatus);
  1756. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1757. Update_V2G_Flow_Status(Other_Fault);
  1758. End_Process();
  1759. }
  1760. }
  1761. //Step 6: Check and Response to SessionStop
  1762. status = Check_V2G_Flow_Status();
  1763. if (status == SessionStopResponse)
  1764. {
  1765. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]SessionStopResponse => End_Process");
  1766. End_Process();
  1767. }
  1768. //Step 7: Check for ChargingPermission from TRUE to FALSE before V2G Messages
  1769. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  1770. if ((ShmInternalComm->ChargingPermission == FALSE) &&
  1771. (ShmInternalComm->ChargingPermission_pre >=1) &&
  1772. (ccs->CpState >= 3) && (ccs->CpState <=5))
  1773. {
  1774. if (status >= CM_SLAC_PARM_REQ &&
  1775. status != CM_SET_KEY_REQ &&
  1776. status != CM_SET_KEY_CNF &&
  1777. status <= SLACC_SDP_TCP_Connection)
  1778. {
  1779. sprintf(buf_log_evcomm_fork2,
  1780. "[fork2]Permission OFF before V2G msg(%d) => End_Process",
  1781. ShmInternalComm->ChargingPermission);
  1782. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1783. Update_V2G_Flow_Status(Other_Fault);
  1784. End_Process();
  1785. }
  1786. }
  1787. #if 0
  1788. //Step 8: DC OVP Protection
  1789. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1790. status > CableCheckResponse &&
  1791. status <= SessionStopRequest &&
  1792. status != ChargingStatusRequest &&
  1793. status != ChargingStatusResponse &&
  1794. EVCOMM_SYS_INFO.EvBatteryMaxVoltage != 0)
  1795. {
  1796. //Part A: OVP Protection
  1797. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)) // 2%
  1798. {
  1799. sprintf(buf_log_evcomm_fork2,
  1800. "[fork2][Error]OVP => End_Process (%.02f > %.02f)",
  1801. EVCOMM_SYS_INFO.PresentChargingVoltage,
  1802. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
  1803. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1804. Update_V2G_Flow_Status(Other_Fault);
  1805. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1806. //System CCS output OVP (012219)
  1807. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1808. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1809. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1810. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1811. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1812. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1813. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1814. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1815. End_Process();
  1816. }
  1817. //Part B: Over Voltage Request Protection
  1818. if (EVCOMM_SYS_INFO.EvBatterytargetVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02))
  1819. {
  1820. sprintf(buf_log_evcomm_fork2,
  1821. "[fork2]Over V Req => End_Process (%.02f > %.02f)",
  1822. EVCOMM_SYS_INFO.EvBatterytargetVoltage,
  1823. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)
  1824. );
  1825. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1826. Update_V2G_Flow_Status(Other_Fault);
  1827. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1828. //System CCS output OVP (012219)
  1829. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1830. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1831. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1832. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1833. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1834. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1835. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1836. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1837. End_Process();
  1838. }
  1839. }
  1840. #endif
  1841. #if 1
  1842. //Step 9: Check 60V
  1843. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  1844. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1845. ShmInternalComm->ChargingPermission >=1 &&
  1846. status < CableCheckRequest)
  1847. {
  1848. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= 60) //60V
  1849. {
  1850. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]DC Output Voltage is over 60V => End_Process");
  1851. Update_V2G_Flow_Status(Other_Fault);
  1852. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1853. //CCS_SECC_Unexpected_60V_Before_Charing_Error (023890)
  1854. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1855. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1856. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1857. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1858. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  1859. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  1860. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1861. //Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1862. End_Process();
  1863. }
  1864. }
  1865. #endif
  1866. //Step 10: Check if the connector is unplug from plugin
  1867. if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
  1868. {
  1869. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Unplug Reset => End_Process");
  1870. Update_V2G_Flow_Status(Other_Fault);
  1871. End_Process();
  1872. }
  1873. usleep(100000);
  1874. }//while
  1875. }
  1876. /*===========================================================================
  1877. FUNCTION: SendSetKey
  1878. DESCRIPTION:
  1879. PRE-CONDITION:
  1880. INPUT:
  1881. OUTPUT:
  1882. GLOBAL VARIABLES:
  1883. =============================================================================*/
  1884. int SendSetKey()
  1885. {
  1886. int i = 0;
  1887. unsigned char nRandValue = 0x0;
  1888. unsigned char ConstString[16] = "PhihongKey000000";
  1889. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1890. memcpy(SendMmePacket.ODA,QcaMac,6);
  1891. memcpy(SendMmePacket.OSA,CsuMac,6);
  1892. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  1893. SendMmePacket.MMV = 0x01;
  1894. SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
  1895. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  1896. SendMmePacketSize = 0;
  1897. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
  1898. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  1899. SendMmePacketSize+=4;
  1900. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  1901. SendMmePacketSize+=4;
  1902. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
  1903. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  1904. SendMmePacketSize+=2;
  1905. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
  1906. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//CCo Capablility
  1907. srand(time(NULL));
  1908. for (i = 10; i < 16; i++)
  1909. {
  1910. nRandValue = (rand()%62) + 1;
  1911. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  1912. {
  1913. ConstString[i]= nRandValue + 0x30;
  1914. }
  1915. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  1916. {
  1917. ConstString[i]= nRandValue -10 + 0x41;
  1918. }
  1919. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  1920. {
  1921. ConstString[i]= nRandValue -37 + 0x61;
  1922. }
  1923. else
  1924. {
  1925. ConstString[i]= 0x30;
  1926. }
  1927. }
  1928. memset(NewNmkKey,0,sizeof(NewNmkKey));
  1929. memset(Nid,0,sizeof(Nid));
  1930. HPAVKeyNMK(NewNmkKey, ConstString);
  1931. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  1932. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
  1933. SendMmePacketSize+=sizeof(Nid);
  1934. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
  1935. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  1936. SendMmePacketSize += sizeof(NewNmkKey);
  1937. SendMmePacketSize += 19; //the size before MMENTRY
  1938. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Tx]CM_SET_KEY_REQ");
  1939. i = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1940. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  1941. DEBUG_PRINTF_EVCOMM_DETAIL("SendSetKey: send size =%d\n",i);
  1942. }
  1943. /*===========================================================================
  1944. FUNCTION: GetQca7kMac
  1945. DESCRIPTION:
  1946. PRE-CONDITION:
  1947. INPUT:
  1948. OUTPUT:
  1949. GLOBAL VARIABLES:
  1950. =============================================================================*/
  1951. int GetQca7kMac()
  1952. {
  1953. int i = 0;
  1954. struct QcaVendorMmeHeader SendPacket;
  1955. memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
  1956. memset(SendPacket.ODA, 0xFF, 6); //broadcast
  1957. memcpy(SendPacket.OSA, CsuMac, 6);
  1958. SendPacket.MTYPE = htons(EtherType_HomePlug);
  1959. SendPacket.MMV = 0x00;
  1960. SendPacket.MMTYPE = MMTYPE_VENDOR_VS_NW_INFO;
  1961. SendPacket.OUI[0] = 0x00;
  1962. SendPacket.OUI[1] = 0xB0;
  1963. SendPacket.OUI[2] = 0x52;
  1964. i = sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1965. DEBUG_PRINTF_EVCOMM_DETAIL("GetQca7kMac: send size =%d\n", i);
  1966. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Tx][VENDOR_VS_NW_INFO]Req for QCA7K MacAddr");
  1967. }
  1968. /*===========================================================================
  1969. FUNCTION: Array_Check_All_Zero
  1970. DESCRIPTION:
  1971. PRE-CONDITION:
  1972. INPUT:
  1973. OUTPUT:
  1974. result:
  1975. (1) TRUE: all zero
  1976. (2) FALSE: not all zero
  1977. GLOBAL VARIABLES:
  1978. =============================================================================*/
  1979. int Array_Check_All_Zero(unsigned char *ptr, int size)
  1980. {
  1981. int result = TRUE;
  1982. int i = 0;
  1983. for (i = 0; i < size; i++)
  1984. {
  1985. if (ptr[i] != 0)
  1986. {
  1987. result = FALSE;
  1988. break;
  1989. }
  1990. }
  1991. return result;
  1992. }
  1993. /*===========================================================================
  1994. FUNCTION: Array_Compare_Identity
  1995. DESCRIPTION:
  1996. PRE-CONDITION:
  1997. INPUT:
  1998. OUTPUT:
  1999. result = FALSE (not identical)
  2000. result = TRUE (identical)
  2001. GLOBAL VARIABLES:
  2002. =============================================================================*/
  2003. int Array_Compare_Identity(unsigned char *ptrA, unsigned char *ptrB, int size)
  2004. {
  2005. int result = TRUE;
  2006. int i = 0;
  2007. for (i = 0; i < size; i++)
  2008. {
  2009. if (ptrA[i] != ptrB[i])
  2010. {
  2011. result = FALSE;
  2012. #if 0
  2013. sprintf(buf_log_evcomm,
  2014. "[Array_Compare_Identity]%02X%02X%02X%02X%02X%02X,%02X%02X%02X%02X%02X%02X(%d)\n",
  2015. ptrA[0], ptrA[1], ptrA[2], ptrA[3], ptrA[4], ptrA[5],
  2016. ptrB[0], ptrB[1], ptrB[2], ptrB[3], ptrB[4], ptrB[5],
  2017. result);
  2018. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2019. #endif
  2020. break;
  2021. }
  2022. }
  2023. return result;
  2024. }
  2025. /*===========================================================================
  2026. FUNCTION: SLAC_DB_Search_EvMac_idx
  2027. DESCRIPTION:
  2028. PRE-CONDITION:
  2029. INPUT:
  2030. OUTPUT:
  2031. idx = -1 (not found)
  2032. GLOBAL VARIABLES:
  2033. =============================================================================*/
  2034. int SLAC_DB_Search_EvMac_idx(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in)
  2035. {
  2036. int idx = -1;
  2037. int i = 0;
  2038. if (evcc->arrayLen == 0)
  2039. {
  2040. //printf("[SLAC_DB_Search_EvMac_idx]arrayLen is empty (%d)\n", evcc->arrayLen);
  2041. //no need to search
  2042. }
  2043. else if (evcc->arrayLen > EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE)
  2044. {
  2045. //error
  2046. sprintf(buf_log_evcomm,
  2047. "[ERROR][SLAC_DB_Search_EvMac_idx]DB length(%d) > %d",
  2048. evcc->arrayLen,
  2049. EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
  2050. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2051. evcc->arrayLen = 0; //reset
  2052. }
  2053. else
  2054. {
  2055. //start searching
  2056. for (i = 0; i < evcc->arrayLen; i++)
  2057. {
  2058. //printf("[SLAC_DB_Search_EvMac_idx]checking DB[%d]...\n", i);
  2059. if (Array_Compare_Identity(evcc->array[i].EvMac, EvMac_in, SLAC_EVMAC_LENGTH) == TRUE)
  2060. {
  2061. //printf("[SLAC_DB_Search_EvMac_idx]identical at DB[%d]...\n", i);
  2062. idx = i;
  2063. break;
  2064. }
  2065. }
  2066. }
  2067. //printf("[SLAC_DB_Search_EvMac_idx]return = %d\n", idx);
  2068. return idx;
  2069. }
  2070. /*===========================================================================
  2071. FUNCTION: SLAC_DB_Check_EvMac_RunID_Matching
  2072. DESCRIPTION:
  2073. PRE-CONDITION:
  2074. INPUT:
  2075. OUTPUT:
  2076. res = FALSE (unmatched)
  2077. res = TRUE (matched)
  2078. GLOBAL VARIABLES:
  2079. =============================================================================*/
  2080. int SLAC_DB_Check_EvMac_RunID_Matching(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in, unsigned char *RunID_in)
  2081. {
  2082. int res = FALSE;
  2083. int idx = -1;
  2084. idx = SLAC_DB_Search_EvMac_idx(evcc, EvMac_in);
  2085. if (idx >= 0)
  2086. {
  2087. res = Array_Compare_Identity(evcc->array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2088. }
  2089. else
  2090. {
  2091. //not found the EvMac data in DB
  2092. res = FALSE;
  2093. }
  2094. return res;
  2095. }
  2096. /*===========================================================================
  2097. FUNCTION: SLAC_DB_Add
  2098. DESCRIPTION:
  2099. 1. Saving each CM_SLAC_PARM_REQ data into EVCC database if its
  2100. EvMac and RunID data are different, respectively.
  2101. PRE-CONDITION:
  2102. INPUT:
  2103. OUTPUT:
  2104. idx = saved index (must be a positive value)
  2105. GLOBAL VARIABLES:
  2106. =============================================================================*/
  2107. int SLAC_DB_Add(unsigned char *EvMac_in, unsigned char *RunID_in)
  2108. {
  2109. int idx = -1;
  2110. //Search if this EvMac and RunID already exists
  2111. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2112. if (idx < 0) //not exist, yet.
  2113. {
  2114. if (SLAC_INFO.arrayLen < EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE) //20
  2115. {
  2116. sprintf(buf_log_evcomm,
  2117. "[SLAC_DB_Add]data does not exist => added to %d-th",
  2118. SLAC_INFO.arrayLen);
  2119. DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
  2120. if (SLAC_INFO.arrayLen >= 0)
  2121. {
  2122. memset(&SLAC_INFO.array[SLAC_INFO.arrayLen], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2123. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2124. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2125. idx = SLAC_INFO.arrayLen;
  2126. SLAC_INFO.arrayLen++;
  2127. }
  2128. else
  2129. {
  2130. sprintf(buf_log_evcomm,
  2131. "[ERROR][SLAC_DB_Add]arrayLen: unexpected(%d)",
  2132. SLAC_INFO.arrayLen);
  2133. DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
  2134. SLAC_INFO.arrayLen = 0;
  2135. }
  2136. }
  2137. else
  2138. {
  2139. //DB is full
  2140. sprintf(buf_log_evcomm,
  2141. "[SLAC_DB_Add]DB is full(%d) => bypass",
  2142. SLAC_INFO.arrayLen);
  2143. DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
  2144. }
  2145. }
  2146. else
  2147. {
  2148. #if 0
  2149. sprintf(buf_log_evcomm,
  2150. "[SLAC_DB_Add]EvMac: existed (%d)",
  2151. idx);
  2152. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2153. #endif
  2154. //Check RunID
  2155. if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
  2156. {
  2157. //RunID is the same
  2158. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Add]RunID: same");
  2159. }
  2160. else
  2161. {
  2162. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Add]RunID: diff");
  2163. }
  2164. //Reset all corresponding parameters
  2165. #if 0
  2166. sprintf(buf_log_evcomm,
  2167. "[SLAC_DB_Add]EvMac: reset para(%d)",
  2168. idx);
  2169. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2170. #endif
  2171. memset(&SLAC_INFO.array[idx], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2172. memcpy(SLAC_INFO.array[idx].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2173. memcpy(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2174. }
  2175. return idx;
  2176. }
  2177. /*===========================================================================
  2178. FUNCTION: SLAC_DB_Reset
  2179. DESCRIPTION:
  2180. PRE-CONDITION:
  2181. INPUT:
  2182. OUTPUT:
  2183. GLOBAL VARIABLES:
  2184. =============================================================================*/
  2185. int SLAC_DB_Reset()
  2186. {
  2187. memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
  2188. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Reset]DONE");
  2189. }
  2190. /*===========================================================================
  2191. FUNCTION: MmeProcess
  2192. DESCRIPTION:
  2193. PRE-CONDITION:
  2194. INPUT:
  2195. OUTPUT:
  2196. GLOBAL VARIABLES:
  2197. =============================================================================*/
  2198. int MmeProcess(unsigned char *Buffer, int DataLength)
  2199. {
  2200. //struct ethhdr *EthPacket;
  2201. struct MmeHeader *MmePacket;
  2202. static unsigned char counter;
  2203. unsigned char state = 0;
  2204. unsigned char *EvMac_in;
  2205. unsigned char *RunID_in;
  2206. int Rtn = 0;
  2207. int idx = 0;
  2208. MmePacket = (struct MmeHeader *)Buffer;
  2209. state = Check_V2G_Flow_Status();
  2210. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2211. {
  2212. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  2213. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received MME Packet *****\n");
  2214. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2215. DEBUG_PRINTF_EVCOMM_DETAIL("DataLength=%d\n",DataLength);
  2216. DEBUG_PRINTF_EVCOMM_DETAIL("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Destination MAC Address
  2217. MmePacket->ODA[0], MmePacket->ODA[1],
  2218. MmePacket->ODA[2], MmePacket->ODA[3],
  2219. MmePacket->ODA[4], MmePacket->ODA[5]);
  2220. DEBUG_PRINTF_EVCOMM_DETAIL("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Source MAC Address (EV MAC)
  2221. MmePacket->OSA[0], MmePacket->OSA[1],
  2222. MmePacket->OSA[2], MmePacket->OSA[3],
  2223. MmePacket->OSA[4], MmePacket->OSA[5]);
  2224. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  2225. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", MmePacket->MMV);
  2226. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  2227. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n",
  2228. MmePacket->FMI[0],MmePacket->FMI[1]);
  2229. }
  2230. #endif
  2231. #if (SLAC_FIRST_RESPONSE_METHOD == SET_NO_PWM_IF_NOT_GET_PERMISSION)
  2232. {
  2233. //Check CP as 5%
  2234. if (EVCOMM_SYS_INFO.CpState != 3 &&
  2235. EVCOMM_SYS_INFO.CpState != 4 &&
  2236. MmePacket->MMTYPE != MMTYPE_CM_SET_KEY_CNF &&
  2237. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_HOST_ACTION &&
  2238. MmePacket->MMTYPE != MMTYPE_VENDOR_ATTEN_CHAR &&
  2239. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_NW_INFO_CNF
  2240. )
  2241. {
  2242. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC]ignored(wrong CP state)");
  2243. return 0;
  2244. }
  2245. }
  2246. #endif
  2247. //[To-Do] Adding a pre-check filter mechanism for Source and Destination MAC Address
  2248. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  2249. switch(MmePacket->MMTYPE)
  2250. {
  2251. case MMTYPE_CM_SET_KEY_CNF:
  2252. {
  2253. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  2254. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  2255. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Rx]CM_SET_KEY_CNF (SetKey: DONE)");
  2256. Update_V2G_Flow_Status(CM_SET_KEY_CNF);
  2257. break;
  2258. }
  2259. case MMTYPE_CM_SLAC_PARM_REQ:
  2260. {
  2261. //Check QCA7000 status
  2262. if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  2263. {
  2264. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(QCA7K init...)");
  2265. break;
  2266. }
  2267. //Check error state
  2268. state = Check_V2G_Flow_Status();
  2269. if (state == Performance_Timeout || //253
  2270. state == Sequence_Timeout || //254
  2271. state == Other_Fault) //255
  2272. {
  2273. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(in error state)");
  2274. break;
  2275. }
  2276. //Printing EV MAC Address
  2277. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ");
  2278. //Avoid Coupled SLAC_PARM_REQ
  2279. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2280. {
  2281. #if 0
  2282. sprintf(buf_log_evcomm,
  2283. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)",
  2284. CheckConnectorPlugIn());
  2285. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2286. #endif
  2287. break;
  2288. }
  2289. //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
  2290. if (MmePacket->MMENTRY[1] != 0)
  2291. {
  2292. sprintf(buf_log_evcomm,
  2293. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)", //Source MAC Address (EV MAC)
  2294. MmePacket->MMENTRY[1]);
  2295. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2296. break;
  2297. }
  2298. //=================== Legal CM_SLAC_PARM_REQ Zone =================
  2299. Update_V2G_Flow_Status(CM_SLAC_PARM_REQ);
  2300. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_RX_CM_SLAC_PARM_REQ)
  2301. {
  2302. //Once receiving CM_SLAC_PARM_REQ, set PWM as 5%
  2303. SwitchCpStateE(DISABLE);
  2304. OutputCpPwmDuty(5);
  2305. }
  2306. #endif
  2307. //Checking if this SLAC Req comes before 5% PWM (for 15118)
  2308. if(ShmInternalComm->ChargingPermission == FALSE)
  2309. {
  2310. //Sniffer_Tcpdump(ENABLE);
  2311. sprintf(buf_log_evcomm, "Check Permission: %d (SLAC first => START)", ShmInternalComm->ChargingPermission);
  2312. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2313. }
  2314. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2315. {
  2316. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  2317. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2318. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2319. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2320. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2321. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2322. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2323. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2324. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  2325. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuite [1]: 0x%x,0x%x\n",
  2326. MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  2327. }
  2328. #endif
  2329. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2330. {
  2331. //Saving each CM_SLAC_PARM_REQ data into EVCC database
  2332. EvMac_in = &MmePacket->OSA[0];
  2333. RunID_in = &MmePacket->MMENTRY[2];
  2334. idx = SLAC_DB_Add(EvMac_in, RunID_in); //(EvMac, RunID)
  2335. if (idx < 0)
  2336. {
  2337. sprintf(buf_log_evcomm,
  2338. "[WARNING][CM_SLAC_PARM_REQ]DB is full or errors occour(%d) => ignore",
  2339. idx);
  2340. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2341. break;
  2342. }
  2343. //Select the 1st EV MAC address
  2344. if (SLAC_INFO.arrayLen == 1) //1st Req
  2345. {
  2346. #if 1
  2347. sprintf(buf_log_evcomm,
  2348. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):selected",
  2349. (idx + 1),
  2350. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2351. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2352. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2353. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2354. #endif
  2355. /*
  2356. sprintf(buf_log_evcomm,
  2357. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (selected)", //Source MAC Address (EV MAC)
  2358. SLAC_INFO.arrayLen,
  2359. MmePacket->OSA[0], MmePacket->OSA[1],
  2360. MmePacket->OSA[2], MmePacket->OSA[3],
  2361. MmePacket->OSA[4], MmePacket->OSA[5]);
  2362. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2363. sprintf(buf_log_evcomm,
  2364. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (selected)", //RunID (from EVCC)
  2365. SLAC_INFO.arrayLen,
  2366. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2367. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2368. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2369. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2370. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2371. */
  2372. }
  2373. else //2nd Req
  2374. {
  2375. #if 1
  2376. sprintf(buf_log_evcomm,
  2377. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):not selected",
  2378. (idx + 1),
  2379. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2380. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2381. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2382. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2383. #endif
  2384. /*
  2385. sprintf(buf_log_evcomm,
  2386. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (not selected)", //Source MAC Address (EV MAC)
  2387. SLAC_INFO.arrayLen,
  2388. MmePacket->OSA[0], MmePacket->OSA[1],
  2389. MmePacket->OSA[2], MmePacket->OSA[3],
  2390. MmePacket->OSA[4], MmePacket->OSA[5]);
  2391. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2392. sprintf(buf_log_evcomm,
  2393. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (not selected)", //RunID (from EVCC)
  2394. SLAC_INFO.arrayLen,
  2395. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2396. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2397. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2398. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2399. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2400. */
  2401. }
  2402. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2403. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
  2404. memcpy(SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
  2405. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2406. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2407. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2408. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2409. SendMmePacket.MMV = MmePacket->MMV;
  2410. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2411. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2412. SendMmePacketSize = 0;
  2413. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2414. SendMmePacketSize += 6;
  2415. SendMmePacket.MMENTRY[SendMmePacketSize++] = C_EV_match_MNBC; //NUM_SOUNDS(0x0A): Number of M-Sounds to be transmitted by the EV GP Station during the SLAC process
  2416. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2417. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01; //RESP_TYPE(0x01): Fixed value indicating Other GP station, 0x00 V HLE of the STA, 0x01 V Another GP STA, 0x02 V 0xFF V Reserved
  2418. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2419. SendMmePacketSize += 6;
  2420. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2421. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2422. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
  2423. SendMmePacketSize += SLAC_RUNID_LENGTH;
  2424. SendMmePacketSize += 19; //the size before MMENTRY
  2425. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2426. {
  2427. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2428. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2429. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2430. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2431. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2432. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2433. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2434. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2435. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2436. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2437. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2438. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2439. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2440. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2441. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2442. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2443. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2444. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2445. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2446. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2447. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2448. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2449. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2450. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2451. }
  2452. #endif
  2453. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2454. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2455. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2456. ftime(&SeqStartTime);
  2457. break;
  2458. }
  2459. #else
  2460. {
  2461. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2462. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, sizeof(EvMac));
  2463. memcpy(SlacRunId,MmePacket->MMENTRY + 2, sizeof(SlacRunId));
  2464. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2465. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2466. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2467. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2468. SendMmePacket.MMV = MmePacket->MMV;
  2469. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2470. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2471. SendMmePacketSize = 0;
  2472. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2473. SendMmePacketSize += 6;
  2474. SendMmePacket.MMENTRY[SendMmePacketSize++] = C_EV_match_MNBC; //NUM_SOUNDS(0x0A): Number of M-Sounds to be transmitted by the EV GP Station during the SLAC process
  2475. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2476. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01; //RESP_TYPE(0x01): Fixed value indicating Other GP station, 0x00 V HLE of the STA, 0x01 V Another GP STA, 0x02 V 0xFF V Reserved
  2477. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2478. SendMmePacketSize += 6;
  2479. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2480. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2481. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, sizeof(SlacRunId)); //RunID (8-byte)
  2482. SendMmePacketSize += sizeof(SlacRunId);
  2483. SendMmePacketSize += 19; //the size before MMENTRY
  2484. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2485. {
  2486. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2487. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2488. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2489. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2490. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2491. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2492. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2493. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2494. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2495. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2496. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2497. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2498. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2499. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2500. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2501. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2502. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2503. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2504. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2505. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2506. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2507. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2508. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2509. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2510. }
  2511. #endif
  2512. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2513. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2514. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2515. ftime(&SeqStartTime);
  2516. counter = 0;
  2517. break;
  2518. }
  2519. #endif
  2520. }
  2521. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  2522. {
  2523. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2524. {
  2525. SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(timeup)");
  2526. break;
  2527. }
  2528. //Avoid Coupled CM_START_ATTEN_CHAR_IND
  2529. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2530. {
  2531. sprintf(buf_log_evcomm,
  2532. "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)",
  2533. CheckConnectorPlugIn());
  2534. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2535. break;
  2536. }
  2537. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2538. {
  2539. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter + 1);
  2540. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2541. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2542. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  2543. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  2544. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating other Green PHY station
  2545. DEBUG_PRINTF_EVCOMM_DETAIL("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2546. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  2547. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  2548. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2549. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  2550. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  2551. }
  2552. #endif
  2553. //New SLAC architecture designed by Joseph
  2554. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2555. {
  2556. EvMac_in = &MmePacket->OSA[0];
  2557. RunID_in = &MmePacket->MMENTRY[11];
  2558. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2559. if (idx >= 0)
  2560. {
  2561. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2562. //[TC_SECC_VTB_AttenuationCharacterization_013]
  2563. if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  2564. {
  2565. sprintf(buf_log_evcomm,
  2566. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req",
  2567. MmePacket->MMENTRY[0]);
  2568. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2569. break;
  2570. }
  2571. //[TC_SECC_VTB_AttenuationCharacterization_014]
  2572. if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
  2573. {
  2574. sprintf(buf_log_evcomm,
  2575. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req",
  2576. MmePacket->MMENTRY[1]);
  2577. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2578. break;
  2579. }
  2580. //[TC_SECC_VTB_AttenuationCharacterization_016]
  2581. if (MmePacket->MMENTRY[3] != 0x06) //Time_Out must be 0x06 , (600ms)
  2582. {
  2583. sprintf(buf_log_evcomm,
  2584. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]Time_Out(%d): invalid => ignore Req",
  2585. MmePacket->MMENTRY[3]);
  2586. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2587. break;
  2588. }
  2589. //[TC_SECC_VTB_AttenuationCharacterization_017]
  2590. if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
  2591. {
  2592. sprintf(buf_log_evcomm,
  2593. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req",
  2594. MmePacket->MMENTRY[4]);
  2595. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2596. break;
  2597. }
  2598. //[TC_SECC_VTB_AttenuationCharacterization_021]
  2599. //FORWARDING_STA: MAC Address of the EV HLE (station which the measurement results shall be sent to)
  2600. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[5], SLAC_EVMAC_LENGTH) == FALSE)
  2601. {
  2602. sprintf(buf_log_evcomm,
  2603. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req",
  2604. MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
  2605. MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
  2606. MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
  2607. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2608. SLAC_INFO.array[idx].StartAttenCharErr = TRUE;
  2609. break;
  2610. }
  2611. //Check RunID
  2612. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2613. {
  2614. SLAC_INFO.array[idx].MnbcSoundNum = MmePacket->MMENTRY[2];
  2615. SLAC_INFO.array[idx].StartAttenCharCnt++;
  2616. #if 0
  2617. sprintf(buf_log_evcomm,
  2618. "[SLAC][Rx]CM_START_ATTEN_CHAR_IND[%d]:%d-th",
  2619. (idx + 1),
  2620. SLAC_INFO.array[idx].StartAttenCharCnt);
  2621. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2622. #endif
  2623. if (SLAC_INFO.array[idx].StartAttenCharCnt == 1)
  2624. {
  2625. memset(SLAC_INFO.array[idx].AAG, 0, sizeof(SLAC_INFO.array[idx].AAG));
  2626. SLAC_INFO.array[idx].AttenProfileCnt = 0;
  2627. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2628. }
  2629. else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
  2630. {
  2631. sprintf(buf_log_evcomm,
  2632. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]counter(%d): unexpected",
  2633. SLAC_INFO.array[idx].StartAttenCharCnt);
  2634. }
  2635. else
  2636. {
  2637. //null
  2638. }
  2639. }
  2640. else
  2641. {
  2642. //This RunID is not matched with this EvMac,
  2643. //or this RunID is not found in DB.
  2644. sprintf(buf_log_evcomm,
  2645. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req");
  2646. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2647. //Response: ignore
  2648. }
  2649. }
  2650. else
  2651. {
  2652. //this msg source is not in database
  2653. //ignore
  2654. }
  2655. break;
  2656. }
  2657. #else //Old SLAC architecture designed by Vern
  2658. {
  2659. MnbcSoundNum = MmePacket->MMENTRY[2];
  2660. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2661. counter++;
  2662. if(counter == 1)
  2663. {
  2664. memset(Aag, 0, sizeof(Aag));
  2665. AttenProfileCnt = 0;
  2666. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2667. }
  2668. else if(counter >= 3)
  2669. {
  2670. counter = 0;
  2671. }
  2672. break;
  2673. }
  2674. #endif
  2675. }
  2676. case MMTYPE_CM_MNBC_SOUND_IND:
  2677. {
  2678. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2679. {
  2680. SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(timeup)");
  2681. break;
  2682. }
  2683. //Avoid Coupled CM_MNBC_SOUND_IND
  2684. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2685. {
  2686. sprintf(buf_log_evcomm,
  2687. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)",
  2688. CheckConnectorPlugIn());
  2689. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2690. break;
  2691. }
  2692. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2693. {
  2694. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter + 1 , MnbcSoundNum);
  2695. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2696. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2697. DEBUG_PRINTF_EVCOMM_DETAIL("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2698. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2699. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  2700. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  2701. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  2702. MmePacket->MMENTRY[18]);
  2703. DEBUG_PRINTF_EVCOMM_DETAIL("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  2704. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2705. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  2706. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  2707. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2708. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  2709. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  2710. DEBUG_PRINTF_EVCOMM_DETAIL("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2711. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  2712. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  2713. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  2714. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  2715. }
  2716. #endif
  2717. //New SLAC architecture designed by Joseph
  2718. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2719. {
  2720. EvMac_in = &MmePacket->OSA[0];
  2721. RunID_in = &MmePacket->MMENTRY[20];
  2722. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2723. if (idx >= 0)
  2724. {
  2725. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2726. //Check for RunID
  2727. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2728. {
  2729. SLAC_INFO.array[idx].MnbcSoundCnt++;
  2730. /*
  2731. sprintf(buf_log_evcomm,
  2732. "[SLAC][Rx]CM_MNBC_SOUND_IND[%d]:%d-th",
  2733. (idx + 1),
  2734. SLAC_INFO.array[idx].MnbcSoundCnt);
  2735. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2736. */
  2737. }
  2738. else
  2739. {
  2740. //RunID is not matched or does not exist.
  2741. sprintf(buf_log_evcomm,
  2742. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac-RunID: unmatched");
  2743. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2744. }
  2745. }
  2746. else
  2747. {
  2748. //ignore
  2749. sprintf(buf_log_evcomm,
  2750. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac does not exist");
  2751. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2752. }
  2753. break;
  2754. }
  2755. #else //Old SLAC architecture designed by Vern
  2756. {
  2757. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2758. counter++;
  2759. break;
  2760. }
  2761. #endif
  2762. }
  2763. case MMTYPE_CM_ATTEN_PROFILE_IND:
  2764. {
  2765. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2766. {
  2767. SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_ATTEN_PROFILE_IND: ignore(timeup)");
  2768. break;
  2769. }
  2770. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2771. {
  2772. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, MnbcSoundNum);
  2773. DEBUG_PRINTF_EVCOMM_DETAIL("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2774. MmePacket->MMENTRY[0], MmePacket->MMENTRY[1], MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2775. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5]);
  2776. DEBUG_PRINTF_EVCOMM_DETAIL("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]); //NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2777. //NumGroups: Number of OFDM carrier groups used for the SLAC signal characterization.
  2778. //AAG[i]: Average Attenuation of Group i (i = 1 ~ 58)
  2779. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  2780. DEBUG_PRINTF_EVCOMM_DETAIL("AAG: \n");
  2781. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2782. {
  2783. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[8 + Rtn]);
  2784. }
  2785. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2786. }
  2787. #endif
  2788. //New SLAC architecture designed by Joseph
  2789. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2790. {
  2791. EvMac_in = &MmePacket->MMENTRY[0]; //[CAUTION] The EvMac address is not &MmePacket->OSA[0]
  2792. //[CAUTION] There is no RunID information of CM_ATTEN_PROFILE_IND
  2793. // packet, which means SECC cannot use the RunID to
  2794. // distinguish those SLAC request with identical EvMac
  2795. // but with different RunID.
  2796. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2797. /*
  2798. printf("%d, %d, %d, %d\n",
  2799. idx,
  2800. SLAC_INFO.array[idx].AagGroupsNum,
  2801. MmePacket->MMENTRY[6],
  2802. SLAC_INFO.array[idx].AttenProfileCnt);
  2803. */
  2804. if (idx >= 0)
  2805. {
  2806. SLAC_INFO.array[idx].AttenProfileCnt++;
  2807. /*
  2808. sprintf(buf_log_evcomm,
  2809. "[SLAC][Rx]CM_ATTEN_PROFILE_IND[%d]:%d-th",
  2810. (idx + 1),
  2811. SLAC_INFO.array[idx].AttenProfileCnt);
  2812. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2813. */
  2814. //printf("%d, %d\n", SLAC_INFO.array[idx].AagGroupsNum, MmePacket->MMENTRY[6]);
  2815. SLAC_INFO.array[idx].AagGroupsNum = MmePacket->MMENTRY[6];
  2816. ////NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2817. for(Rtn = 0; Rtn < SLAC_INFO.array[idx].AagGroupsNum; Rtn++) //ex:58
  2818. {
  2819. SLAC_INFO.array[idx].AAG[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2820. }
  2821. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2822. break;
  2823. }
  2824. else
  2825. {
  2826. //The EvMac is not in the database
  2827. //ignore
  2828. sprintf(buf_log_evcomm,
  2829. "[SLAC][Rx][CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore",
  2830. EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
  2831. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2832. break;
  2833. }
  2834. }
  2835. #else //Old SLAC architecture designed by Vern
  2836. {
  2837. AagGroupsNum = MmePacket->MMENTRY[6];
  2838. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2839. {
  2840. Aag[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2841. }
  2842. AttenProfileCnt++;
  2843. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2844. break;
  2845. }
  2846. #endif
  2847. }
  2848. case MMTYPE_CM_ATTEN_CHAR_RSP:
  2849. {
  2850. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2851. {
  2852. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_CHAR_RSP ---\n");
  2853. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2854. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2855. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2856. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2857. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  2858. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2859. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  2860. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  2861. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  2862. for(Rtn = 0; Rtn < 17; Rtn++)
  2863. {
  2864. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[16 + Rtn]);
  2865. }
  2866. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2867. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  2868. for(Rtn = 0; Rtn < 17; Rtn++)
  2869. {
  2870. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[33 + Rtn]);
  2871. }
  2872. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2873. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
  2874. }
  2875. #endif
  2876. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2877. {
  2878. //Check ODA (Destination Address)
  2879. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  2880. {
  2881. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_ATTEN_CHAR_RSP]wrong ODA: ignore");
  2882. break;
  2883. }
  2884. EvMac_in = &MmePacket->OSA[0];
  2885. RunID_in = &MmePacket->MMENTRY[8];
  2886. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2887. //Check Parameters
  2888. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2889. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2890. (SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in) < 0) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2891. (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2892. (Array_Check_All_Zero(&MmePacket->MMENTRY[16], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] SourceID(17 bytes) must be all zero.
  2893. (Array_Check_All_Zero(&MmePacket->MMENTRY[33], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] RESP_ID (17 bytes) must be all zero.
  2894. (MmePacket->MMENTRY[50] != 0) //Result: must be 0x00(Success)
  2895. )
  2896. {
  2897. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2898. sprintf(buf_log_evcomm,
  2899. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry",
  2900. MmePacket->MMENTRY[0], //applicationType must be 0x00
  2901. MmePacket->MMENTRY[1], //securityType must be 0x00
  2902. SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in),
  2903. SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in),
  2904. MmePacket->MMENTRY[50],
  2905. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry
  2906. );
  2907. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2908. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2909. {
  2910. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2911. ftime(&SeqStartTime);
  2912. break;
  2913. }
  2914. else
  2915. {
  2916. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process");
  2917. Update_V2G_Flow_Status(Other_Fault);
  2918. break;
  2919. }
  2920. }
  2921. else
  2922. {
  2923. //The CM_ATTEN_CHAR_IND is legal
  2924. SLAC_INFO.array[idx].AttenCharRspCnt++;
  2925. sprintf(buf_log_evcomm,
  2926. "[SLAC][Rx]CM_ATTEN_CHAR_RSP[%d]:%d-th",
  2927. (idx + 1),
  2928. SLAC_INFO.array[idx].AttenCharRspCnt);
  2929. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2930. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2931. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2932. ftime(&SeqStartTime);
  2933. break;
  2934. }
  2935. }
  2936. #else
  2937. {
  2938. //Check Parameters
  2939. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2940. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2941. (Array_Compare_Identity(SLAC_INFO.array[0].EvMac, &MmePacket->MMENTRY[2], 6) == TRUE) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2942. (Array_Compare_Identity(SLAC_INFO.array[0].RunID, &MmePacket->MMENTRY[8], 8) == TRUE) //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2943. )
  2944. {
  2945. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2946. sprintf(buf_log_evcomm,
  2947. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP: invalid parameters(%d-th)",
  2948. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  2949. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2950. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2951. {
  2952. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2953. ftime(&SeqStartTime);
  2954. break;
  2955. }
  2956. else
  2957. {
  2958. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]CM_ATTEN_CHAR_RSP: invalid parameters => End_Process");
  2959. Update_V2G_Flow_Status(Other_Fault);
  2960. ftime(&SeqStartTime);
  2961. break;
  2962. }
  2963. }
  2964. else
  2965. {
  2966. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2967. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2968. ftime(&SeqStartTime);
  2969. break;
  2970. }
  2971. }
  2972. #endif
  2973. }
  2974. case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
  2975. {
  2976. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2977. {
  2978. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  2979. DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
  2980. DEBUG_PRINTF_EVCOMM_DETAIL("Timer: 0x%x\n", MmePacket->MMENTRY[1]); //Fixed value In the first VALIDATE Request-Response exchange, the Timer field shall be set to zero.
  2981. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[2]); //Fixed value In the first VALIDATE Request-Response exchange, the Result field shall be set to 0x01 = ��ready��.
  2982. }
  2983. #endif
  2984. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2985. {
  2986. counter = 0;
  2987. EvMac_in = &MmePacket->OSA[0];
  2988. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2989. if (idx >= 0)
  2990. {
  2991. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  2992. SLAC_INFO.array[idx].ValidateReqCnt++;
  2993. sprintf(buf_log_evcomm,
  2994. "[SLAC][Rx]CM_VALIDATE_REQ[%d]:%d-th",
  2995. (idx + 1),
  2996. SLAC_INFO.array[idx].ValidateReqCnt);
  2997. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2998. //[To-Do] Protection
  2999. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3000. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  3001. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3002. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3003. SendMmePacket.MMV = 0x01;
  3004. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  3005. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3006. SendMmePacketSize = 0;
  3007. if(counter == 0)
  3008. {
  3009. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  3010. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
  3011. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //ToggleNum(0x00): Fixed value. In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  3012. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3013. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  3014. #else
  3015. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3016. #endif
  3017. }
  3018. else
  3019. {
  3020. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3021. unsigned char PreStatus = 3;
  3022. unsigned char ToggleNum = 0;
  3023. ftime(&SeqStartTime);
  3024. while(1)
  3025. {
  3026. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3027. {
  3028. ToggleNum++;
  3029. PreStatus = 4;
  3030. }
  3031. else
  3032. {
  3033. PreStatus = 3;
  3034. }
  3035. ftime(&SeqEndTime);
  3036. if((DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))||(EVCOMM_SYS_INFO.CpState == 1))
  3037. {
  3038. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
  3039. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3040. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3041. if(ToggleNum==0)
  3042. SendMmePacket.MMENTRY[SendMmePacketSize++] = 3; //0x02 = Failure
  3043. else
  3044. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3045. #else
  3046. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3047. #endif
  3048. break;
  3049. }
  3050. }
  3051. }
  3052. SendMmePacketSize += 19; //the size before MMENTRY
  3053. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3054. ftime(&SeqStartTime);
  3055. }
  3056. else
  3057. {
  3058. //EvMac does not exist.
  3059. //ignore
  3060. }
  3061. break;
  3062. }
  3063. #else
  3064. {
  3065. counter = 0;
  3066. for(Rtn = 0; Rtn < 6; Rtn++)
  3067. {
  3068. if(MmePacket->ODA[Rtn] != CsuMac[Rtn])
  3069. {
  3070. counter = 1;
  3071. break;
  3072. }
  3073. }
  3074. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3075. memcpy(SendMmePacket.ODA, EvMac,6);
  3076. memcpy(SendMmePacket.OSA, CsuMac,6);
  3077. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3078. SendMmePacket.MMV = 0x01;
  3079. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  3080. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3081. SendMmePacketSize = 0;
  3082. if(counter == 0)
  3083. {
  3084. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  3085. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate PEV S2 toggles on control pilot line
  3086. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  3087. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3088. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  3089. #else
  3090. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3091. #endif
  3092. }
  3093. else
  3094. {
  3095. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3096. unsigned char PreStatus = 3, ToggleNum = 0;
  3097. ftime(&SeqStartTime);
  3098. while(1)
  3099. {
  3100. ftime(&SeqEndTime);
  3101. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3102. {
  3103. ToggleNum++;
  3104. PreStatus = 4;
  3105. }
  3106. else
  3107. {
  3108. PreStatus = 3;
  3109. }
  3110. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  3111. {
  3112. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  3113. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3114. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3115. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3116. #else
  3117. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3118. #endif
  3119. break;
  3120. }
  3121. }
  3122. }
  3123. SendMmePacketSize += 19; //the size before MMENTRY
  3124. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3125. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  3126. ftime(&SeqStartTime);
  3127. break;
  3128. }
  3129. #endif
  3130. }
  3131. case MMTYPE_CM_SLAC_MATCH_REQ:
  3132. {
  3133. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3134. {
  3135. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  3136. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  3137. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  3138. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  3139. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3140. for(Rtn=0; Rtn<17; Rtn++)
  3141. {
  3142. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  3143. }
  3144. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3145. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3146. for(Rtn=0; Rtn<6; Rtn++)
  3147. {
  3148. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  3149. }
  3150. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3151. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3152. for(Rtn=0; Rtn<17; Rtn++)
  3153. {
  3154. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  3155. }
  3156. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3157. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3158. for(Rtn=0; Rtn<6; Rtn++)
  3159. {
  3160. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  3161. }
  3162. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3163. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3164. for(Rtn=0; Rtn<8; Rtn++)
  3165. {
  3166. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  3167. }
  3168. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3169. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3170. for(Rtn=0; Rtn<8; Rtn++)
  3171. {
  3172. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  3173. }
  3174. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3175. }
  3176. #endif
  3177. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3178. {
  3179. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3180. //Check ODA (Destination Address)
  3181. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  3182. {
  3183. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_SLAC_MATCH_REQ]wrong ODA: ignore");
  3184. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  3185. }
  3186. EvMac_in = &MmePacket->OSA[0];
  3187. RunID_in = &MmePacket->MMENTRY[50];
  3188. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  3189. if (idx >= 0)
  3190. {
  3191. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3192. SLAC_INFO.array[idx].MatchReqNum++;
  3193. sprintf(buf_log_evcomm,
  3194. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:%d-th",
  3195. (idx + 1),
  3196. SLAC_INFO.array[idx].MatchReqNum);
  3197. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3198. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  3199. //[TC_SECC_VTB_CmSlacMatch_008]
  3200. if (MmePacket->MMENTRY[0] != 0)
  3201. {
  3202. sprintf(buf_log_evcomm,
  3203. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)",
  3204. (idx + 1),
  3205. MmePacket->MMENTRY[0]);
  3206. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3207. break;
  3208. }
  3209. //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
  3210. //[TC_SECC_VTB_CmSlacMatch_010]
  3211. if (MmePacket->MMENTRY[1] != 0)
  3212. {
  3213. sprintf(buf_log_evcomm,
  3214. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)",
  3215. (idx + 1),
  3216. MmePacket->MMENTRY[1]);
  3217. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3218. break;
  3219. }
  3220. //[TC_SECC_VTB_CmSlacMatch_011] MVFLength must be 0x3E(MatchVarField Length)
  3221. //[TC_SECC_VTB_CmSlacMatch_012]
  3222. if (MmePacket->MMENTRY[2] != 0x3E || MmePacket->MMENTRY[3] != 0x00)
  3223. {
  3224. sprintf(buf_log_evcomm,
  3225. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)",
  3226. (idx + 1),
  3227. MmePacket->MMENTRY[2],
  3228. MmePacket->MMENTRY[3]);
  3229. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3230. break;
  3231. }
  3232. //[TC_SECC_VTB_CmSlacMatch_013] EV ID (muxt be all zero)
  3233. //[TC_SECC_VTB_CmSlacMatch_014]
  3234. if (Array_Check_All_Zero(&MmePacket->MMENTRY[4], 17) == FALSE)
  3235. {
  3236. sprintf(buf_log_evcomm,
  3237. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV ID",
  3238. (idx + 1));
  3239. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3240. break;
  3241. }
  3242. //[TC_SECC_VTB_CmSlacMatch_015] EV MAC
  3243. //[TC_SECC_VTB_CmSlacMatch_016]
  3244. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[21], SLAC_EVMAC_LENGTH) == FALSE)
  3245. {
  3246. sprintf(buf_log_evcomm,
  3247. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3248. (idx + 1),
  3249. MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
  3250. MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
  3251. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3252. break;
  3253. }
  3254. //[TC_SECC_VTB_CmSlacMatch_017] EVSE ID should be all zero
  3255. //[TC_SECC_VTB_CmSlacMatch_018]
  3256. if (Array_Check_All_Zero(&MmePacket->MMENTRY[27], 17) == FALSE)
  3257. {
  3258. sprintf(buf_log_evcomm,
  3259. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID",
  3260. (idx + 1));
  3261. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3262. break;
  3263. }
  3264. //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
  3265. //[TC_SECC_VTB_CmSlacMatch_020]
  3266. if (Array_Compare_Identity(CsuMac, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
  3267. {
  3268. sprintf(buf_log_evcomm,
  3269. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3270. (idx + 1),
  3271. MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
  3272. MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
  3273. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3274. break;
  3275. }
  3276. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3277. //[TC_SECC_VTB_CmSlacMatch_022]
  3278. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3279. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3280. {
  3281. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3282. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3283. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3284. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3285. SendMmePacket.MMV = MmePacket->MMV;
  3286. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
  3287. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3288. SendMmePacketSize = 0;
  3289. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
  3290. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
  3291. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3292. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3293. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EV ID
  3294. SendMmePacketSize += 17;
  3295. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
  3296. SendMmePacketSize += 6;
  3297. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EVSE ID
  3298. SendMmePacketSize += 17;
  3299. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, CsuMac, 6); //EVSE MAC
  3300. SendMmePacketSize += 6;
  3301. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3302. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3303. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 8); //RSVD
  3304. SendMmePacketSize += 8;
  3305. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, Nid, sizeof(Nid)); //NID: Network ID given by the CCo(EVSE)
  3306. SendMmePacketSize += sizeof(Nid); //NID caculated from the random NMK that will be set.
  3307. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //RSVD
  3308. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, NewNmkKey, sizeof(NewNmkKey)); //NMK: Random value
  3309. SendMmePacketSize += sizeof(NewNmkKey); //NMK: Private NMK of the EVSE (random value)
  3310. SendMmePacketSize += 19; //the size before MMENTRY
  3311. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3312. {
  3313. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3314. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3315. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3316. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3317. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3318. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3319. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3320. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3321. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3322. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3323. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3324. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3325. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3326. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3327. for(Rtn=0; Rtn<17; Rtn++)
  3328. {
  3329. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3330. }
  3331. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3332. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3333. for(Rtn=0; Rtn<6; Rtn++)
  3334. {
  3335. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3336. }
  3337. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3338. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3339. for(Rtn=0; Rtn<17; Rtn++)
  3340. {
  3341. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3342. }
  3343. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3344. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3345. for(Rtn=0; Rtn<6; Rtn++)
  3346. {
  3347. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3348. }
  3349. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3350. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3351. for(Rtn=0; Rtn<8; Rtn++)
  3352. {
  3353. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3354. }
  3355. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3356. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3357. for(Rtn=0; Rtn<8; Rtn++)
  3358. {
  3359. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3360. }
  3361. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3362. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3363. for(Rtn=0; Rtn<7; Rtn++)
  3364. {
  3365. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3366. }
  3367. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3368. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3369. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3370. for(Rtn=0; Rtn<16; Rtn++)
  3371. {
  3372. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3373. }
  3374. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3375. }
  3376. #endif
  3377. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3378. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3379. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3380. sprintf(buf_log_evcomm,
  3381. "[SLAC][Tx]CM_SLAC_MATCH_CNF[%d]",
  3382. (idx + 1));
  3383. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3384. ftime(&SeqStartTime);
  3385. }
  3386. else
  3387. {
  3388. //RunID does not match and it's not the first SLAC request
  3389. //Reset the SLAC database to embrace SLAC retry
  3390. SAVE_SYS_LOG_MSG_EVCOMM("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3391. SLAC_DB_Reset();
  3392. }
  3393. }
  3394. else
  3395. {
  3396. //OSA(EvMac) does not exist
  3397. }
  3398. break;
  3399. }
  3400. #else
  3401. {
  3402. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3403. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3404. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  3405. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  3406. memcpy(SendMmePacket.OSA,CsuMac,6);
  3407. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  3408. SendMmePacket.MMV=MmePacket->MMV;
  3409. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  3410. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  3411. SendMmePacketSize=0;
  3412. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating PEV-EVSE matching
  3413. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating No Security
  3414. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
  3415. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
  3416. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
  3417. SendMmePacketSize+=17;
  3418. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  3419. SendMmePacketSize+=6;
  3420. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
  3421. SendMmePacketSize+=17;
  3422. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  3423. SendMmePacketSize+=6;
  3424. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  3425. SendMmePacketSize+=sizeof(SlacRunId);
  3426. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
  3427. SendMmePacketSize+=8;
  3428. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  3429. SendMmePacketSize+=sizeof(Nid);
  3430. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
  3431. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  3432. SendMmePacketSize+=sizeof(NewNmkKey);
  3433. SendMmePacketSize+=19; //the size before MMENTRY
  3434. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3435. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3436. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3437. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3438. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3439. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3440. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3441. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3442. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3443. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3444. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3445. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3446. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3447. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3448. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3449. for(Rtn=0; Rtn<17; Rtn++)
  3450. {
  3451. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3452. }
  3453. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3454. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3455. for(Rtn=0; Rtn<6; Rtn++)
  3456. {
  3457. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3458. }
  3459. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3460. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3461. for(Rtn=0; Rtn<17; Rtn++)
  3462. {
  3463. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3464. }
  3465. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3466. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3467. for(Rtn=0; Rtn<6; Rtn++)
  3468. {
  3469. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3470. }
  3471. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3472. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3473. for(Rtn=0; Rtn<8; Rtn++)
  3474. {
  3475. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3476. }
  3477. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3478. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3479. for(Rtn=0; Rtn<8; Rtn++)
  3480. {
  3481. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3482. }
  3483. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3484. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3485. for(Rtn=0; Rtn<7; Rtn++)
  3486. {
  3487. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3488. }
  3489. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3490. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3491. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3492. for(Rtn=0; Rtn<16; Rtn++)
  3493. {
  3494. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3495. }
  3496. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3497. #endif
  3498. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3499. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3500. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3501. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Tx]CM_SLAC_MATCH_CNF");
  3502. ftime(&SeqStartTime);
  3503. break;
  3504. }
  3505. #endif
  3506. }
  3507. case MMTYPE_CM_AMP_MAP_REQ:
  3508. {
  3509. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3510. {
  3511. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  3512. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  3513. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  3514. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  3515. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3516. for(Rtn=0; Rtn<17; Rtn++)
  3517. {
  3518. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  3519. }
  3520. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3521. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3522. for(Rtn=0; Rtn<6; Rtn++)
  3523. {
  3524. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  3525. }
  3526. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3527. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3528. for(Rtn=0; Rtn<17; Rtn++)
  3529. {
  3530. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  3531. }
  3532. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3533. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3534. for(Rtn=0; Rtn<6; Rtn++)
  3535. {
  3536. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  3537. }
  3538. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3539. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3540. for(Rtn=0; Rtn<8; Rtn++)
  3541. {
  3542. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  3543. }
  3544. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3545. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3546. for(Rtn=0; Rtn<8; Rtn++)
  3547. {
  3548. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  3549. }
  3550. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3551. }
  3552. #endif
  3553. //Check ODA (Destination Address)
  3554. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  3555. {
  3556. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_AMP_MAP_REQ]wrong ODA: ignore");
  3557. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  3558. }
  3559. EvMac_in = &MmePacket->OSA[0];
  3560. RunID_in = &MmePacket->MMENTRY[50];
  3561. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  3562. if (idx >= 0)
  3563. {
  3564. Update_V2G_Flow_Status(CM_AMP_MAP_REQ);
  3565. SLAC_INFO.array[idx].MatchReqNum++;
  3566. sprintf(buf_log_evcomm,
  3567. "[SLAC][Rx]CM_AMP_MAP_REQ[%d]:%d-th",
  3568. (idx + 1),
  3569. SLAC_INFO.array[idx].MatchReqNum);
  3570. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3571. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  3572. //[TC_SECC_VTB_CmSlacMatch_008]
  3573. if ((MmePacket->MMENTRY[0] != 0x3A)||(MmePacket->MMENTRY[1] != 0))
  3574. {
  3575. sprintf(buf_log_evcomm,
  3576. "[SLAC][Rx]CM_AMP_MAP_REQ[%d]:wrong AMLEN(%d)",
  3577. (idx + 1),
  3578. MmePacket->MMENTRY[0]);
  3579. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3580. break;
  3581. }
  3582. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3583. //[TC_SECC_VTB_CmSlacMatch_022]
  3584. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3585. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3586. {
  3587. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3588. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3589. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3590. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3591. SendMmePacket.MMV = MmePacket->MMV;
  3592. SendMmePacket.MMTYPE = MMTYPE_CM_AMP_MAP_CNF;
  3593. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3594. SendMmePacketSize = 0;
  3595. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //success
  3596. Update_V2G_Flow_Status(CM_AMP_MAP_CNF);
  3597. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3598. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3599. sprintf(buf_log_evcomm,
  3600. "[SLAC][Tx]CM_AMP_MAP_CNF[%d]",
  3601. (idx + 1));
  3602. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3603. ftime(&SeqStartTime);
  3604. }
  3605. else
  3606. {
  3607. //RunID does not match and it's not the first SLAC request
  3608. //Reset the SLAC database to embrace SLAC retry
  3609. SAVE_SYS_LOG_MSG_EVCOMM("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3610. SLAC_DB_Reset();
  3611. }
  3612. }
  3613. else
  3614. {
  3615. //OSA(EvMac) does not exist
  3616. }
  3617. break;
  3618. }
  3619. case MMTYPE_VENDOR_VS_HOST_ACTION:
  3620. {
  3621. struct QcaVendorMmeHeader *RecvPacket;
  3622. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3623. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  3624. switch (RecvPacket->MBODY[0])
  3625. {
  3626. case 0x00:
  3627. //Loader (Device Softloader or Bootloader) ready
  3628. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader Ready\n");
  3629. break;
  3630. case 0x01:
  3631. //Firmware Upgrade Ready
  3632. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade Ready\n");
  3633. break;
  3634. case 0x02:
  3635. //PIB Update Ready
  3636. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: PIB Update Ready\n");
  3637. break;
  3638. case 0x03:
  3639. //Firmware Upgrade and PIB Update ready
  3640. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade and PIB Update ready\n");
  3641. break;
  3642. case 0x04:
  3643. //Loader (Bootloader) ready to receive SDRAM configuration.
  3644. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader ready to receive SDRAM configuration\n");
  3645. break;
  3646. case 0x05:
  3647. //Reset to Factory Defaults.
  3648. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reset to Factory Defaults\n");
  3649. break;
  3650. default:
  3651. //Reserved
  3652. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reserved\n");
  3653. break;
  3654. }
  3655. break;
  3656. }
  3657. case MMTYPE_VENDOR_ATTEN_CHAR:
  3658. {
  3659. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  3660. break;
  3661. }
  3662. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  3663. {
  3664. struct QcaVendorMmeHeader *RecvPacket;
  3665. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3666. memcpy(QcaMac, RecvPacket->OSA, 6);
  3667. sprintf(buf_log_evcomm,
  3668. "[QCA7K][Rx][VENDOR_VS_NW_INFO_CNF]Got QCA7K MacAddr:%02X:%02X:%02X:%02X:%02X:%02X (comm:OK)",
  3669. QcaMac[0], QcaMac[1], QcaMac[2], QcaMac[3], QcaMac[4], QcaMac[5]);
  3670. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3671. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  3672. DEBUG_PRINTF_EVCOMM_DETAIL("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3673. QcaMac[0],
  3674. QcaMac[1],
  3675. QcaMac[2],
  3676. QcaMac[3],
  3677. QcaMac[4],
  3678. QcaMac[5]);
  3679. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3680. ftime(&SeqStartTime);
  3681. break;
  3682. }
  3683. case MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF:
  3684. {
  3685. struct QcaVendorMmeHeader *RecvPacket;
  3686. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3687. if(RecvPacket->MBODY[1]==0)
  3688. {
  3689. //PLC disconnected
  3690. sprintf(buf_log_evcomm,
  3691. "[QCA7K][Rx][MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF]Got PLC Link Status:%d",
  3692. RecvPacket->MBODY[1]);
  3693. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3694. Update_V2G_Flow_Status(Other_Fault);
  3695. }
  3696. else
  3697. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3698. ftime(&SeqStartTime);
  3699. break;
  3700. }
  3701. default:
  3702. {
  3703. break;
  3704. }
  3705. }
  3706. }
  3707. /*===========================================================================
  3708. FUNCTION: SlacComm
  3709. DESCRIPTION:
  3710. PRE-CONDITION:
  3711. INPUT:
  3712. OUTPUT:
  3713. GLOBAL VARIABLES:
  3714. =============================================================================*/
  3715. int SlacComm()
  3716. {
  3717. static unsigned char qca7k_comm_retry = 0;
  3718. unsigned char *EvMac_in;
  3719. unsigned char *RunID_in;
  3720. double t_diff = 0;
  3721. int packet_size = 0;
  3722. int count = 0;
  3723. int idx = 0;
  3724. int i = 0;
  3725. if(RawSock >= 0)
  3726. {
  3727. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  3728. packet_size = recvfrom(RawSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
  3729. if(packet_size > 0)
  3730. {
  3731. /*#ifdef Debug
  3732. DEBUG_PRINTF_EVCOMM_DETAIL("Raw Data: ");
  3733. for(count=0;count<packet_size;count++)
  3734. DEBUG_PRINTF_EVCOMM_DETAIL("0x%x, ",V2gtpMsgRxBuf[count]);
  3735. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3736. #endif*/
  3737. MmeProcess(V2gtpMsgRxBuf, packet_size);
  3738. }
  3739. }
  3740. switch(Check_V2G_Flow_Status())
  3741. {
  3742. case IDLE:
  3743. {
  3744. if(RawSock < 0)
  3745. {
  3746. RawSock = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  3747. sprintf(buf_log_evcomm, "[RawSock]opened(%d)", RawSock);
  3748. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3749. if(RawSock == -1)
  3750. {
  3751. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Failed to create socket");
  3752. Update_V2G_Flow_Status(Other_Fault);
  3753. return -1;
  3754. }
  3755. ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=RawSock;
  3756. if (setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
  3757. {
  3758. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_BINDTODEVICE NG");
  3759. Update_V2G_Flow_Status(Other_Fault);
  3760. return -1;
  3761. }
  3762. struct timeval tv;
  3763. tv.tv_sec = 0;
  3764. tv.tv_usec = 100000; //100ms (Rx timeout)
  3765. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3766. {
  3767. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_RCVTIMEO NG");
  3768. Update_V2G_Flow_Status(Other_Fault);
  3769. return -1;
  3770. }
  3771. tv.tv_usec = 100000; //100ms (Tx timeout)
  3772. if (setsockopt(RawSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3773. {
  3774. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_SNDTIMEO NG");
  3775. Update_V2G_Flow_Status(Other_Fault);
  3776. return -1;
  3777. }
  3778. memset(&Req, 0, sizeof(struct ifreq));
  3779. strcpy( (char*)Req.ifr_name, QcaInterface);
  3780. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  3781. {
  3782. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm: ioctl NG");
  3783. Update_V2G_Flow_Status(Other_Fault);
  3784. return -1;
  3785. }
  3786. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll));
  3787. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  3788. DestSocketAddress.sll_halen = ETH_ALEN;
  3789. PwmStartTime = 0;
  3790. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
  3791. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K]connecting...");
  3792. //Get QCA7K MAC address
  3793. GetQca7kMac();
  3794. ftime(&SeqStartTime);
  3795. break;
  3796. }
  3797. else //RawSock: opened
  3798. {
  3799. if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  3800. {
  3801. ftime(&SeqEndTime);
  3802. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3803. if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
  3804. {
  3805. qca7k_comm_retry++;
  3806. sprintf(buf_log_evcomm,
  3807. "[QCA7K]re-try connecting...(%.02lf/%dms)",
  3808. t_diff,
  3809. V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
  3810. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3811. GetQca7kMac(); //re-send req
  3812. ftime(&SeqStartTime);
  3813. break;
  3814. }
  3815. else
  3816. {
  3817. //null
  3818. }
  3819. //Retry by 3 times
  3820. if (qca7k_comm_retry >= 3)
  3821. {
  3822. sprintf(buf_log_evcomm,
  3823. "[QCA7K][Error]comm: fail (retry by %d times)",
  3824. qca7k_comm_retry);
  3825. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3826. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3827. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3828. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3829. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3830. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3831. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3832. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3833. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3834. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3835. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3836. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  3837. Update_V2G_Flow_Status(Sequence_Timeout);
  3838. qca7k_comm_retry = 0;
  3839. break;
  3840. }
  3841. }
  3842. else //RawSock: opened; Set Key: DONE
  3843. {
  3844. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  3845. if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission >=1))
  3846. {
  3847. if(PwmStartTime <= 0)
  3848. {
  3849. //Sniffer_Tcpdump(ENABLE);
  3850. //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  3851. //sleep(1); //wait for tcpdump to be ready.
  3852. //#endif
  3853. SwitchCpStateE(DISABLE);
  3854. OutputCpPwmDuty(5);
  3855. PwmStartTime = time(NULL);
  3856. }
  3857. else
  3858. {
  3859. if((time(NULL) - PwmStartTime) > ((CCS_ENERGY_TRANSFER_MODE<=1)?20:TT_EVSE_SLAC_init))
  3860. {
  3861. sprintf(buf_log_evcomm,
  3862. "SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%d)-PwmStartTime(%d)>%d (sec)",
  3863. time(NULL),
  3864. PwmStartTime,
  3865. TT_EVSE_SLAC_init);
  3866. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3867. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3868. //CCS_SECC_TIMEOUT_SLAC_TT_EVSE_SLAC_init (023809)
  3869. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3870. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3871. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3872. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3873. ShmStatusCodeData->PresentStatusCode[0][4] = 0;
  3874. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  3875. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3876. Update_V2G_Flow_Status(Sequence_Timeout);
  3877. PwmStartTime = 0;
  3878. return -1;
  3879. }
  3880. else
  3881. {
  3882. //waiting for CM_SLAC_PARM_REQ
  3883. }
  3884. }
  3885. }
  3886. else
  3887. {
  3888. PwmStartTime = 0;
  3889. }
  3890. }
  3891. }
  3892. break;
  3893. }
  3894. case CM_SET_KEY_REQ: //13
  3895. {
  3896. //CM_SET_KEY_REQ
  3897. //SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Rx]CM_SET_KEY_REQ");
  3898. ftime(&SeqEndTime);
  3899. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3900. if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
  3901. {
  3902. sprintf(buf_log_evcomm,
  3903. "[QCA7K]Failed on SetKey => End_Process (%.02lf/%dms)",
  3904. t_diff,
  3905. V2G_SECC_QCA7000_COMM_TIMEOUT);
  3906. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3907. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3908. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3909. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3910. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3911. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3912. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3913. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3914. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3915. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3916. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3917. Update_V2G_Flow_Status(Sequence_Timeout);
  3918. }
  3919. else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
  3920. {
  3921. sprintf(buf_log_evcomm,
  3922. "[QCA7K]SetKey: proceed (%.02lf/%dms)",
  3923. t_diff,
  3924. V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
  3925. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3926. SendSetKey();
  3927. ftime(&SeqStartTime);
  3928. }
  3929. else
  3930. {
  3931. //null
  3932. }
  3933. break;
  3934. }
  3935. case CM_SET_KEY_CNF: //14
  3936. {
  3937. sprintf(buf_log_evcomm,
  3938. "[SECCReady]Wait: plugin(%d), matached(%d), permission(%d)...",
  3939. CheckConnectorPlugIn(),
  3940. CSUCOMMDC_TASK_FLAG.matched,
  3941. ShmInternalComm->ChargingPermission
  3942. );
  3943. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3944. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
  3945. PwmStartTime = 0;
  3946. Update_V2G_Flow_Status(IDLE);
  3947. break;
  3948. }
  3949. case CM_SLAC_PARM_CONF:
  3950. {
  3951. ftime(&SeqEndTime);
  3952. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  3953. {
  3954. sprintf(buf_log_evcomm,
  3955. "SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)",
  3956. DiffTimeb(SeqStartTime, SeqEndTime),
  3957. TT_match_sequence);
  3958. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3959. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3960. //CCS_SECC_TIMEOUT_CM_START_ATTEN_CHAR_IND (023811):
  3961. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3962. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3963. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3964. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3965. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3966. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3967. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3968. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  3969. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3970. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3971. Update_V2G_Flow_Status(Sequence_Timeout);
  3972. return -1;
  3973. }
  3974. break;
  3975. }
  3976. case CM_START_ATTEN_CHAR_IND:
  3977. {
  3978. ftime(&SeqEndTime);
  3979. if(DiffTimeb(SeqStartTime, SeqEndTime) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
  3980. {
  3981. sprintf(buf_log_evcomm,
  3982. "SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)",
  3983. DiffTimeb(SeqStartTime, SeqEndTime),
  3984. TP_EV_batch_msg_interval);
  3985. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3986. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3987. //CCS_SECC_TIMEOUT_SLAC_CM_MNBC_SOUND_IND (023818):
  3988. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3989. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3990. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3991. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3992. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3993. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3994. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3995. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  3996. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3997. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3998. Update_V2G_Flow_Status(Sequence_Timeout);
  3999. return -1;
  4000. }
  4001. break;
  4002. }
  4003. case CM_MNBC_SOUND_IND:
  4004. {
  4005. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  4006. {
  4007. ftime(&SeqEndTime);
  4008. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  4009. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  4010. if(t_diff > TT_EVSE_match_MNBC ||
  4011. (SLAC_INFO.array[0].AttenProfileCnt >= SLAC_INFO.array[0].MnbcSoundNum) ||
  4012. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)) //TC_SECC_VTB_AttenuationCharacterization_003
  4013. {
  4014. //Wait for other SLAC Req sets
  4015. if ((SLAC_INFO.arrayLen >= 2) &&
  4016. (t_diff < TT_EVSE_match_MNBC) &&
  4017. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)) //not a retry
  4018. {
  4019. break;
  4020. }
  4021. //Check if it is a timeup response
  4022. if (t_diff > TT_EVSE_match_MNBC)
  4023. {
  4024. sprintf(buf_log_evcomm,
  4025. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send",
  4026. (i + 1),
  4027. t_diff,
  4028. TT_EVSE_match_MNBC);
  4029. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4030. }
  4031. //Sending all CM_ATTEN_CHAR_IND according to all corresponding SLAC Req sets
  4032. for (i = 0; i < SLAC_INFO.arrayLen; i++)
  4033. {
  4034. if ((SLAC_INFO.array[i].AttenProfileCnt == 0) ||
  4035. (SLAC_INFO.array[i].AagGroupsNum == 0) ||
  4036. (SLAC_INFO.array[i].StartAttenCharCnt == 0) ||
  4037. (SLAC_INFO.array[i].MnbcSoundNum != 10) || //received in CM_START_ATTEN_CHAR_IND
  4038. (SLAC_INFO.array[i].StartAttenCharErr == TRUE)
  4039. )
  4040. {
  4041. //Ignoring those SLAC request sets without sending CM_MNBC_SOUND_IND(CM_ATTEN_PROFILE_IND)
  4042. sprintf(buf_log_evcomm,
  4043. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled",
  4044. (i + 1),
  4045. SLAC_INFO.array[i].AttenProfileCnt,
  4046. SLAC_INFO.array[i].AagGroupsNum,
  4047. SLAC_INFO.array[i].StartAttenCharCnt,
  4048. SLAC_INFO.array[i].MnbcSoundNum,
  4049. SLAC_INFO.array[i].StartAttenCharErr);
  4050. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4051. continue;
  4052. }
  4053. //In CM_ATTEN_CHAR_IND retry process, here only re-send this message according to the 1st coming SLAC request
  4054. if ((EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0) && (i != 0))
  4055. {
  4056. sprintf(buf_log_evcomm,
  4057. "[NOTE][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: canceled",
  4058. (i + 1));
  4059. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4060. break;
  4061. }
  4062. EvMac_in = SLAC_INFO.array[i].EvMac;
  4063. RunID_in = SLAC_INFO.array[i].RunID;
  4064. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  4065. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  4066. memcpy(SendMmePacket.OSA, CsuMac, 6);
  4067. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  4068. SendMmePacket.MMV = 0x01;
  4069. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  4070. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  4071. SendMmePacketSize = 0;
  4072. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  4073. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  4074. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
  4075. SendMmePacketSize += SLAC_EVMAC_LENGTH;
  4076. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  4077. SendMmePacketSize += SLAC_RUNID_LENGTH;
  4078. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
  4079. SendMmePacketSize += 17;
  4080. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //RESP_ID(0x00)
  4081. SendMmePacketSize += 17;
  4082. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
  4083. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AagGroupsNum; //NumGroups
  4084. for(count = 0; count < SLAC_INFO.array[i].AagGroupsNum; count++)
  4085. {
  4086. unsigned char TmpAag;
  4087. TmpAag = ((SLAC_INFO.array[i].AAG[count] / SLAC_INFO.array[i].AttenProfileCnt) & 0xFF);
  4088. SLAC_INFO.array[i].AAG_quality_ori += (float) TmpAag; //original signal quality
  4089. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  4090. #if 1
  4091. //TC_SECC_VTB_AttenuationCharacterization_019
  4092. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  4093. #else
  4094. if(TmpAag >= 39) //original method proposed by Vern
  4095. {
  4096. TmpAag = 37;
  4097. }
  4098. #endif
  4099. #endif
  4100. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  4101. SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
  4102. }
  4103. SendMmePacketSize += 19; //the size before MMENTRY
  4104. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  4105. {
  4106. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  4107. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4108. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  4109. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4110. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  4111. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  4112. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  4113. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  4114. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  4115. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  4116. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  4117. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  4118. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  4119. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  4120. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  4121. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  4122. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  4123. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  4124. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  4125. for(count=0; count<17; count++)
  4126. {
  4127. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  4128. }
  4129. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4130. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  4131. for(count=0; count<17; count++)
  4132. {
  4133. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  4134. }
  4135. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4136. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  4137. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  4138. for(count=0; count<AagGroupsNum; count++)
  4139. {
  4140. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  4141. }
  4142. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4143. }
  4144. #endif
  4145. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  4146. SLAC_INFO.array[i].AAG_quality_ori /= SLAC_INFO.array[i].AagGroupsNum;
  4147. SLAC_INFO.array[i].AAG_quality_refined /= SLAC_INFO.array[i].AagGroupsNum;
  4148. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  4149. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  4150. {
  4151. sprintf(buf_log_evcomm,
  4152. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)",
  4153. (i + 1),
  4154. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry,
  4155. SLAC_INFO.array[i].AAG_quality_refined,
  4156. SLAC_INFO.array[i].AAG_quality_ori,
  4157. SLAC_INFO.array[i].AttenProfileCnt,
  4158. SLAC_INFO.array[i].MnbcSoundNum);
  4159. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4160. }
  4161. else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
  4162. {
  4163. sprintf(buf_log_evcomm,
  4164. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)",
  4165. (i + 1),
  4166. SLAC_INFO.array[i].AAG_quality_refined,
  4167. SLAC_INFO.array[i].AAG_quality_ori,
  4168. SLAC_INFO.array[i].AttenProfileCnt,
  4169. SLAC_INFO.array[i].MnbcSoundNum);
  4170. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4171. }
  4172. else
  4173. {
  4174. sprintf(buf_log_evcomm,
  4175. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))",
  4176. i,
  4177. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4178. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4179. }
  4180. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4181. } //end of for loop
  4182. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4183. ftime(&SeqStartTime);
  4184. }
  4185. break;
  4186. }
  4187. #else
  4188. {
  4189. ftime(&SeqEndTime);
  4190. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  4191. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_MNBC || (AttenProfileCnt >= MnbcSoundNum) || (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0))
  4192. {
  4193. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  4194. memcpy(SendMmePacket.ODA, EvMac, 6);
  4195. memcpy(SendMmePacket.OSA, CsuMac, 6);
  4196. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  4197. SendMmePacket.MMV = 0x01;
  4198. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  4199. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  4200. SendMmePacketSize = 0;
  4201. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  4202. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  4203. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //SOURCE_ADDRESS, MAC address of the EV Host
  4204. SendMmePacketSize += 6;
  4205. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize, SlacRunId, sizeof(SlacRunId));
  4206. SendMmePacketSize += sizeof(SlacRunId);
  4207. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //SOURCE_ID
  4208. SendMmePacketSize += 17;
  4209. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //RESP_ID
  4210. SendMmePacketSize += 17;
  4211. SendMmePacket.MMENTRY[SendMmePacketSize++] = AttenProfileCnt; //NumSounds
  4212. SendMmePacket.MMENTRY[SendMmePacketSize++] = AagGroupsNum; //NumGroups
  4213. for(count=0; count < AagGroupsNum; count++)
  4214. {
  4215. unsigned char TmpAag;
  4216. TmpAag = ((Aag[count] / AttenProfileCnt) & 0xFF);
  4217. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  4218. #if 1
  4219. //TC_SECC_VTB_AttenuationCharacterization_019
  4220. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  4221. #else
  4222. if(TmpAag >= 39) //original method proposed by Vern
  4223. {
  4224. /*
  4225. // [To-do] If this statement is enabled, SLAC will fail due to timeout.
  4226. {
  4227. unsigned char TmpBuf[64];
  4228. memset(TmpBuf,0,sizeof(TmpBuf));
  4229. sprintf(TmpBuf,"SlacComm: bad Aag[%d]=%d",count,TmpAag);
  4230. SAVE_SYS_LOG_MSG_EVCOMM(TmpBuf);
  4231. }
  4232. */
  4233. printf("%d,", TmpAag);
  4234. TmpAag = 37;
  4235. }
  4236. #endif
  4237. #endif
  4238. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  4239. }
  4240. SendMmePacketSize += 19; //the size before MMENTRY
  4241. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  4242. {
  4243. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  4244. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4245. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  4246. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4247. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  4248. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  4249. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  4250. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  4251. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  4252. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  4253. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  4254. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  4255. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  4256. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  4257. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  4258. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  4259. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  4260. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  4261. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  4262. for(count=0; count<17; count++)
  4263. {
  4264. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  4265. }
  4266. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4267. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  4268. for(count=0; count<17; count++)
  4269. {
  4270. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  4271. }
  4272. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4273. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  4274. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  4275. for(count=0; count<AagGroupsNum; count++)
  4276. {
  4277. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  4278. }
  4279. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4280. }
  4281. #endif
  4282. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4283. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  4284. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  4285. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  4286. {
  4287. sprintf(buf_log_evcomm,
  4288. "[SLAC][Tx]CM_ATTEN_CHAR_IND: resend(%d-th)",
  4289. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4290. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4291. }
  4292. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4293. ftime(&SeqStartTime);
  4294. }
  4295. break;
  4296. }
  4297. #endif
  4298. }
  4299. case CM_ATTEN_CHAR_IND:
  4300. {
  4301. ftime(&SeqEndTime);
  4302. //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  4303. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_response) //extended to 400ms due to the response of CM_ATTEN_CHAR.RSP of some EVCC is slower than 200ms.
  4304. {
  4305. sprintf(buf_log_evcomm,
  4306. "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
  4307. DiffTimeb(SeqStartTime, SeqEndTime),
  4308. TT_match_response);
  4309. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4310. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4311. //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
  4312. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4313. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4314. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4315. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4316. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4317. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4318. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  4319. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4320. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4321. Update_V2G_Flow_Status(Sequence_Timeout);
  4322. return -1;
  4323. }
  4324. break;
  4325. }
  4326. case CM_ATTEN_CHAR_RSP:
  4327. {
  4328. ftime(&SeqEndTime);
  4329. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
  4330. {
  4331. sprintf(buf_log_evcomm,
  4332. "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
  4333. DiffTimeb(SeqStartTime, SeqEndTime),
  4334. TT_EVSE_match_session);
  4335. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4336. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4337. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
  4338. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4339. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4340. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4341. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4342. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4343. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4344. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  4345. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4346. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4347. Update_V2G_Flow_Status(Sequence_Timeout);
  4348. return -1;
  4349. }
  4350. break;
  4351. }
  4352. case CM_VALIDATE_CNF:
  4353. {
  4354. ftime(&SeqEndTime);
  4355. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  4356. {
  4357. sprintf(buf_log_evcomm,
  4358. "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
  4359. DiffTimeb(SeqStartTime, SeqEndTime),
  4360. TT_match_sequence);
  4361. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4362. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4363. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
  4364. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4365. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4366. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4367. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4368. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4369. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4370. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  4371. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4372. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4373. Update_V2G_Flow_Status(Sequence_Timeout);
  4374. return -1;
  4375. }
  4376. break;
  4377. }
  4378. case CM_AMP_MAP_CNF:
  4379. case CM_SLAC_MATCH_CNF:
  4380. {
  4381. if(UdpSock > 0)
  4382. {
  4383. close(UdpSock);
  4384. UdpSock = -1;
  4385. }
  4386. if(TcpSock > 0)
  4387. {
  4388. close(TcpSock);
  4389. TcpSock = -1;
  4390. }
  4391. ftime(&SeqStartTime);
  4392. V2gTcpConnected();
  4393. Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
  4394. SAVE_SYS_LOG_MSG_EVCOMM("SLAAC,SDP,UDP: connecting...");
  4395. break;
  4396. }
  4397. default:
  4398. {
  4399. break;
  4400. }
  4401. }
  4402. return 0;
  4403. }
  4404. /*===========================================================================
  4405. FUNCTION: V2gMsgDecoder
  4406. DESCRIPTION:
  4407. 1. Decode the V2GTP messages inside "msg" and save the decoded
  4408. messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
  4409. respectively.
  4410. 2. After decoding, V2gMsg_Process() could then use
  4411. ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
  4412. to deal with the corresponding Response messages, respectively.
  4413. PRE-CONDITION:
  4414. 1. msg_length > 0
  4415. INPUT:
  4416. 1. msg
  4417. 2. msg_length
  4418. OUTPUT:
  4419. 1. ccs_exi_doc_DIN //global variable
  4420. ccs_exi_doc_ISO1
  4421. ccs_exi_doc_ISO2
  4422. 2. v2g_state //Status Flag
  4423. //indicating the V2gMsg_Process_din to proceed
  4424. the next process.
  4425. 3. return value // < 0: ERROR
  4426. // > 0: Message Type
  4427. GLOBAL VARIABLES:
  4428. =============================================================================*/
  4429. int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
  4430. {
  4431. int errn = 0;
  4432. //Checking the minimum Header size requirement
  4433. if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
  4434. {
  4435. errn = -1;
  4436. return errn;
  4437. }
  4438. //Decode the 1st V2GMSG: AppProtocol
  4439. if(v2g_state == SupportedAppProtocolRequest) //17
  4440. {
  4441. if (errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake) < 0)
  4442. {
  4443. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
  4444. }
  4445. else //decoded successfully.
  4446. {
  4447. //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
  4448. }
  4449. }
  4450. //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
  4451. else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
  4452. {
  4453. //Decoding according to its own protocol
  4454. switch (ShmCcsData->CommProtocol)
  4455. {
  4456. case V2GT_MSG_PROTOCOL_DIN70121: //0
  4457. {
  4458. //DIN
  4459. if(errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN) < 0)
  4460. {
  4461. sprintf(buf_log_evcomm,
  4462. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
  4463. errn);
  4464. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4465. }
  4466. break;
  4467. }
  4468. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  4469. {
  4470. //ISO1
  4471. if(errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1) < 0)
  4472. {
  4473. sprintf(buf_log_evcomm,
  4474. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
  4475. errn);
  4476. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4477. }
  4478. break;
  4479. }
  4480. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  4481. {
  4482. //ISO2
  4483. if(errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2) < 0)
  4484. {
  4485. sprintf(buf_log_evcomm,
  4486. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
  4487. errn);
  4488. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4489. }
  4490. break;
  4491. }
  4492. default:
  4493. break;
  4494. }
  4495. }
  4496. else
  4497. {
  4498. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
  4499. errn = -1;
  4500. }
  4501. return errn;
  4502. }
  4503. /*===========================================================================
  4504. FUNCTION: encode_din_V2GTP_stream
  4505. DESCRIPTION:
  4506. PRE-CONDITION:
  4507. INPUT:
  4508. OUTPUT:
  4509. GLOBAL VARIABLES:
  4510. =============================================================================*/
  4511. int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4512. {
  4513. int errn = 0;
  4514. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4515. errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
  4516. if (errn == 0)
  4517. {
  4518. //successfully encoded
  4519. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4520. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4521. if (errn != 0)
  4522. {
  4523. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4524. }
  4525. }
  4526. else
  4527. {
  4528. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
  4529. }
  4530. return errn;
  4531. }
  4532. /*===========================================================================
  4533. FUNCTION: encode_iso1_V2GTP_stream
  4534. DESCRIPTION:
  4535. PRE-CONDITION:
  4536. INPUT:
  4537. OUTPUT:
  4538. GLOBAL VARIABLES:
  4539. =============================================================================*/
  4540. int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4541. {
  4542. int errn = 0;
  4543. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4544. errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
  4545. if (errn == 0)
  4546. {
  4547. //successfully encoded
  4548. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4549. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4550. if (errn != 0)
  4551. {
  4552. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4553. }
  4554. }
  4555. else
  4556. {
  4557. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
  4558. }
  4559. return errn;
  4560. }
  4561. /*===========================================================================
  4562. FUNCTION: encode_iso2_V2GTP_stream
  4563. DESCRIPTION:
  4564. PRE-CONDITION:
  4565. INPUT:
  4566. OUTPUT:
  4567. GLOBAL VARIABLES:
  4568. =============================================================================*/
  4569. int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4570. {
  4571. int errn = 0;
  4572. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4573. errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
  4574. if (errn == 0)
  4575. {
  4576. //successfully encoded
  4577. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4578. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4579. if (errn != 0)
  4580. {
  4581. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4582. }
  4583. }
  4584. else
  4585. {
  4586. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
  4587. }
  4588. return errn;
  4589. }
  4590. /*===========================================================================
  4591. FUNCTION: send_encoded_din_V2GTP_Stream
  4592. DESCRIPTION:
  4593. PRE-CONDITION:
  4594. INPUT:
  4595. OUTPUT:
  4596. GLOBAL VARIABLES:
  4597. =============================================================================*/
  4598. int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4599. {
  4600. int errn = 0;
  4601. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4602. errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
  4603. // STEP 2: =========== Send Response Packet ===========
  4604. int rtn = 0;
  4605. #ifdef SUPPORT_TLS_CONNECTION
  4606. if(EvSecurity == 0)//support security
  4607. {
  4608. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4609. }
  4610. else
  4611. {
  4612. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4613. }
  4614. #else
  4615. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4616. #endif
  4617. if (rtn == v2g_tx_stream->size)
  4618. {
  4619. /*
  4620. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4621. rtn, v2g_tx_stream->size);
  4622. */
  4623. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4624. }
  4625. else if (rtn >= 0)
  4626. {
  4627. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4628. rtn, v2g_tx_stream->size);
  4629. }
  4630. else
  4631. {
  4632. errn = rtn;
  4633. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4634. }
  4635. //STEP 3: ========= Reset V2G MSG Flags ==========
  4636. init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
  4637. return errn;
  4638. }
  4639. /*===========================================================================
  4640. FUNCTION: send_encoded_iso1_V2GTP_Stream
  4641. DESCRIPTION:
  4642. PRE-CONDITION:
  4643. INPUT:
  4644. OUTPUT:
  4645. GLOBAL VARIABLES:
  4646. =============================================================================*/
  4647. int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4648. {
  4649. int errn = 0;
  4650. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4651. errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
  4652. // STEP 2: =========== Send Response Packet ===========
  4653. int rtn = 0;
  4654. #ifdef SUPPORT_TLS_CONNECTION
  4655. if(EvSecurity == 0)//support security
  4656. {
  4657. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4658. }
  4659. else
  4660. {
  4661. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4662. }
  4663. #else
  4664. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4665. #endif
  4666. if (rtn == v2g_tx_stream->size)
  4667. {
  4668. /*
  4669. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4670. rtn, v2g_tx_stream->size);
  4671. */
  4672. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4673. }
  4674. else if (rtn >= 0)
  4675. {
  4676. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4677. rtn, v2g_tx_stream->size);
  4678. }
  4679. else
  4680. {
  4681. errn = rtn;
  4682. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4683. }
  4684. //STEP 3: ========= Reset V2G MSG Flags ==========
  4685. init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
  4686. return errn;
  4687. }
  4688. /*===========================================================================
  4689. FUNCTION: send_encoded_iso2_V2GTP_Stream
  4690. DESCRIPTION:
  4691. PRE-CONDITION:
  4692. INPUT:
  4693. OUTPUT:
  4694. GLOBAL VARIABLES:
  4695. =============================================================================*/
  4696. int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4697. {
  4698. int errn = 0;
  4699. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4700. errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
  4701. // STEP 2: =========== Send Response Packet ===========
  4702. int rtn = 0;
  4703. #ifdef SUPPORT_TLS_CONNECTION
  4704. if(EvSecurity == 0)//support security
  4705. {
  4706. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4707. }
  4708. else
  4709. {
  4710. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4711. }
  4712. #else
  4713. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4714. #endif
  4715. if (rtn == v2g_tx_stream->size)
  4716. {
  4717. /*
  4718. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4719. rtn, v2g_tx_stream->size);
  4720. */
  4721. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4722. }
  4723. else if (rtn >= 0)
  4724. {
  4725. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4726. rtn, v2g_tx_stream->size);
  4727. }
  4728. else
  4729. {
  4730. errn = rtn;
  4731. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4732. }
  4733. //STEP 3: ========= Reset V2G MSG Flags ==========
  4734. init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
  4735. return errn;
  4736. }
  4737. /*===========================================================================
  4738. FUNCTION: Check_din_V2G_Rx_MSG_SessionID
  4739. DESCRIPTION:
  4740. PRE-CONDITION:
  4741. INPUT:
  4742. OUTPUT:
  4743. GLOBAL VARIABLES:
  4744. =============================================================================*/
  4745. int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
  4746. {
  4747. int i = 0;
  4748. int leng = 0;
  4749. int errn = 0;
  4750. leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
  4751. //Step 1: Check SessionID Length
  4752. if (leng != 8) //8-byte
  4753. {
  4754. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4755. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4756. errn = -1;
  4757. }
  4758. else
  4759. {
  4760. //Step 2-1: Check SessionID content
  4761. for (i = 0; i < leng; i++)
  4762. {
  4763. if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4764. {
  4765. errn = -2;
  4766. break;
  4767. }
  4768. }
  4769. }
  4770. //Step 2-2: Print Incorrect ID
  4771. if (errn == -2) //incorrect ID
  4772. {
  4773. sprintf(buf_log_evcomm,
  4774. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4775. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
  4776. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
  4777. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
  4778. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
  4779. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
  4780. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
  4781. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
  4782. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
  4783. EVCOMM_SYS_INFO.SessionID[0],
  4784. EVCOMM_SYS_INFO.SessionID[1],
  4785. EVCOMM_SYS_INFO.SessionID[2],
  4786. EVCOMM_SYS_INFO.SessionID[3],
  4787. EVCOMM_SYS_INFO.SessionID[4],
  4788. EVCOMM_SYS_INFO.SessionID[5],
  4789. EVCOMM_SYS_INFO.SessionID[6],
  4790. EVCOMM_SYS_INFO.SessionID[7]
  4791. );
  4792. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4793. }
  4794. //Step 3: Correct SessionID for Res Message
  4795. if (errn != 0)
  4796. {
  4797. exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
  4798. memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
  4799. memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4800. }
  4801. return errn;
  4802. }
  4803. /*===========================================================================
  4804. FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
  4805. DESCRIPTION:
  4806. PRE-CONDITION:
  4807. INPUT:
  4808. OUTPUT:
  4809. GLOBAL VARIABLES:
  4810. =============================================================================*/
  4811. int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
  4812. {
  4813. int i = 0;
  4814. int leng = 0;
  4815. int errn = 0;
  4816. leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
  4817. //Step 1: Check SessionID Length
  4818. if (leng != 8) //8-byte
  4819. {
  4820. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4821. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4822. errn = -1;
  4823. }
  4824. else
  4825. {
  4826. //Step 2-1: Check SessionID content
  4827. for (i = 0; i < leng; i++)
  4828. {
  4829. if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4830. {
  4831. errn = -2;
  4832. break;
  4833. }
  4834. }
  4835. }
  4836. //Step 2-2: Print Incorrect ID
  4837. if (errn == -2) //incorrect ID
  4838. {
  4839. sprintf(buf_log_evcomm,
  4840. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4841. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
  4842. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
  4843. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
  4844. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
  4845. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
  4846. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
  4847. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
  4848. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
  4849. EVCOMM_SYS_INFO.SessionID[0],
  4850. EVCOMM_SYS_INFO.SessionID[1],
  4851. EVCOMM_SYS_INFO.SessionID[2],
  4852. EVCOMM_SYS_INFO.SessionID[3],
  4853. EVCOMM_SYS_INFO.SessionID[4],
  4854. EVCOMM_SYS_INFO.SessionID[5],
  4855. EVCOMM_SYS_INFO.SessionID[6],
  4856. EVCOMM_SYS_INFO.SessionID[7]
  4857. );
  4858. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4859. }
  4860. //Step 3: Correct SessionID for Res Message
  4861. if (errn != 0)
  4862. {
  4863. exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
  4864. memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
  4865. memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4866. }
  4867. return errn;
  4868. }
  4869. /*===========================================================================
  4870. FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
  4871. DESCRIPTION:
  4872. PRE-CONDITION:
  4873. INPUT:
  4874. OUTPUT:
  4875. GLOBAL VARIABLES:
  4876. =============================================================================*/
  4877. int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
  4878. {
  4879. int i = 0;
  4880. int leng = 0;
  4881. int errn = 0;
  4882. leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
  4883. //Step 1: Check SessionID Length
  4884. if (leng != 8) //8-byte
  4885. {
  4886. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4887. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4888. errn = -1;
  4889. }
  4890. else
  4891. {
  4892. //Step 2-1: Check SessionID content
  4893. for (i = 0; i < leng; i++)
  4894. {
  4895. if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4896. {
  4897. errn = -2;
  4898. break;
  4899. }
  4900. }
  4901. }
  4902. //Step 2-2: Print Incorrect ID
  4903. if (errn == -2) //incorrect ID
  4904. {
  4905. sprintf(buf_log_evcomm,
  4906. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4907. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
  4908. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
  4909. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
  4910. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
  4911. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
  4912. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
  4913. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
  4914. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
  4915. EVCOMM_SYS_INFO.SessionID[0],
  4916. EVCOMM_SYS_INFO.SessionID[1],
  4917. EVCOMM_SYS_INFO.SessionID[2],
  4918. EVCOMM_SYS_INFO.SessionID[3],
  4919. EVCOMM_SYS_INFO.SessionID[4],
  4920. EVCOMM_SYS_INFO.SessionID[5],
  4921. EVCOMM_SYS_INFO.SessionID[6],
  4922. EVCOMM_SYS_INFO.SessionID[7]
  4923. );
  4924. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4925. }
  4926. //Step 3: Correct SessionID for Res Message
  4927. if (errn != 0)
  4928. {
  4929. exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
  4930. memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
  4931. memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4932. }
  4933. return errn;
  4934. }
  4935. /*===========================================================================
  4936. FUNCTION: GetSchemaID_of_Protocol
  4937. DESCRIPTION:
  4938. 1. Get the SchemaID accroding to the input target
  4939. *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
  4940. *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
  4941. *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
  4942. *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
  4943. 2. [To-do] Checking Major and Minor version
  4944. 3. The parsing method will not support those private protocols,
  4945. such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
  4946. 4. [To-do] If the target is selected as DIN," but there is no DIN.
  4947. However, if EV and EVSE all support ISO, how to use ISO instead?
  4948. PRE-CONDITION:
  4949. INPUT:
  4950. 1. target: target protocol
  4951. OUTPUT:
  4952. 1. id: SchemaID of selected protocol by EVSE
  4953. 2. ShmCcsData->CommProtocol (selected protocol)
  4954. 3. SupportedAppProtocol_result
  4955. (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
  4956. (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
  4957. (3) appHandresponseCodeType_Failed_NoNegotiation = 2
  4958. GLOBAL VARIABLES:
  4959. 1. ccs_handshake
  4960. 2. ShmCcsData
  4961. =============================================================================*/
  4962. int GetSchemaID_of_Protocol(unsigned char target)
  4963. {
  4964. int i = 0;
  4965. int ii = 0;
  4966. int id = 0;
  4967. unsigned char tmp = 0;
  4968. unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
  4969. char num[10];
  4970. //struct CCS_ProtocolNamespacestructCharacters pro;
  4971. //Choose the 1st protocol as default.
  4972. //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4973. id = -1;
  4974. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4975. for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
  4976. {
  4977. //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
  4978. //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
  4979. //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
  4980. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
  4981. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
  4982. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
  4983. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
  4984. num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
  4985. num[5] = '\0';
  4986. if (atoi(num) == 70121)
  4987. {
  4988. sprintf(buf_log_evcomm,
  4989. "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4990. (i+1),
  4991. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4992. atoi(num),
  4993. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4994. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4995. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4996. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4997. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4998. #ifdef AWCCS
  4999. continue;
  5000. #endif
  5001. if (target == V2GT_MSG_PROTOCOL_DIN70121)
  5002. {
  5003. sprintf(buf_log_evcomm,
  5004. "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  5005. (i+1),
  5006. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5007. atoi(num),
  5008. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5009. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5010. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5011. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5012. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5013. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
  5014. {
  5015. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
  5016. {
  5017. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5018. }
  5019. else
  5020. { //[TC_SECC_VTB_SupportedAppProtocol_005]
  5021. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5022. }
  5023. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5024. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  5025. return id;
  5026. }
  5027. else
  5028. {
  5029. //keep looking for the suitable protocol
  5030. }
  5031. }
  5032. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5033. {
  5034. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5035. {
  5036. ii = i;
  5037. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5038. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5039. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  5040. }
  5041. else
  5042. {
  5043. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5044. }
  5045. }
  5046. else
  5047. {
  5048. //null
  5049. }
  5050. }
  5051. else if (atoi(num) == 15118)
  5052. {
  5053. //urn:din:70121:2012:MsgDef
  5054. //urn:iso:15118:2:2013:MsgDef
  5055. memset(num, 0, sizeof(num));
  5056. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
  5057. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
  5058. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
  5059. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
  5060. num[4] = '\0';
  5061. if (atoi(num) < 2018 && atoi(num) >= 2010)
  5062. {
  5063. sprintf(buf_log_evcomm,
  5064. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
  5065. (i+1),
  5066. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5067. atoi(num),
  5068. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5069. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5070. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5071. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5072. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5073. if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
  5074. {
  5075. sprintf(buf_log_evcomm,
  5076. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
  5077. (i+1),
  5078. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5079. atoi(num),
  5080. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5081. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5082. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5083. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5084. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5085. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
  5086. {
  5087. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
  5088. {
  5089. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5090. }
  5091. else
  5092. {
  5093. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5094. }
  5095. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5096. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  5097. return id;
  5098. }
  5099. else
  5100. {
  5101. //keep looking for the suitable protocol
  5102. }
  5103. }
  5104. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5105. {
  5106. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5107. {
  5108. ii = i;
  5109. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5110. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5111. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  5112. }
  5113. else
  5114. {
  5115. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5116. }
  5117. }
  5118. else
  5119. {
  5120. //null
  5121. }
  5122. }
  5123. else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
  5124. {
  5125. sprintf(buf_log_evcomm,
  5126. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
  5127. (i+1),
  5128. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5129. atoi(num),
  5130. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5131. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5132. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5133. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5134. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5135. if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
  5136. {
  5137. sprintf(buf_log_evcomm,
  5138. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
  5139. (i+1),
  5140. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5141. atoi(num),
  5142. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5143. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5144. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5145. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5146. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5147. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
  5148. {
  5149. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
  5150. {
  5151. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5152. }
  5153. else
  5154. {
  5155. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5156. }
  5157. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5158. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  5159. return id;
  5160. }
  5161. else
  5162. {
  5163. //keep looking for the suitable protocol
  5164. }
  5165. }
  5166. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5167. {
  5168. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5169. {
  5170. ii = i;
  5171. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5172. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5173. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  5174. }
  5175. else
  5176. {
  5177. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5178. }
  5179. }
  5180. else
  5181. {
  5182. //null
  5183. }
  5184. }
  5185. else
  5186. {
  5187. //Unexpected Year
  5188. sprintf(buf_log_evcomm,
  5189. "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
  5190. (i+1),
  5191. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5192. atoi(num),
  5193. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5194. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5195. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5196. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5197. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5198. //return -1;
  5199. }
  5200. }
  5201. else
  5202. {
  5203. sprintf(buf_log_evcomm,
  5204. "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
  5205. (i+1),
  5206. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5207. atoi(num),
  5208. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5209. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5210. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5211. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5212. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5213. //return -1;
  5214. }
  5215. }
  5216. //The final result of highest priority protocol
  5217. sprintf(buf_log_evcomm,
  5218. "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
  5219. (ii+1),
  5220. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5221. ShmCcsData->CommProtocol,
  5222. id,
  5223. pri);
  5224. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5225. if (id < 0)
  5226. {
  5227. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
  5228. }
  5229. return id;
  5230. }
  5231. /*===========================================================================
  5232. FUNCTION: Proc_supportedAppProtocolRes
  5233. DESCRIPTION:
  5234. PRE-CONDITION:
  5235. INPUT:
  5236. OUTPUT:
  5237. GLOBAL VARIABLES:
  5238. =============================================================================*/
  5239. int Proc_supportedAppProtocolRes(int AcceptFd)
  5240. {
  5241. int errn = 0;
  5242. bitstream_t v2g_tx_stream;
  5243. static struct ChargingInfoData *sys;
  5244. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5245. //STEP 1: =========== Setting the Response Message ===========
  5246. init_appHandEXIDocument(&ccs_handshake);
  5247. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5248. ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
  5249. //select the 1st one as the default
  5250. ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  5251. ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  5252. int id = 0;
  5253. /*+++ 20200808, vern, support both DIN and ISO +++*/
  5254. id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5255. //id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5256. /*--- 20200808, vern, support both DIN and ISO ---*/
  5257. ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
  5258. if (id < 0)
  5259. {
  5260. sprintf(buf_log_evcomm,
  5261. "[Error]No avalible CCS protocol (id = %d, preference = %d)",
  5262. id,
  5263. V2GT_MSG_PROTOCOL_PREFERENCE);
  5264. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5265. }
  5266. else
  5267. {
  5268. //selected SchemaID
  5269. ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
  5270. }
  5271. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  5272. {
  5273. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
  5274. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5275. errn = -1;
  5276. }
  5277. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5278. {
  5279. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
  5280. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5281. errn = -1;
  5282. }
  5283. else
  5284. {
  5285. //null
  5286. }
  5287. //Check for Permission Changing from TRUE to FALSE
  5288. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5289. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5290. ShmInternalComm->ChargingPermission == FALSE)
  5291. {
  5292. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][supportedAppProtocolRes]Permission OFF");
  5293. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5294. //errn = -1;
  5295. }
  5296. #if (CP_PROTECTION_MECHANISM == ENABLE)
  5297. {
  5298. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  5299. {
  5300. //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
  5301. if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
  5302. {
  5303. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5304. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5305. Update_V2G_Flow_Status(Other_Fault);
  5306. sprintf(buf_log_evcomm,
  5307. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5308. sys->CpState,
  5309. sys->CpVoltage);
  5310. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5311. }
  5312. }
  5313. #else
  5314. {
  5315. //Detect for CP State should be 9V (State B)
  5316. if (sys->CpState != 3) //B2
  5317. {
  5318. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5319. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5320. Update_V2G_Flow_Status(Other_Fault);
  5321. sprintf(buf_log_evcomm,
  5322. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5323. sys->CpState,
  5324. sys->CpVoltage);
  5325. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5326. }
  5327. }
  5328. #endif
  5329. }
  5330. #endif
  5331. //STEP 2: =========== Encode into EXI ===========
  5332. if (errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream) !=0)
  5333. {
  5334. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
  5335. return errn;
  5336. }
  5337. //STEP 3: =========== Send Response Packet ===========
  5338. int Rtn = 0;
  5339. #ifdef SUPPORT_TLS_CONNECTION
  5340. if(EvSecurity == 0)//support security
  5341. {
  5342. Rtn = SSL_write(ssl, v2g_tx_stream.data, v2g_tx_stream.size);
  5343. }
  5344. else
  5345. {
  5346. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5347. }
  5348. #else
  5349. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5350. #endif
  5351. //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5352. DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
  5353. if (Rtn < 0)
  5354. {
  5355. return Rtn;
  5356. }
  5357. //STEP 4: =========== Save into Share Memory =========
  5358. //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
  5359. //STEP 5: =========== Updating the Flow State Flag =========
  5360. if (id < 0)
  5361. {
  5362. errn = -1;
  5363. }
  5364. //STEP 6: =========== Reset Flags ============
  5365. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  5366. init_appHandEXIDocument(&ccs_handshake);
  5367. return errn;
  5368. }
  5369. /*===========================================================================
  5370. FUNCTION: Proc_supportedAppProtocolReq
  5371. DESCRIPTION:
  5372. PRE-CONDITION:
  5373. INPUT:
  5374. OUTPUT:
  5375. GLOBAL VARIABLES:
  5376. =============================================================================*/
  5377. int Proc_supportedAppProtocolReq(int AcceptFd)
  5378. {
  5379. //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
  5380. //Default: DIN 70121 (find SchemaID)
  5381. int errn = 0;
  5382. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]supportedAppProtocolReq");
  5383. SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
  5384. errn = Proc_supportedAppProtocolRes(AcceptFd);
  5385. if (errn == 0)
  5386. {
  5387. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]supportedAppProtocolRes");
  5388. }
  5389. else
  5390. {
  5391. DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
  5392. }
  5393. return errn;
  5394. }
  5395. /*===========================================================================
  5396. FUNCTION: Proc_din_SessionSetupRes
  5397. DESCRIPTION:
  5398. PRE-CONDITION:
  5399. INPUT:
  5400. OUTPUT:
  5401. GLOBAL VARIABLES:
  5402. =============================================================================*/
  5403. int Proc_din_SessionSetupRes(int AcceptFd)
  5404. {
  5405. int i = 0;
  5406. int errn = 0;
  5407. bitstream_t v2g_tx_stream;
  5408. static struct ChargingInfoData *sys;
  5409. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5410. size_t pos = 0;
  5411. v2g_tx_stream.pos = &pos;
  5412. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5413. v2g_tx_stream.data = V2GTP_Tx_buf;
  5414. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5415. init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
  5416. // ====== [BODY (1/2) ResponseCode ======
  5417. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5418. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
  5419. //[HEADER] Assign Res SessionID
  5420. ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
  5421. memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
  5422. memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5423. //Check for SequenceError
  5424. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5425. {
  5426. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
  5427. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5428. errn = -1;
  5429. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5430. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5431. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5432. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5433. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5434. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5435. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5436. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5437. }
  5438. //#if PARAMETER_NORMAL_MODE == ENABLE
  5439. //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
  5440. //#endif
  5441. //Detect for CP State should be 9V (State B)
  5442. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5443. {
  5444. #if CP_PROTECTION_MECHANISM == ENABLE
  5445. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5446. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5447. Update_V2G_Flow_Status(Other_Fault);
  5448. errn = -1;
  5449. sprintf(buf_log_evcomm,
  5450. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5451. sys->CpState);
  5452. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5453. #else
  5454. sprintf(buf_log_evcomm,
  5455. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5456. sys->CpState);
  5457. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5458. #endif
  5459. }
  5460. //Check for shutdown commands from EVSE(DC Main Board)
  5461. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5462. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5463. {
  5464. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5465. sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5466. EVSE_Shutdown,
  5467. EVSE_EmergencyShutdown,
  5468. sys->DC_EVSEStatus);
  5469. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5470. errn = -1;
  5471. }
  5472. else if (sys->DC_EVSEStatus == EVSE_Shutdown/* ||
  5473. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5474. {
  5475. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5476. sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5477. EVSE_Shutdown,
  5478. EVSE_EmergencyShutdown,
  5479. sys->DC_EVSEStatus);
  5480. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5481. //errn = -1;
  5482. }
  5483. //Check for Permission Changing from TRUE to FALSE
  5484. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5485. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5486. ShmInternalComm->ChargingPermission == FALSE)
  5487. {
  5488. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][SessionSetupRes]Permission OFF");
  5489. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5490. errn = -1;
  5491. }
  5492. // ====== [BODY (2/3) EVSEID ======
  5493. //EVSEID = all zero
  5494. memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
  5495. //vern, should be encode by SN
  5496. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 1; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5497. // ====== [BODY (3/3) DateTimeNow ======
  5498. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
  5499. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5500. #if PARAMETER_NORMAL_MODE == ENABLE
  5501. ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
  5502. #endif
  5503. // ============ Encode and Send Response Message ===========
  5504. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5505. {
  5506. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
  5507. errn = -1;
  5508. }
  5509. return errn;
  5510. }
  5511. /*===========================================================================
  5512. FUNCTION: Proc_iso1_SessionSetupRes
  5513. DESCRIPTION:
  5514. PRE-CONDITION:
  5515. INPUT:
  5516. OUTPUT:
  5517. GLOBAL VARIABLES:
  5518. =============================================================================*/
  5519. int Proc_iso1_SessionSetupRes(int AcceptFd)
  5520. {
  5521. int i = 0;
  5522. int errn = 0;
  5523. bitstream_t v2g_tx_stream;
  5524. static struct ChargingInfoData *sys;
  5525. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5526. size_t pos = 0;
  5527. v2g_tx_stream.pos = &pos;
  5528. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5529. v2g_tx_stream.data = V2GTP_Tx_buf;
  5530. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5531. init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
  5532. // ====== [BODY (1/2) ResponseCode ======
  5533. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5534. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
  5535. //[HEADER] Assign Res SessionID
  5536. ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
  5537. memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
  5538. memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5539. //Check for SequenceError
  5540. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5541. {
  5542. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5543. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5544. errn = -1;
  5545. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5546. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5547. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5548. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5549. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5550. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5551. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5552. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5553. }
  5554. //#if PARAMETER_NORMAL_MODE == ENABLE
  5555. //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
  5556. //#endif
  5557. //Detect for CP State should be 9V (State B)
  5558. //if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2 //Benz already CP=4
  5559. if ((sys->CpState < 2) ||(sys->CpState > 5)) //State B1, B2 //Benz already CP=4
  5560. {
  5561. #if CP_PROTECTION_MECHANISM == ENABLE
  5562. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5563. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5564. Update_V2G_Flow_Status(Other_Fault);
  5565. errn = -1;
  5566. sprintf(buf_log_evcomm,
  5567. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5568. sys->CpState);
  5569. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5570. #else
  5571. sprintf(buf_log_evcomm,
  5572. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5573. sys->CpState);
  5574. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5575. #endif
  5576. }
  5577. //Check for shutdown commands from EVSE(DC Main Board)
  5578. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5579. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5580. {
  5581. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5582. sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5583. EVSE_Shutdown,
  5584. EVSE_EmergencyShutdown,
  5585. sys->DC_EVSEStatus);
  5586. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5587. errn = -1;
  5588. }
  5589. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  5590. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5591. {
  5592. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5593. sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5594. EVSE_Shutdown,
  5595. EVSE_EmergencyShutdown,
  5596. sys->DC_EVSEStatus);
  5597. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5598. // errn = -1;
  5599. }
  5600. //Check for Permission Changing from TRUE to FALSE
  5601. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5602. ShmInternalComm->ChargingPermission == FALSE)
  5603. {
  5604. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][SessionSetupRes]Permission OFF");
  5605. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5606. //errn = -1;
  5607. }
  5608. // ====== [BODY (2/3) EVSEID ======
  5609. //EVSEID = all zero
  5610. memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5611. /*+++ 20200808, vern, set default EVSEID +++*/
  5612. //vern, should be encoded by SN
  5613. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[0]='Z';
  5614. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]='Z';
  5615. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[2]='0';
  5616. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[3]='0';
  5617. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[4]='0';
  5618. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[5]='0';
  5619. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[6]='0';
  5620. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 7; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5621. /*--- 20200808, vern, set default EVSEID ---*/
  5622. // ====== [BODY (3/3) DateTimeNow ======
  5623. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5624. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5625. #if PARAMETER_NORMAL_MODE == ENABLE
  5626. ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5627. #endif
  5628. // ============ Encode and Send Response Message ===========
  5629. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5630. {
  5631. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
  5632. errn = -1;
  5633. }
  5634. return errn;
  5635. }
  5636. /*===========================================================================
  5637. FUNCTION: Proc_iso2_SessionSetupRes
  5638. DESCRIPTION:
  5639. PRE-CONDITION:
  5640. INPUT:
  5641. OUTPUT:
  5642. GLOBAL VARIABLES:
  5643. =============================================================================*/
  5644. int Proc_iso2_SessionSetupRes(int AcceptFd)
  5645. {
  5646. int i = 0;
  5647. int errn = 0;
  5648. bitstream_t v2g_tx_stream;
  5649. static struct ChargingInfoData *sys;
  5650. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5651. size_t pos = 0;
  5652. v2g_tx_stream.pos = &pos;
  5653. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5654. v2g_tx_stream.data = V2GTP_Tx_buf;
  5655. init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
  5656. init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
  5657. // ====== [BODY (1/2) ResponseCode ======
  5658. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5659. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
  5660. //[HEADER] Assign Res SessionID
  5661. ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
  5662. memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
  5663. memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5664. //Check for SequenceError
  5665. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5666. {
  5667. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5668. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5669. errn = -1;
  5670. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5671. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5672. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5673. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5674. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5675. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5676. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5677. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5678. }
  5679. //#if PARAMETER_NORMAL_MODE == ENABLE
  5680. //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
  5681. //#endif
  5682. //Detect for CP State should be 9V (State B)
  5683. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5684. {
  5685. #if CP_PROTECTION_MECHANISM == ENABLE
  5686. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5687. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5688. Update_V2G_Flow_Status(Other_Fault);
  5689. errn = -1;
  5690. sprintf(buf_log_evcomm,
  5691. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
  5692. sys->CpState);
  5693. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5694. #else
  5695. sprintf(buf_log_evcomm,
  5696. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
  5697. sys->CpState);
  5698. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5699. #endif
  5700. }
  5701. //Check for shutdown commands from EVSE(DC Main Board)
  5702. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5703. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5704. {
  5705. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5706. sprintf(buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5707. EVSE_Shutdown,
  5708. EVSE_EmergencyShutdown,
  5709. sys->DC_EVSEStatus);
  5710. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5711. errn = -1;
  5712. }
  5713. //Check for Permission Changing from TRUE to FALSE
  5714. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5715. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5716. ShmInternalComm->ChargingPermission == FALSE)
  5717. {
  5718. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO2][SessionSetupRes]Permission OFF");
  5719. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5720. errn = -1;
  5721. }
  5722. // ====== [BODY (2/3) EVSEID ======
  5723. //EVSEID = all zero
  5724. memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5725. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5726. // ====== [BODY (3/3) DateTimeNow ======
  5727. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5728. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5729. #if PARAMETER_NORMAL_MODE == ENABLE
  5730. ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
  5731. #endif
  5732. // ============ Encode and Send Response Message ===========
  5733. if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
  5734. {
  5735. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
  5736. errn = -1;
  5737. }
  5738. return errn;
  5739. }
  5740. /*===========================================================================
  5741. FUNCTION: Proc_din_SessionSetupReq
  5742. DESCRIPTION:
  5743. PRE-CONDITION:
  5744. INPUT:
  5745. OUTPUT:
  5746. GLOBAL VARIABLES:
  5747. 2. ccs_exi_doc_DIN
  5748. =============================================================================*/
  5749. int Proc_din_SessionSetupReq(int AcceptFd)
  5750. {
  5751. int errn = 0;
  5752. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
  5753. //Print the decoded XML Document
  5754. PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
  5755. //Save into Share Memory
  5756. SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5757. errn = Proc_din_SessionSetupRes(AcceptFd);
  5758. if (errn == 0)
  5759. {
  5760. //successfully send response.
  5761. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]SessionSetupRes");
  5762. }
  5763. else
  5764. {
  5765. sprintf(buf_log_evcomm,
  5766. "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
  5767. errn);
  5768. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5769. }
  5770. return errn;
  5771. }
  5772. /*===========================================================================
  5773. FUNCTION: Proc_iso1_SessionSetupReq
  5774. DESCRIPTION:
  5775. PRE-CONDITION:
  5776. INPUT:
  5777. OUTPUT:
  5778. GLOBAL VARIABLES:
  5779. 2. ccs_exi_doc_ISO1
  5780. =============================================================================*/
  5781. int Proc_iso1_SessionSetupReq(int AcceptFd)
  5782. {
  5783. int errn = 0;
  5784. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
  5785. //Print the decoded XML Document
  5786. PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
  5787. //Save into Share Memory
  5788. SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5789. errn = Proc_iso1_SessionSetupRes(AcceptFd);
  5790. if (errn == 0)
  5791. {
  5792. //successfully send response.
  5793. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]SessionSetupRes");
  5794. }
  5795. else
  5796. {
  5797. sprintf(buf_log_evcomm,
  5798. "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
  5799. errn);
  5800. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5801. }
  5802. return errn;
  5803. }
  5804. /*===========================================================================
  5805. FUNCTION: Proc_iso2_SessionSetupReq
  5806. DESCRIPTION:
  5807. PRE-CONDITION:
  5808. INPUT:
  5809. OUTPUT:
  5810. GLOBAL VARIABLES:
  5811. 2. ccs_exi_doc_ISO2
  5812. =============================================================================*/
  5813. int Proc_iso2_SessionSetupReq(int AcceptFd)
  5814. {
  5815. int errn = 0;
  5816. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
  5817. //Print the decoded XML Document
  5818. PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
  5819. //Save into Share Memory
  5820. SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
  5821. errn = Proc_iso2_SessionSetupRes(AcceptFd);
  5822. if (errn == 0)
  5823. {
  5824. //successfully send response.
  5825. SAVE_SYS_LOG_MSG_EVCOMM("[ISO2][V2G][Tx]SessionSetupRes");
  5826. }
  5827. else
  5828. {
  5829. sprintf(buf_log_evcomm,
  5830. "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
  5831. errn);
  5832. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5833. }
  5834. return errn;
  5835. }
  5836. /*===========================================================================
  5837. FUNCTION: Proc_din_ServiceDiscoveryRes
  5838. DESCRIPTION:
  5839. PRE-CONDITION:
  5840. INPUT:
  5841. OUTPUT:
  5842. GLOBAL VARIABLES:
  5843. =============================================================================*/
  5844. int Proc_din_ServiceDiscoveryRes(int AcceptFd)
  5845. {
  5846. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5847. //if it is not the same, the packet should be ignored.
  5848. int i = 0;
  5849. int errn = 0;
  5850. bitstream_t v2g_tx_stream;
  5851. struct ChargingInfoData *sys;
  5852. struct ServiceDiscoveryRequest_DIN70121 *req;
  5853. struct ServiceDiscoveryResponse_DIN70121 *res;
  5854. size_t pos = 0;
  5855. v2g_tx_stream.pos = &pos;
  5856. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5857. v2g_tx_stream.data = V2GTP_Tx_buf;
  5858. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5859. req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
  5860. res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5861. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5862. init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
  5863. //[1/4] Response Code
  5864. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5865. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
  5866. //[HEADER] Check Req SessionID
  5867. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5868. {
  5869. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5870. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  5871. errn = -1;
  5872. }
  5873. //Check for SequenceError
  5874. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5875. {
  5876. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5877. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5878. errn = -1;
  5879. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5880. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5881. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5882. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5883. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5884. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5885. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5886. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5887. }
  5888. //Detect for CP State should be 9V (State B)
  5889. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5890. {
  5891. #if CP_PROTECTION_MECHANISM == ENABLE
  5892. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5893. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5894. Update_V2G_Flow_Status(Other_Fault);
  5895. errn = -1;
  5896. sprintf(buf_log_evcomm,
  5897. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  5898. sys->CpState);
  5899. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5900. #else
  5901. sprintf(buf_log_evcomm,
  5902. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5903. sys->CpState);
  5904. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5905. #endif
  5906. }
  5907. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  5908. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5909. {
  5910. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5911. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5912. // errn = -1;
  5913. }
  5914. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5915. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5916. {
  5917. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5918. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5919. errn = -1;
  5920. }
  5921. //Check for Permission Changing from TRUE to FALSE
  5922. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5923. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5924. ShmInternalComm->ChargingPermission == FALSE)
  5925. {
  5926. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServiceDiscoveryRes]Permission OFF");
  5927. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5928. // errn = -1;
  5929. }
  5930. //[2/4] PaymentOptions
  5931. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
  5932. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
  5933. //[3/4] Charge Service
  5934. res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
  5935. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
  5936. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
  5937. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5938. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
  5939. //[4/4] Service List (null, not be uesed for now.)
  5940. //#if PARAMETER_NORMAL_MODE == ENABLE
  5941. ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  5942. //#endif
  5943. // ============ Encode and Send Response Message ===========
  5944. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5945. {
  5946. errn = -1;
  5947. }
  5948. return errn;
  5949. }
  5950. /*===========================================================================
  5951. FUNCTION: Proc_iso1_ServiceDiscoveryRes
  5952. DESCRIPTION:
  5953. PRE-CONDITION:
  5954. INPUT:
  5955. OUTPUT:
  5956. GLOBAL VARIABLES:
  5957. =============================================================================*/
  5958. int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
  5959. {
  5960. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5961. //if it is not the same, the packet should be ignored.
  5962. int i = 0;
  5963. int errn = 0;
  5964. bitstream_t v2g_tx_stream;
  5965. struct ChargingInfoData *sys;
  5966. struct ServiceDiscoveryRequest_ISO15118_2014 *req;
  5967. struct ServiceDiscoveryResponse_ISO15118_2014 *res;
  5968. size_t pos = 0;
  5969. v2g_tx_stream.pos = &pos;
  5970. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5971. v2g_tx_stream.data = V2GTP_Tx_buf;
  5972. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5973. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
  5974. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5975. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5976. init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
  5977. //[1/4] Response Code
  5978. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5979. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
  5980. //[HEADER] Check Req SessionID
  5981. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5982. {
  5983. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5984. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  5985. errn = -1;
  5986. }
  5987. //Check for SequenceError
  5988. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5989. {
  5990. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5991. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5992. errn = -1;
  5993. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5994. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5995. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5996. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5997. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5998. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5999. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6000. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6001. }
  6002. //Detect for CP State should be 9V (State B)
  6003. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6004. {
  6005. #if CP_PROTECTION_MECHANISM == ENABLE
  6006. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6007. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6008. Update_V2G_Flow_Status(Other_Fault);
  6009. errn = -1;
  6010. sprintf(buf_log_evcomm,
  6011. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  6012. sys->CpState);
  6013. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6014. #else
  6015. sprintf(buf_log_evcomm,
  6016. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  6017. sys->CpState);
  6018. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6019. #endif
  6020. }
  6021. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6022. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6023. {
  6024. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6025. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  6026. errn = -1;
  6027. }
  6028. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6029. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6030. {
  6031. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6032. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  6033. // errn = -1;
  6034. }
  6035. //Check for Permission Changing from TRUE to FALSE
  6036. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6037. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6038. ShmInternalComm->ChargingPermission == FALSE)
  6039. {
  6040. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
  6041. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6042. // errn = -1;
  6043. }
  6044. //[2/4] PaymentOptionList
  6045. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
  6046. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
  6047. #ifdef SUPPORT_ISO15118_PnC
  6048. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 2u;
  6049. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[1] = iso1paymentOptionType_Contract; //0
  6050. #endif
  6051. //[3/4] Charge Service
  6052. res->ChargeService.Services.ServiceID = 1;
  6053. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
  6054. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1;
  6055. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = strlen("AC_DC_Charging");//AC_Charging
  6056. writeStringToEXIString("AC_DC_Charging", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters);
  6057. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
  6058. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1;
  6059. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
  6060. switch (ShmCcsData->EnergyTransferMode)
  6061. {
  6062. case DC_extended:
  6063. {
  6064. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  6065. break;
  6066. }
  6067. case AC_single_phase_core:
  6068. {
  6069. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
  6070. break;
  6071. }
  6072. case AC_three_phase_core:
  6073. {
  6074. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
  6075. break;
  6076. }
  6077. default:
  6078. {
  6079. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  6080. sprintf(buf_log_evcomm,
  6081. "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
  6082. ShmCcsData->EnergyTransferMode);
  6083. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6084. break;
  6085. }
  6086. }
  6087. //[4/4] Service List
  6088. i=0;
  6089. #ifdef SUPPORT_ISO15118_PnC
  6090. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  6091. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
  6092. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 2;
  6093. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
  6094. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("Certificate");
  6095. writeStringToEXIString("Certificate", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
  6096. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_ContractCertificate;
  6097. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
  6098. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
  6099. i++;
  6100. #endif
  6101. #ifdef SUPPORT_ISO15118_VAS
  6102. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  6103. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
  6104. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 3;
  6105. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
  6106. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("InternetAccess");
  6107. writeStringToEXIString("InternetAccess", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
  6108. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_Internet;
  6109. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
  6110. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
  6111. i++;
  6112. #endif
  6113. // ============ Encode and Send Response Message ===========
  6114. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6115. {
  6116. errn = -1;
  6117. }
  6118. return errn;
  6119. }
  6120. /*===========================================================================
  6121. FUNCTION: Proc_iso1_ServiceDetailReq
  6122. DESCRIPTION:
  6123. PRE-CONDITION:
  6124. INPUT:
  6125. OUTPUT:
  6126. GLOBAL VARIABLES:
  6127. =============================================================================*/
  6128. int Proc_iso1_ServiceDetailReq(int AcceptFd)
  6129. {
  6130. int errn = 0;
  6131. //Save into Share Memory
  6132. SHM_Save_iso1_ServiceDetailReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6133. errn = Proc_iso1_ServiceDetailRes(AcceptFd);
  6134. if (errn == 0)
  6135. {
  6136. //send response successfully.
  6137. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDetailRes");
  6138. }
  6139. else
  6140. {
  6141. sprintf(buf_log_evcomm,
  6142. "[Error][SeccComm][Proc_iso1_ServiceDetailReq]Proc_iso1_ServiceDetailRes(): %d (DEC)",
  6143. errn
  6144. );
  6145. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6146. }
  6147. return errn;
  6148. }
  6149. /*===========================================================================
  6150. FUNCTION: Proc_iso1_ServiceDetailRes
  6151. DESCRIPTION:
  6152. PRE-CONDITION:
  6153. INPUT:
  6154. OUTPUT:
  6155. GLOBAL VARIABLES:
  6156. =============================================================================*/
  6157. int Proc_iso1_ServiceDetailRes(int AcceptFd)
  6158. {
  6159. int i = 0;
  6160. int errn = 0;
  6161. bitstream_t v2g_tx_stream;
  6162. struct ChargingInfoData *sys;
  6163. struct ServiceDetailRequest_ISO15118_2014 *req;
  6164. struct ServiceDetailResponse_ISO15118_2014 *res;
  6165. size_t pos = 0;
  6166. v2g_tx_stream.pos = &pos;
  6167. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6168. v2g_tx_stream.data = V2GTP_Tx_buf;
  6169. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6170. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailRequest;
  6171. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailResponse;
  6172. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6173. init_iso1ServiceDetailResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes);
  6174. //[1/4] Response Code
  6175. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes_isUsed = 1u;
  6176. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_OK;
  6177. //[HEADER] Check Req SessionID
  6178. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6179. {
  6180. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6181. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6182. errn = -1;
  6183. }
  6184. //Check for SequenceError
  6185. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6186. {
  6187. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6188. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6189. errn = -1;
  6190. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6191. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6192. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6193. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6194. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6195. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6196. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6197. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6198. }
  6199. //Detect for CP State should be 9V (State B)
  6200. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6201. {
  6202. #if CP_PROTECTION_MECHANISM == ENABLE
  6203. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6204. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6205. Update_V2G_Flow_Status(Other_Fault);
  6206. errn = -1;
  6207. sprintf(buf_log_evcomm,
  6208. "[ServiceDetailRes]Emergency Stop by CP Error (%d)",
  6209. sys->CpState);
  6210. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6211. #else
  6212. sprintf(buf_log_evcomm,
  6213. "[ServiceDetailRes]Emergency Stop by CP Error (%d): ignored",
  6214. sys->CpState);
  6215. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6216. #endif
  6217. }
  6218. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6219. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6220. {
  6221. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6222. SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
  6223. errn = -1;
  6224. }
  6225. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6226. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6227. {
  6228. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6229. SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
  6230. // errn = -1;
  6231. }
  6232. //Check for Permission Changing from TRUE to FALSE
  6233. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6234. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6235. ShmInternalComm->ChargingPermission == FALSE)
  6236. {
  6237. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDetailRes]Permission OFF");
  6238. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6239. // errn = -1;
  6240. }
  6241. switch (req->ServiceID)
  6242. {
  6243. #ifdef SUPPORT_ISO15118_PnC
  6244. case 2:
  6245. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6246. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
  6247. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 2;//Installation(1), Update(2)
  6248. //=============Set ParameterSet===================
  6249. {
  6250. unsigned char ServiceName[16];
  6251. for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
  6252. {
  6253. memset(ServiceName,0,sizeof(ServiceName));
  6254. switch (j)
  6255. {
  6256. case 0://ftp with port 20
  6257. strcpy(ServiceName,"Installation");
  6258. break;
  6259. case 1://ftp with port 21
  6260. strcpy(ServiceName,"Update");
  6261. break;
  6262. default:
  6263. break;
  6264. }
  6265. if(strlen(ServiceName)>0)
  6266. {
  6267. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
  6268. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=1;//Service
  6269. //Name= Protocol
  6270. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Service");
  6271. writeStringToEXIString("Service", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
  6272. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
  6273. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ServiceName);
  6274. writeStringToEXIString(ServiceName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
  6275. }
  6276. else
  6277. break;
  6278. }//for
  6279. }
  6280. break;
  6281. #endif
  6282. #ifdef SUPPORT_ISO15118_VAS
  6283. case 3:
  6284. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6285. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
  6286. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 4;//ftp(1), ftp(2), http(3), https(4)
  6287. //=============Set ParameterSet===================
  6288. {
  6289. unsigned char ProtocolName[16];
  6290. int ProtocolPort;
  6291. for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
  6292. {
  6293. memset(ProtocolName,0,sizeof(ProtocolName));
  6294. switch (j)
  6295. {
  6296. case 0://ftp with port 20
  6297. strcpy(ProtocolName,"ftp");
  6298. ProtocolPort=20;
  6299. break;
  6300. case 1://ftp with port 21
  6301. strcpy(ProtocolName,"ftp");
  6302. ProtocolPort=21;
  6303. break;
  6304. case 2://http with port 80
  6305. strcpy(ProtocolName,"http");
  6306. ProtocolPort=80;
  6307. break;
  6308. case 3://https with port 443
  6309. strcpy(ProtocolName,"https");
  6310. ProtocolPort=443;
  6311. break;
  6312. default:
  6313. break;
  6314. }
  6315. if(strlen(ProtocolName)>0)
  6316. {
  6317. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
  6318. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=2;//protocol and port
  6319. //Name= Protocol
  6320. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6321. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
  6322. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
  6323. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ProtocolName);
  6324. writeStringToEXIString(ProtocolName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
  6325. //Name= Port
  6326. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.charactersLen= strlen("Port");
  6327. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.characters);
  6328. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue_isUsed=1;
  6329. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue=ProtocolPort;
  6330. }
  6331. else
  6332. break;
  6333. }//for
  6334. }
  6335. /*
  6336. //=============http,ParameterSetID=3===================
  6337. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].ParameterSetID=3;//http
  6338. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.arrayLen=2;//protocol and port
  6339. //Name= Protocol, value= "HTTP"
  6340. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6341. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters);
  6342. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue_isUsed=1;
  6343. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.charactersLen=strlen("http");
  6344. writeStringToEXIString("http", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.characters);
  6345. //Name= Port, value= 80
  6346. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.charactersLen= strlen("Port");
  6347. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters);
  6348. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue_isUsed=1;
  6349. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue=80;
  6350. //==================https,ParameterSetID=4=====================
  6351. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].ParameterSetID=4;//https
  6352. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.arrayLen=2;//protocol and port
  6353. //Name= Protocol, value= "HTTP"
  6354. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6355. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters);
  6356. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue_isUsed=1;
  6357. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.charactersLen=strlen("https");
  6358. writeStringToEXIString("https", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.characters);
  6359. //Name= Port, value= 443
  6360. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.charactersLen= strlen("Port");
  6361. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.characters);
  6362. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue_isUsed=1;
  6363. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue=443;
  6364. */
  6365. break;
  6366. #endif
  6367. default:
  6368. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6369. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 0;
  6370. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_ServiceIDInvalid;
  6371. break;
  6372. }
  6373. // ============ Encode and Send Response Message ===========
  6374. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6375. {
  6376. errn = -1;
  6377. }
  6378. return errn;
  6379. }
  6380. /*===========================================================================
  6381. FUNCTION: Proc_din_ServiceDiscoveryReq
  6382. DESCRIPTION:
  6383. PRE-CONDITION:
  6384. INPUT:
  6385. OUTPUT:
  6386. GLOBAL VARIABLES:
  6387. =============================================================================*/
  6388. int Proc_din_ServiceDiscoveryReq(int AcceptFd)
  6389. {
  6390. int errn = 0;
  6391. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  6392. //Print the decoded XML Document
  6393. PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
  6394. //Save into Share Memory
  6395. SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6396. errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
  6397. if (errn == 0)
  6398. {
  6399. //send response successfully.
  6400. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceDiscoveryRes");
  6401. }
  6402. else
  6403. {
  6404. sprintf(buf_log_evcomm,
  6405. "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
  6406. errn
  6407. );
  6408. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6409. }
  6410. return errn;
  6411. }
  6412. /*===========================================================================
  6413. FUNCTION: Proc_iso1_ServiceDiscoveryReq
  6414. DESCRIPTION:
  6415. PRE-CONDITION:
  6416. INPUT:
  6417. OUTPUT:
  6418. GLOBAL VARIABLES:
  6419. =============================================================================*/
  6420. int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
  6421. {
  6422. int errn = 0;
  6423. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  6424. //Print the decoded XML Document
  6425. PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
  6426. //Save into Share Memory
  6427. SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6428. errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
  6429. if (errn == 0)
  6430. {
  6431. //send response successfully.
  6432. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDiscoveryRes");
  6433. }
  6434. else
  6435. {
  6436. sprintf(buf_log_evcomm,
  6437. "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
  6438. errn
  6439. );
  6440. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6441. }
  6442. return errn;
  6443. }
  6444. /*===========================================================================
  6445. FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
  6446. DESCRIPTION:
  6447. PRE-CONDITION:
  6448. INPUT:
  6449. OUTPUT:
  6450. GLOBAL VARIABLES:
  6451. =============================================================================*/
  6452. int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
  6453. {
  6454. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6455. //if it is not the same, the packet should be ignored.
  6456. int i = 0;
  6457. int errn = 0;
  6458. bitstream_t v2g_tx_stream;
  6459. struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
  6460. struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
  6461. struct ServiceDiscoveryResponse_DIN70121 *sd_res;
  6462. struct ChargingInfoData *sys;
  6463. size_t pos = 0;
  6464. v2g_tx_stream.pos = &pos;
  6465. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6466. v2g_tx_stream.data = V2GTP_Tx_buf;
  6467. req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
  6468. res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
  6469. sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  6470. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6471. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6472. init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
  6473. //[1/1] Response Code
  6474. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
  6475. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
  6476. //[HEADER] Check Req SessionID
  6477. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6478. {
  6479. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6480. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6481. errn = -1;
  6482. }
  6483. //Check for SequenceError
  6484. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6485. {
  6486. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6487. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6488. errn = -1;
  6489. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6490. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6491. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6492. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6493. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6494. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6495. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6496. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6497. }
  6498. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6499. if (req->SelectedPaymentOption != dinpaymentOptionType_ExternalPayment) //1
  6500. {
  6501. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
  6502. sprintf(buf_log_evcomm,
  6503. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6504. req->SelectedPaymentOption);
  6505. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6506. errn = -1;
  6507. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6508. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6509. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6510. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6511. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6512. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6513. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6514. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6515. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6516. }
  6517. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  6518. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
  6519. {
  6520. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
  6521. sprintf(buf_log_evcomm,
  6522. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6523. req->SelectedServiceList.SelectedService[0].ServiceID);
  6524. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6525. errn = -1;
  6526. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6527. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6528. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6529. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6530. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6531. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6532. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6533. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6534. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6535. }
  6536. //Detect for CP State should be 9V (State B)
  6537. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6538. {
  6539. #if CP_PROTECTION_MECHANISM == ENABLE
  6540. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6541. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6542. Update_V2G_Flow_Status(Other_Fault);
  6543. errn = -1;
  6544. sprintf(buf_log_evcomm,
  6545. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6546. sys->CpState);
  6547. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6548. #else
  6549. sprintf(buf_log_evcomm,
  6550. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6551. sys->CpState);
  6552. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6553. #endif
  6554. }
  6555. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6556. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6557. {
  6558. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6559. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6560. // errn = -1;
  6561. }
  6562. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6563. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6564. {
  6565. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6566. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6567. errn = -1;
  6568. }
  6569. //Check for Permission Changing from TRUE to FALSE
  6570. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6571. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6572. ShmInternalComm->ChargingPermission == FALSE)
  6573. {
  6574. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
  6575. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6576. //errn = -1;
  6577. }
  6578. // ============ Encode and Send Response Message ===========
  6579. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6580. {
  6581. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6582. errn = -1;
  6583. }
  6584. return errn;
  6585. }
  6586. /*===========================================================================
  6587. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
  6588. DESCRIPTION:
  6589. PRE-CONDITION:
  6590. INPUT:
  6591. OUTPUT:
  6592. GLOBAL VARIABLES:
  6593. =============================================================================*/
  6594. int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
  6595. {
  6596. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6597. //if it is not the same, the packet should be ignored.
  6598. int i = 0;
  6599. int errn = 0;
  6600. bitstream_t v2g_tx_stream;
  6601. struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
  6602. struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
  6603. struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
  6604. static struct ChargingInfoData *sys;
  6605. size_t pos = 0;
  6606. v2g_tx_stream.pos = &pos;
  6607. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6608. v2g_tx_stream.data = V2GTP_Tx_buf;
  6609. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
  6610. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
  6611. sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  6612. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6613. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6614. init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
  6615. //[1/1] Response Code
  6616. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
  6617. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
  6618. //[HEADER] Check Req SessionID
  6619. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6620. {
  6621. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6622. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6623. errn = -1;
  6624. }
  6625. //Check for SequenceError
  6626. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6627. {
  6628. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6629. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6630. errn = -1;
  6631. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6632. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6633. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6634. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6635. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6636. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6637. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6638. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6639. }
  6640. #ifdef SUPPORT_ISO15118_PnC
  6641. if (req->SelectedPaymentOption > iso1paymentOptionType_ExternalPayment) //1
  6642. {
  6643. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6644. sprintf(buf_log_evcomm,
  6645. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6646. req->SelectedPaymentOption);
  6647. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6648. errn = -1;
  6649. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6650. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6651. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6652. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6653. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6654. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6655. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6656. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6657. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6658. }
  6659. #else
  6660. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6661. if (req->SelectedPaymentOption != iso1paymentOptionType_ExternalPayment) //1
  6662. {
  6663. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6664. sprintf(buf_log_evcomm,
  6665. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6666. req->SelectedPaymentOption);
  6667. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6668. errn = -1;
  6669. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6670. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6671. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6672. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6673. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6674. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6675. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6676. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6677. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6678. }
  6679. #endif
  6680. for(i=0;i<req->SelectedServiceList.SelectedServiceLen;i++)
  6681. {
  6682. switch(req->SelectedServiceList.SelectedService[i].ServiceID)
  6683. {
  6684. case 1:
  6685. break;
  6686. case 2:
  6687. #ifndef SUPPORT_ISO15118_PnC
  6688. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6689. sprintf(buf_log_evcomm,
  6690. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6691. req->SelectedServiceList.SelectedService[0].ServiceID);
  6692. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6693. errn = -1;
  6694. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6695. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6696. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6697. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6698. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6699. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6700. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6701. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6702. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6703. #endif
  6704. break;
  6705. case 3:
  6706. #ifndef SUPPORT_ISO15118_VAS
  6707. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6708. sprintf(buf_log_evcomm,
  6709. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6710. req->SelectedServiceList.SelectedService[0].ServiceID);
  6711. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6712. errn = -1;
  6713. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6714. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6715. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6716. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6717. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6718. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6719. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6720. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6721. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6722. #endif
  6723. break;
  6724. default:
  6725. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6726. sprintf(buf_log_evcomm,
  6727. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6728. req->SelectedServiceList.SelectedService[0].ServiceID);
  6729. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6730. errn = -1;
  6731. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6732. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6733. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6734. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6735. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6736. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6737. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6738. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6739. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6740. break;
  6741. }
  6742. }
  6743. //Detect for CP State should be 9V (State B)
  6744. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6745. {
  6746. #if CP_PROTECTION_MECHANISM == ENABLE
  6747. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6748. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6749. Update_V2G_Flow_Status(Other_Fault);
  6750. errn = -1;
  6751. sprintf(buf_log_evcomm,
  6752. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6753. sys->CpState);
  6754. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6755. #else
  6756. sprintf(buf_log_evcomm,
  6757. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6758. sys->CpState);
  6759. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6760. #endif
  6761. }
  6762. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6763. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6764. {
  6765. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6766. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6767. //errn = -1;
  6768. }
  6769. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6770. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6771. {
  6772. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6773. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6774. errn = -1;
  6775. }
  6776. //Check for Permission Changing from TRUE to FALSE
  6777. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6778. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6779. ShmInternalComm->ChargingPermission == FALSE)
  6780. {
  6781. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
  6782. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6783. // errn = -1;
  6784. }
  6785. // ============ Encode and Send Response Message ===========
  6786. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6787. {
  6788. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6789. errn = -1;
  6790. }
  6791. return errn;
  6792. }
  6793. /*===========================================================================
  6794. FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
  6795. DESCRIPTION:
  6796. PRE-CONDITION:
  6797. INPUT:
  6798. OUTPUT:
  6799. GLOBAL VARIABLES:
  6800. =============================================================================*/
  6801. int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
  6802. {
  6803. int errn = 0;
  6804. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6805. //Print the decoded XML Document
  6806. PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
  6807. //Save into Share Memory
  6808. SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6809. errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
  6810. if (errn == 0)
  6811. {
  6812. //send response successfully.
  6813. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
  6814. }
  6815. else
  6816. {
  6817. sprintf(buf_log_evcomm,
  6818. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6819. errn);
  6820. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6821. }
  6822. return errn;
  6823. }
  6824. /*===========================================================================
  6825. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
  6826. DESCRIPTION:
  6827. PRE-CONDITION:
  6828. INPUT:
  6829. OUTPUT:
  6830. GLOBAL VARIABLES:
  6831. =============================================================================*/
  6832. int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
  6833. {
  6834. int errn = 0;
  6835. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6836. //Print the decoded XML Document
  6837. PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
  6838. //Save into Share Memory
  6839. SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6840. errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
  6841. if (errn == 0)
  6842. {
  6843. //send response successfully.
  6844. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
  6845. }
  6846. else
  6847. {
  6848. sprintf(buf_log_evcomm,
  6849. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6850. errn);
  6851. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6852. }
  6853. return errn;
  6854. }
  6855. /*===========================================================================
  6856. FUNCTION: Proc_din_ContractAuthenticationRes
  6857. DESCRIPTION:
  6858. PRE-CONDITION:
  6859. INPUT:
  6860. OUTPUT:
  6861. GLOBAL VARIABLES:
  6862. =============================================================================*/
  6863. int Proc_din_ContractAuthenticationRes(int AcceptFd)
  6864. {
  6865. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6866. //if it is not the same, the packet should be ignored.
  6867. int i = 0;
  6868. int errn = 0;
  6869. bitstream_t v2g_tx_stream;
  6870. static struct ChargingInfoData *sys;
  6871. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6872. size_t pos = 0;
  6873. v2g_tx_stream.pos = &pos;
  6874. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6875. v2g_tx_stream.data = V2GTP_Tx_buf;
  6876. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6877. init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
  6878. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
  6879. //[BODY (1/2)] ResponseCode
  6880. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
  6881. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6882. //[HEADER] Check Req SessionID
  6883. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6884. {
  6885. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6886. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6887. errn = -1;
  6888. }
  6889. //Check for SequenceError
  6890. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6891. {
  6892. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6893. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6894. errn = -1;
  6895. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6896. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6897. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6898. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6899. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6900. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6901. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6902. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6903. }
  6904. //Detect for CP State should be 9V (State B)
  6905. #if CP_PROTECTION_MECHANISM == ENABLE
  6906. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6907. {
  6908. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6909. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6910. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6911. Update_V2G_Flow_Status(Other_Fault);
  6912. errn = -1;
  6913. sprintf(buf_log_evcomm,
  6914. "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
  6915. sys->CpState);
  6916. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6917. }
  6918. #endif
  6919. //Check for CSU command of "Stop by EVSE"
  6920. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6921. {
  6922. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6923. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6924. // errn = -1;
  6925. }
  6926. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6927. {
  6928. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6929. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6930. errn = -1;
  6931. }
  6932. //[BODY (2/2)] EVSEProcessing
  6933. if(ShmInternalComm->ChargingPermission == TRUE)
  6934. {
  6935. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6936. SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
  6937. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6938. {
  6939. //Set PWM as 5% (for SLAC first case)
  6940. SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
  6941. SwitchCpStateE(DISABLE);
  6942. OutputCpPwmDuty(5);
  6943. }
  6944. #endif
  6945. }
  6946. //Check for Permission Changing from TRUE to FALSE
  6947. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6948. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6949. ShmInternalComm->ChargingPermission == FALSE)
  6950. {
  6951. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ContractAuthenticationRes]Permission OFF");
  6952. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6953. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6954. // errn = -1;
  6955. }
  6956. #if PARAMETER_NORMAL_MODE == ENABLE
  6957. ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
  6958. #endif
  6959. // ============ Encode and Send Response Message ===========
  6960. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6961. {
  6962. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6963. errn = -1;
  6964. }
  6965. return errn;
  6966. }
  6967. /*===========================================================================
  6968. FUNCTION: Proc_iso1_AuthorizationRes
  6969. DESCRIPTION:
  6970. PRE-CONDITION:
  6971. INPUT:
  6972. OUTPUT:
  6973. GLOBAL VARIABLES:
  6974. =============================================================================*/
  6975. int Proc_iso1_AuthorizationRes(int AcceptFd)
  6976. {
  6977. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6978. //if it is not the same, the packet should be ignored.
  6979. int i = 0;
  6980. int errn = 0;
  6981. bitstream_t v2g_tx_stream;
  6982. static struct ChargingInfoData *sys;
  6983. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6984. size_t pos = 0;
  6985. v2g_tx_stream.pos = &pos;
  6986. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6987. v2g_tx_stream.data = V2GTP_Tx_buf;
  6988. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6989. init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
  6990. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  6991. //[BODY (1/2)] ResponseCode
  6992. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
  6993. /*+++ 20200808, vern, EVSEProcessing should be waiting for Customer during authrization +++*/
  6994. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction; //0
  6995. /*--- 20200808, vern, should be waiting for Customer during authrization ---*/
  6996. //[HEADER] Check Req SessionID
  6997. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6998. {
  6999. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7000. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7001. errn = -1;
  7002. }
  7003. //Check for SequenceError
  7004. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7005. {
  7006. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7007. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7008. errn = -1;
  7009. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7010. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7011. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7012. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7013. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7014. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7015. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7016. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7017. }
  7018. //Detect for CP State should be 9V (State B)
  7019. #if CP_PROTECTION_MECHANISM == ENABLE
  7020. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  7021. {
  7022. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
  7023. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7024. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7025. Update_V2G_Flow_Status(Other_Fault);
  7026. errn = -1;
  7027. sprintf(buf_log_evcomm,
  7028. "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
  7029. sys->CpState);
  7030. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7031. }
  7032. #endif
  7033. //Check for CSU command of "Stop by EVSE"
  7034. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7035. {
  7036. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7037. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7038. //errn = -1;
  7039. }
  7040. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7041. {
  7042. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7043. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7044. errn = -1;
  7045. }
  7046. //[BODY (2/2)] EVSEProcessing
  7047. //Check for Permission from CSU
  7048. if(ShmInternalComm->ChargingPermission == TRUE)
  7049. {
  7050. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7051. SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
  7052. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  7053. {
  7054. //Set PWM as 5% (for SLAC first case)
  7055. SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
  7056. SwitchCpStateE(DISABLE);
  7057. OutputCpPwmDuty(5);
  7058. }
  7059. #endif
  7060. }
  7061. //Check for Permission Changing from TRUE to FALSE
  7062. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  7063. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  7064. ShmInternalComm->ChargingPermission == FALSE)
  7065. {
  7066. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][AuthorizationRes]Permission OFF");
  7067. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7068. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7069. // errn = -1;
  7070. }
  7071. #if PARAMETER_NORMAL_MODE == ENABLE
  7072. ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7073. #endif
  7074. // ============ Encode and Send Response Message ===========
  7075. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7076. {
  7077. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7078. errn = -1;
  7079. }
  7080. return errn;
  7081. }
  7082. /*===========================================================================
  7083. FUNCTION: Proc_din_ContractAuthenticationReq
  7084. DESCRIPTION:
  7085. PRE-CONDITION:
  7086. INPUT:
  7087. OUTPUT:
  7088. GLOBAL VARIABLES:
  7089. =============================================================================*/
  7090. int Proc_din_ContractAuthenticationReq(int AcceptFd)
  7091. {
  7092. int errn = 0;
  7093. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
  7094. //Print the decoded XML Document
  7095. PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
  7096. //Save into Share Memory
  7097. SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7098. errn = Proc_din_ContractAuthenticationRes(AcceptFd);
  7099. if (errn == 0)
  7100. {
  7101. //send response successfully.
  7102. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ContractAuthenticationRes");
  7103. }
  7104. else
  7105. {
  7106. sprintf(buf_log_evcomm,
  7107. "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  7108. errn);
  7109. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7110. }
  7111. return errn;
  7112. }
  7113. /*===========================================================================
  7114. FUNCTION: Proc_iso1_AuthenticationReq
  7115. DESCRIPTION:
  7116. PRE-CONDITION:
  7117. INPUT:
  7118. OUTPUT:
  7119. GLOBAL VARIABLES:
  7120. =============================================================================*/
  7121. int Proc_iso1_AuthenticationReq(int AcceptFd)
  7122. {
  7123. int errn = 0;
  7124. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
  7125. //Print the decoded XML Document
  7126. PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
  7127. //Save into Share Memory
  7128. SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7129. errn = Proc_iso1_AuthorizationRes(AcceptFd);
  7130. if (errn == 0)
  7131. {
  7132. //send response successfully.
  7133. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]AuthorizationRes");
  7134. }
  7135. else
  7136. {
  7137. sprintf(buf_log_evcomm,
  7138. "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  7139. errn);
  7140. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7141. }
  7142. return errn;
  7143. }
  7144. /*===========================================================================
  7145. FUNCTION: SHM_Init_dinDC_EVSEStatusType
  7146. DESCRIPTION:
  7147. PRE-CONDITION:
  7148. INPUT:
  7149. 1. in
  7150. OUTPUT:
  7151. 2. out
  7152. GLOBAL VARIABLES:
  7153. =============================================================================*/
  7154. void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
  7155. {
  7156. in->EVSEIsolationStatus = dinisolationLevelType_Valid;
  7157. // dinisolationLevelType_Invalid = 0,
  7158. // dinisolationLevelType_Valid = 1, (default)
  7159. // dinisolationLevelType_Warning = 2,
  7160. // dinisolationLevelType_Fault = 3
  7161. in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7162. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7163. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
  7164. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7165. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7166. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7167. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7168. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7169. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7170. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7171. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7172. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7173. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7174. in->EVSENotification = dinEVSENotificationType_None;
  7175. // dinEVSENotificationType_None = 0, (default)
  7176. // dinEVSENotificationType_StopCharging = 1,
  7177. // dinEVSENotificationType_ReNegotiation = 2
  7178. }
  7179. /*===========================================================================
  7180. FUNCTION: SHM_Save_dinPhysicalValueType
  7181. DESCRIPTION:
  7182. PRE-CONDITION:
  7183. INPUT:
  7184. OUTPUT:
  7185. GLOBAL VARIABLES:
  7186. =============================================================================*/
  7187. void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
  7188. {
  7189. obj->Value = value;
  7190. obj->Multiplier = multiplier;
  7191. obj->Unit =unit;
  7192. }
  7193. /*===========================================================================
  7194. FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
  7195. DESCRIPTION:
  7196. PRE-CONDITION:
  7197. INPUT:
  7198. 1. shm_ccs
  7199. OUTPUT:
  7200. 2. shm_ccs
  7201. GLOBAL VARIABLES:
  7202. =============================================================================*/
  7203. void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
  7204. {
  7205. struct ChargeParameterDiscoveryResponse_DIN70121 *in;
  7206. in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  7207. //----- [BODY (1/5)] ResponseCode -----
  7208. in->ResponseCode = dinresponseCodeType_OK;
  7209. //----- [BODY (2/5)] EVSEProcessing -----
  7210. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  7211. // dinEVSEProcessingType_Finished = 0,
  7212. // dinEVSEProcessingType_Ongoing = 1
  7213. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7214. //be fixed in another function.
  7215. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7216. //ignore, since DIN doesn't support AC
  7217. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7218. struct DC_EVSEChargeParameterType_DIN70121 *in_para;
  7219. in_para = &in->DC_EVSEChargeParameter;
  7220. //DC_EVSEStatus
  7221. SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
  7222. in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7223. short value = 0; int multiplier = 0; unsigned char unit = 0;
  7224. //EVSEMaximumCurrentLimit
  7225. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  7226. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
  7227. //EVSEMaximumPowerLimit
  7228. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  7229. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
  7230. //EVSEMaximumVoltageLimit
  7231. value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  7232. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
  7233. //EVSEMinimumVoltageLimit
  7234. value = 1500; multiplier = -1; unit = V_DIN70121; //150V
  7235. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
  7236. //EVSEMinimumCurrentLimit
  7237. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  7238. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
  7239. //EVSECurrentRegulationTolerance
  7240. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  7241. SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
  7242. //EVSEPeakCurrentRipple
  7243. value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
  7244. SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
  7245. //EVSEEnergyToBeDelivered (optional)
  7246. //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
  7247. }
  7248. /*===========================================================================
  7249. FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
  7250. DESCRIPTION:
  7251. PRE-CONDITION:
  7252. INPUT:
  7253. OUTPUT:
  7254. GLOBAL VARIABLES:
  7255. =============================================================================*/
  7256. void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
  7257. {
  7258. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7259. init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
  7260. ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  7261. //----- [BODY (1/5)] ResponseCode -----
  7262. struct dinChargeParameterDiscoveryResType *res;
  7263. res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
  7264. res->ResponseCode = dinresponseCodeType_OK;
  7265. //----- [BODY (2/5)] EVSEProcessing -----
  7266. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  7267. // dinEVSEProcessingType_Finished = 0,
  7268. // dinEVSEProcessingType_Ongoing = 1
  7269. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7270. res->SAScheduleList_isUsed = 1u;
  7271. struct dinSAScheduleListType *list;
  7272. list = &res->SAScheduleList;
  7273. //
  7274. list->SAScheduleTuple.arrayLen = 1;
  7275. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  7276. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
  7277. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  7278. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  7279. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  7280. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  7281. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  7282. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  7283. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  7284. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  7285. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  7286. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7287. //ignore, since DIN doesn't support AC
  7288. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7289. res->DC_EVSEChargeParameter_isUsed = 1u;
  7290. struct dinDC_EVSEChargeParameterType *para;
  7291. para = &res->DC_EVSEChargeParameter;
  7292. //DC_EVSEStatus
  7293. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7294. para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7295. // dinisolationLevelType_Invalid = 0,
  7296. // dinisolationLevelType_Valid = 1,
  7297. // dinisolationLevelType_Warning = 2,
  7298. // dinisolationLevelType_Fault = 3
  7299. para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7300. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7301. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7302. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7303. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7304. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7305. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7306. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7307. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7308. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7309. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7310. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7311. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7312. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7313. para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7314. // dinEVSENotificationType_None = 0,
  7315. // dinEVSENotificationType_StopCharging = 1,
  7316. // dinEVSENotificationType_ReNegotiation = 2
  7317. //EVSEMaximumCurrentLimit
  7318. para->EVSEMaximumCurrentLimit.Value = 2400;
  7319. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  7320. para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  7321. para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  7322. // dinunitSymbolType_h = 0,
  7323. // dinunitSymbolType_m = 1,
  7324. // dinunitSymbolType_s = 2,
  7325. // dinunitSymbolType_A = 3,
  7326. // dinunitSymbolType_Ah = 4,
  7327. // dinunitSymbolType_V = 5,
  7328. // dinunitSymbolType_VA = 6,
  7329. // dinunitSymbolType_W = 7,
  7330. // dinunitSymbolType_W_s = 8,
  7331. // dinunitSymbolType_Wh = 9
  7332. //EVSEMaximumPowerLimit
  7333. para->EVSEMaximumPowerLimit.Value = 6000;
  7334. para->EVSEMaximumPowerLimit.Multiplier = 1;
  7335. para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  7336. para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  7337. //EVSEMaximumVoltageLimit
  7338. para->EVSEMaximumVoltageLimit.Value = 7500;
  7339. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  7340. para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  7341. para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  7342. //EVSEMinimumVoltageLimit
  7343. para->EVSEMinimumVoltageLimit.Value = 1500;
  7344. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  7345. para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  7346. para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
  7347. //EVSEMinimumCurrentLimit
  7348. para->EVSEMinimumCurrentLimit.Value = 20;
  7349. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  7350. para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  7351. para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
  7352. //EVSECurrentRegulationTolerance_isUsed
  7353. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  7354. //EVSECurrentRegulationTolerance
  7355. para->EVSECurrentRegulationTolerance.Value = 10;
  7356. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  7357. para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  7358. para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
  7359. //EVSEEnergyToBeDelivered_isUsed
  7360. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  7361. //EVSEPeakCurrentRipple
  7362. para->EVSEPeakCurrentRipple.Value = 2;
  7363. para->EVSEPeakCurrentRipple.Multiplier = -1;
  7364. para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  7365. para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
  7366. //EVSEEnergyToBeDelivered (optional)
  7367. /*
  7368. para->EVSEEnergyToBeDelivered.Value = 360;
  7369. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  7370. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  7371. para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
  7372. */
  7373. }
  7374. /*===========================================================================
  7375. FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
  7376. DESCRIPTION:
  7377. PRE-CONDITION:
  7378. INPUT:
  7379. OUTPUT:
  7380. GLOBAL VARIABLES:
  7381. =============================================================================*/
  7382. void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
  7383. {
  7384. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7385. init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
  7386. ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  7387. //----- [BODY (1/5)] ResponseCode -----
  7388. struct iso1ChargeParameterDiscoveryResType *res;
  7389. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
  7390. res->ResponseCode = iso1responseCodeType_OK;
  7391. //----- [BODY (2/5)] EVSEProcessing -----
  7392. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7393. // iso1EVSEProcessingType_Finished = 0,
  7394. // iso1EVSEProcessingType_Ongoing = 1
  7395. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7396. res->SAScheduleList_isUsed = 1u;
  7397. struct iso1SAScheduleListType *list;
  7398. list = &res->SAScheduleList;
  7399. //
  7400. list->SAScheduleTuple.arrayLen = 1;
  7401. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  7402. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  7403. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  7404. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  7405. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  7406. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  7407. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  7408. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  7409. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  7410. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  7411. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7412. //ignore, since our ISO1 doesn't support AC, yet
  7413. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7414. res->DC_EVSEChargeParameter_isUsed = 1u;
  7415. struct iso1DC_EVSEChargeParameterType *para;
  7416. para = &res->DC_EVSEChargeParameter;
  7417. //DC_EVSEStatus
  7418. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7419. para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7420. // iso1isolationLevelType_Invalid = 0,
  7421. // iso1isolationLevelType_Valid = 1,
  7422. // iso1isolationLevelType_Warning = 2,
  7423. // iso1isolationLevelType_Fault = 3
  7424. para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7425. // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7426. // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7427. // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7428. // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7429. // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7430. // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7431. // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7432. // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7433. // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7434. // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7435. // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7436. // iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7437. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7438. para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7439. // iso1EVSENotificationType_None = 0,
  7440. // iso1EVSENotificationType_StopCharging = 1,
  7441. // iso1EVSENotificationType_ReNegotiation = 2
  7442. //EVSEMaximumCurrentLimit
  7443. para->EVSEMaximumCurrentLimit.Value = 2400;
  7444. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  7445. //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  7446. para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  7447. //iso1unitSymbolType_h = 0,
  7448. //iso1unitSymbolType_m = 1,
  7449. //iso1unitSymbolType_s = 2,
  7450. //iso1unitSymbolType_A = 3,
  7451. //iso1unitSymbolType_V = 4,
  7452. //iso1unitSymbolType_W = 5,
  7453. //iso1unitSymbolType_Wh = 6
  7454. //EVSEMaximumPowerLimit
  7455. para->EVSEMaximumPowerLimit.Value = 6000;
  7456. para->EVSEMaximumPowerLimit.Multiplier = 1;
  7457. //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  7458. para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  7459. //EVSEMaximumVoltageLimit
  7460. para->EVSEMaximumVoltageLimit.Value = 7500;
  7461. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  7462. //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  7463. para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  7464. //EVSEMinimumVoltageLimit
  7465. para->EVSEMinimumVoltageLimit.Value = 1500;
  7466. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  7467. //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  7468. para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
  7469. //EVSEMinimumCurrentLimit
  7470. para->EVSEMinimumCurrentLimit.Value = 20;
  7471. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  7472. //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  7473. para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
  7474. //EVSECurrentRegulationTolerance_isUsed
  7475. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  7476. //EVSECurrentRegulationTolerance
  7477. para->EVSECurrentRegulationTolerance.Value = 10;
  7478. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  7479. //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  7480. para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
  7481. //EVSEEnergyToBeDelivered_isUsed
  7482. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  7483. //EVSEPeakCurrentRipple
  7484. para->EVSEPeakCurrentRipple.Value = 2;
  7485. para->EVSEPeakCurrentRipple.Multiplier = -1;
  7486. //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  7487. para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
  7488. //EVSEEnergyToBeDelivered (optional)
  7489. /*
  7490. para->EVSEEnergyToBeDelivered.Value = 360;
  7491. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  7492. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  7493. para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
  7494. */
  7495. }
  7496. /*===========================================================================
  7497. FUNCTION: Proc_din_ChargeParameterDiscoveryRes
  7498. DESCRIPTION:
  7499. PRE-CONDITION:
  7500. INPUT:
  7501. OUTPUT:
  7502. GLOBAL VARIABLES:
  7503. =============================================================================*/
  7504. int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
  7505. {
  7506. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7507. //if it is not the same, the packet should be ignored.
  7508. //STEP 1: ============ Initialize ============
  7509. int errn = 0;
  7510. bitstream_t v2g_tx_stream;
  7511. struct ChargeParameterDiscoveryResponse_DIN70121 *res;
  7512. struct ChargeParameterDiscoveryRequest_DIN70121 *req;
  7513. struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
  7514. struct ChargingInfoData *sys;
  7515. size_t pos = 0;
  7516. v2g_tx_stream.pos = &pos;
  7517. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7518. v2g_tx_stream.data = V2GTP_Tx_buf;
  7519. res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  7520. req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
  7521. dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7522. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7523. res->ResponseCode = OK_DIN70121;
  7524. res->EVSEProcessing = Ongoing_DIN70121;
  7525. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
  7526. //[HEADER] Check Req SessionID
  7527. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7528. {
  7529. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7530. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7531. errn = -1;
  7532. }
  7533. //Check for SequenceError
  7534. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7535. {
  7536. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7537. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7538. errn = -1;
  7539. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7540. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7541. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7542. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7543. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7544. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7545. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7546. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7547. }
  7548. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7549. if ( (sys->EvBatteryMaxCurrent < 0) ||
  7550. (sys->EvBatteryMaxVoltage<150)
  7551. )
  7552. {
  7553. sprintf(buf_log_evcomm,
  7554. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  7555. sys->EvBatteryMaxCurrent);
  7556. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7557. res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  7558. res->EVSEProcessing = Finished_DIN70121;
  7559. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7560. errn = -1;
  7561. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7562. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7563. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7564. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7565. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7566. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7567. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7568. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7569. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7570. }
  7571. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7572. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  7573. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  7574. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  7575. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
  7576. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_DIN70121); //1A
  7577. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
  7578. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
  7579. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
  7580. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7581. if (sys->EvBatteryMaxVoltage <= 500)
  7582. {
  7583. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  7584. }
  7585. #endif
  7586. //for test with Tesla Model 3, 10A
  7587. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
  7588. //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
  7589. if (req->EVRequestedEnergyTransferType != dinEVSESupportedEnergyTransferType_DC_extended)
  7590. {
  7591. sprintf(buf_log_evcomm,
  7592. "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
  7593. req->EVRequestedEnergyTransferType,
  7594. dinEVSESupportedEnergyTransferType_DC_extended);
  7595. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7596. res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
  7597. res->EVSEProcessing = Finished_DIN70121;
  7598. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7599. errn = -1;
  7600. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7601. Update_V2G_Flow_Status(Other_Fault);
  7602. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7603. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7604. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7605. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7606. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7607. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7608. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7609. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7610. }
  7611. //Check for CSU command of "Stop by EVSE"
  7612. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7613. {
  7614. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7615. res->ResponseCode = FAILED_DIN70121;
  7616. res->EVSEProcessing = Finished_DIN70121;
  7617. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7618. // errn = -1;
  7619. }
  7620. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7621. {
  7622. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7623. res->ResponseCode = FAILED_DIN70121;
  7624. res->EVSEProcessing = Finished_DIN70121;
  7625. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7626. errn = -1;
  7627. }
  7628. //Detect for CP State should be 9V (State B)
  7629. #if CP_PROTECTION_MECHANISM == ENABLE
  7630. if (sys->CpState != 3) //State B1, B2
  7631. {
  7632. res->ResponseCode = FAILED_DIN70121;
  7633. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7634. res->EVSEProcessing = Finished_DIN70121;
  7635. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7636. Update_V2G_Flow_Status(Other_Fault);
  7637. errn = -1;
  7638. sprintf(buf_log_evcomm,
  7639. "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7640. sys->CpState,
  7641. sys->CpVoltage);
  7642. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7643. }
  7644. #endif
  7645. //Check for Permission from CSU
  7646. if (ShmInternalComm->ChargingPermission == TRUE)
  7647. {
  7648. res->EVSEProcessing = Finished_DIN70121;
  7649. }
  7650. //Check for Permission Off
  7651. if (ShmInternalComm->ChargingPermission == FALSE)
  7652. {
  7653. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
  7654. res->ResponseCode = FAILED_DIN70121;
  7655. res->EVSEProcessing = Finished_DIN70121;
  7656. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7657. // errn = -1;
  7658. }
  7659. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7660. #if PARAMETER_NORMAL_MODE == ENABLE
  7661. SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  7662. #else
  7663. Sudo_Parameter_din_ChargeParameterDiscoveryRes();
  7664. #endif
  7665. //STEP 4: ============ Encode and Send Response Message ===========
  7666. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7667. {
  7668. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7669. errn = -1;
  7670. }
  7671. //STPE 5: ============ Update Flags ============
  7672. return errn;
  7673. }
  7674. /*===========================================================================
  7675. FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
  7676. DESCRIPTION:
  7677. PRE-CONDITION:
  7678. INPUT:
  7679. OUTPUT:
  7680. GLOBAL VARIABLES:
  7681. =============================================================================*/
  7682. int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
  7683. {
  7684. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7685. //if it is not the same, the packet should be ignored.
  7686. //STEP 1: ============ Initialize ============
  7687. int errn = 0;
  7688. bitstream_t v2g_tx_stream;
  7689. struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
  7690. struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
  7691. struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
  7692. struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
  7693. struct ChargingInfoData *sys;
  7694. size_t pos = 0;
  7695. v2g_tx_stream.pos = &pos;
  7696. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7697. v2g_tx_stream.data = V2GTP_Tx_buf;
  7698. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
  7699. req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
  7700. dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7701. ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
  7702. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7703. res->ResponseCode = OK_ISO15118_2014;
  7704. /*+++ 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery +++*/
  7705. res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7706. /*--- 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery ---*/
  7707. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
  7708. ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
  7709. ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
  7710. ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
  7711. //[HEADER] Check Req SessionID
  7712. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7713. {
  7714. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7715. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7716. errn = -1;
  7717. }
  7718. //Check for SequenceError
  7719. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7720. {
  7721. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7722. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7723. errn = -1;
  7724. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7725. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7726. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7727. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7728. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7729. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7730. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7731. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7732. }
  7733. /* printf("req->RequestedEnergyTransferMode=%d\n",req->RequestedEnergyTransferMode);
  7734. printf("req->AC_EVChargeParameter.DepartureTime=%d\n",req->AC_EVChargeParameter.DepartureTime);
  7735. printf("req->AC_EVChargeParameter.EAmount.Multiplier=%d\n",req->AC_EVChargeParameter.EAmount.Multiplier);
  7736. printf("req->AC_EVChargeParameter.EAmount.Unit=%d\n",req->AC_EVChargeParameter.EAmount.Unit);
  7737. printf("req->AC_EVChargeParameter.EAmount.Value=%d\n",req->AC_EVChargeParameter.EAmount.Value);
  7738. printf("req->AC_EVChargeParameter.EVMaxVoltage.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Multiplier);
  7739. printf("req->AC_EVChargeParameter.EVMaxVoltage.Unit=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Unit);
  7740. printf("req->AC_EVChargeParameter.EVMaxVoltage.Value=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Value);
  7741. printf("req->AC_EVChargeParameter.EVMaxCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Multiplier);
  7742. printf("req->AC_EVChargeParameter.EVMaxCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Unit);
  7743. printf("req->AC_EVChargeParameter.EVMaxCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Value);
  7744. printf("req->AC_EVChargeParameter.EVMinCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Multiplier);
  7745. printf("req->AC_EVChargeParameter.EVMinCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Unit);
  7746. printf("req->AC_EVChargeParameter.EVMinCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Value);*/
  7747. if(req->RequestedEnergyTransferMode <= 1)//0 for 1P, 1 for 3P
  7748. {
  7749. //AC parameters
  7750. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]AC charging");
  7751. //AC
  7752. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
  7753. //SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7754. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (ShmInternalComm->AC_EVSEMaxCurrent * 10), A_ISO15118_2014);
  7755. }
  7756. else
  7757. {
  7758. //DC parameters
  7759. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]DC charging");
  7760. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7761. /*+++ 20200808, vern, should check the voltage and current to see if the range of battery parameter is accepted by charger ---*/
  7762. if ((sys->EvBatteryMaxCurrent < 0) ||(sys->EvBatteryMaxVoltage<150))
  7763. {
  7764. sprintf(buf_log_evcomm,
  7765. "[ERROR]EvBatteryMaxCurrent/MaxVolatge is mismatch(current=%.02f, voltage=%.02f) => End_Process",
  7766. sys->EvBatteryMaxCurrent,sys->EvBatteryMaxVoltage);
  7767. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7768. res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  7769. res->EVSEProcessing = Finished_ISO15118_2014;
  7770. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7771. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7772. errn = -1;
  7773. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7774. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7775. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7776. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7777. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7778. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7779. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7780. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7781. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7782. }
  7783. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7784. //DC
  7785. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  7786. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7787. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  7788. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
  7789. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_ISO15118_2014); //1A
  7790. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
  7791. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
  7792. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
  7793. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7794. if (sys->EvBatteryMaxVoltage <= 500)
  7795. {
  7796. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  7797. }
  7798. #endif
  7799. //Check for CSU command of "Stop by EVSE"
  7800. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7801. {
  7802. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7803. res->ResponseCode = FAILED_ISO15118_2014;
  7804. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7805. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7806. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7807. // errn = -1;
  7808. }
  7809. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7810. {
  7811. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7812. res->ResponseCode = FAILED_ISO15118_2014;
  7813. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7814. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7815. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7816. errn = -1;
  7817. }
  7818. //Detect for CP State should be 9V (State B)
  7819. #if CP_PROTECTION_MECHANISM == ENABLE
  7820. if (sys->CpState != 3) //State B1, B2
  7821. {
  7822. res->ResponseCode = FAILED_ISO15118_2014;
  7823. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7824. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7825. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7826. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7827. Update_V2G_Flow_Status(Other_Fault);
  7828. errn = -1;
  7829. sprintf(buf_log_evcomm,
  7830. "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7831. sys->CpState,
  7832. sys->CpVoltage);
  7833. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7834. }
  7835. #endif
  7836. }
  7837. //for test with Tesla Model 3, 10A
  7838. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
  7839. //Check for EnergyTransferMode
  7840. if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
  7841. {
  7842. sprintf(buf_log_evcomm,
  7843. "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
  7844. req->RequestedEnergyTransferMode,
  7845. ShmCcsData->EnergyTransferMode);
  7846. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7847. res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
  7848. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7849. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7850. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7851. errn = -1;
  7852. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7853. Update_V2G_Flow_Status(Other_Fault);
  7854. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7855. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7856. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7857. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7858. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7859. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7860. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7861. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7862. }
  7863. //Check for Permission from CSU
  7864. if(ShmInternalComm->ChargingPermission == TRUE)
  7865. {
  7866. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7867. }
  7868. //Check for Permission Off
  7869. if (ShmInternalComm->ChargingPermission == FALSE)
  7870. {
  7871. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
  7872. res->ResponseCode = FAILED_ISO15118_2014;
  7873. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7874. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7875. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7876. // errn = -1;
  7877. }
  7878. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7879. #if PARAMETER_NORMAL_MODE == ENABLE
  7880. SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7881. #else
  7882. Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
  7883. #endif
  7884. //STEP 4: ============ Encode and Send Response Message ===========
  7885. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7886. {
  7887. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7888. errn = -1;
  7889. }
  7890. //STPE 5: ============ Update Flags ============
  7891. return errn;
  7892. }
  7893. /*===========================================================================
  7894. FUNCTION: Proc_din_ChargeParameterDiscoveryReq
  7895. DESCRIPTION:
  7896. PRE-CONDITION:
  7897. INPUT:
  7898. OUTPUT:
  7899. GLOBAL VARIABLES:
  7900. =============================================================================*/
  7901. int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
  7902. {
  7903. int errn = 0;
  7904. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7905. //ftime(&SeqStartTime);
  7906. //Print the decoded XML Document
  7907. PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
  7908. //Save into Share Memory
  7909. SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7910. //Check for EV Error Code
  7911. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7912. errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
  7913. //ftime(&SeqEndTime);
  7914. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7915. if ( errn == 0)
  7916. {
  7917. //send response successfully.
  7918. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
  7919. }
  7920. else
  7921. {
  7922. sprintf(buf_log_evcomm,
  7923. "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
  7924. errn);
  7925. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7926. }
  7927. return errn;
  7928. }
  7929. /*===========================================================================
  7930. FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
  7931. DESCRIPTION:
  7932. PRE-CONDITION:
  7933. INPUT:
  7934. OUTPUT:
  7935. GLOBAL VARIABLES:
  7936. =============================================================================*/
  7937. int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
  7938. {
  7939. int errn = 0;
  7940. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7941. //ftime(&SeqStartTime);
  7942. //Print the decoded XML Document
  7943. PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
  7944. //Save into Share Memory
  7945. SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7946. //Check for EV Error Code
  7947. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7948. errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
  7949. //ftime(&SeqEndTime);
  7950. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7951. if (errn == 0)
  7952. {
  7953. //send response successfully.
  7954. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
  7955. }
  7956. else
  7957. {
  7958. sprintf(buf_log_evcomm,
  7959. "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
  7960. errn);
  7961. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7962. }
  7963. return errn;
  7964. }
  7965. /*===========================================================================
  7966. FUNCTION: SHM_Init_din_CableCheckRes
  7967. DESCRIPTION:
  7968. PRE-CONDITION:
  7969. INPUT:
  7970. 1. shm_ccs
  7971. OUTPUT:
  7972. 1. shm_ccs
  7973. GLOBAL VARIABLES:
  7974. =============================================================================*/
  7975. void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
  7976. {
  7977. struct CableCheckResponse_DIN70121 *in;
  7978. in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
  7979. //----- [BODY (1/3)] ResponseCode -----
  7980. in->ResponseCode = dinresponseCodeType_OK;
  7981. //----- [BODY (2/3)] EVSEProcessing -----
  7982. //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
  7983. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
  7984. // dinEVSEProcessingType_Finished = 0,
  7985. // dinEVSEProcessingType_Ongoing = 1
  7986. //----- [BODY (3/3)] DC_EVSEStatus -----
  7987. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7988. in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
  7989. // dinisolationLevelType_Invalid = 0,
  7990. // dinisolationLevelType_Valid = 1, (default)
  7991. // dinisolationLevelType_Warning = 2,
  7992. // dinisolationLevelType_Fault = 3
  7993. }
  7994. /*===========================================================================
  7995. FUNCTION: Sudo_Parameter_din_CableCheckRes
  7996. DESCRIPTION:
  7997. PRE-CONDITION:
  7998. INPUT:
  7999. OUTPUT:
  8000. GLOBAL VARIABLES:
  8001. =============================================================================*/
  8002. void Sudo_Parameter_din_CableCheckRes()
  8003. {
  8004. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8005. init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
  8006. ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  8007. //----- [BODY (1/3)] ResponseCode -----
  8008. struct dinCableCheckResType *res;
  8009. res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
  8010. res->ResponseCode = dinresponseCodeType_OK;
  8011. //----- [BODY (2/3)] EVSEProcessing -----
  8012. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  8013. // dinEVSEProcessingType_Finished = 0,
  8014. // dinEVSEProcessingType_Ongoing = 1
  8015. //----- [BODY (3/3)] DC_EVSEStatus -----
  8016. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8017. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8018. // dinisolationLevelType_Invalid = 0,
  8019. // dinisolationLevelType_Valid = 1,
  8020. // dinisolationLevelType_Warning = 2,
  8021. // dinisolationLevelType_Fault = 3
  8022. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8023. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8024. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8025. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8026. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8027. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8028. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8029. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8030. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8031. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8032. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8033. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8034. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8035. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8036. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8037. // dinEVSENotificationType_None = 0,
  8038. // dinEVSENotificationType_StopCharging = 1,
  8039. // dinEVSENotificationType_ReNegotiation = 2
  8040. }
  8041. /*===========================================================================
  8042. FUNCTION: Sudo_Parameter_iso1_CableCheckRes
  8043. DESCRIPTION:
  8044. PRE-CONDITION:
  8045. INPUT:
  8046. OUTPUT:
  8047. GLOBAL VARIABLES:
  8048. =============================================================================*/
  8049. void Sudo_Parameter_iso1_CableCheckRes()
  8050. {
  8051. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8052. init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
  8053. ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  8054. //----- [BODY (1/3)] ResponseCode -----
  8055. struct iso1CableCheckResType *res;
  8056. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
  8057. res->ResponseCode = iso1responseCodeType_OK;
  8058. //----- [BODY (2/3)] EVSEProcessing -----
  8059. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  8060. //iso1EVSEProcessingType_Finished = 0,
  8061. //iso1EVSEProcessingType_Ongoing = 1,
  8062. //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
  8063. //----- [BODY (3/3)] DC_EVSEStatus -----
  8064. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8065. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8066. //iso1isolationLevelType_Invalid = 0,
  8067. //iso1isolationLevelType_Valid = 1,
  8068. //iso1isolationLevelType_Warning = 2,
  8069. //iso1isolationLevelType_Fault = 3,
  8070. //iso1isolationLevelType_No_IMD = 4
  8071. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8072. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8073. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8074. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8075. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8076. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8077. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8078. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8079. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8080. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8081. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8082. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8083. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8084. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8085. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8086. //iso1EVSENotificationType_None = 0,
  8087. //iso1EVSENotificationType_StopCharging = 1,
  8088. //iso1EVSENotificationType_ReNegotiation = 2
  8089. }
  8090. /*===========================================================================
  8091. FUNCTION: Proc_din_CableCheckRes
  8092. DESCRIPTION:
  8093. PRE-CONDITION:
  8094. INPUT:
  8095. OUTPUT:
  8096. GLOBAL VARIABLES:
  8097. =============================================================================*/
  8098. int Proc_din_CableCheckRes(int AcceptFd)
  8099. {
  8100. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8101. //if it is not the same, the packet should be ignored.
  8102. //STEP 1: ============ Initialize ============
  8103. int i = 0;
  8104. int errn = 0;
  8105. bitstream_t v2g_tx_stream;
  8106. static struct CableCheckResponse_DIN70121 *cab;
  8107. static struct ChargingInfoData *sys;
  8108. size_t pos = 0;
  8109. v2g_tx_stream.pos = &pos;
  8110. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8111. v2g_tx_stream.data = V2GTP_Tx_buf;
  8112. cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
  8113. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8114. cab->ResponseCode = OK_DIN70121;
  8115. cab->cnt++;
  8116. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  8117. sys->CpState,
  8118. sys->CpVoltage,
  8119. sys->PresentChargingVoltage,
  8120. sys->IsolationStatus,
  8121. cab->EVSEProcessing);
  8122. //[HEADER] Check Req SessionID
  8123. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8124. {
  8125. cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8126. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8127. errn = -1;
  8128. }
  8129. //Check for SequenceError
  8130. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8131. {
  8132. cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8133. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8134. errn = -1;
  8135. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8136. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8137. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8138. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8139. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8140. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8141. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8142. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8143. }
  8144. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8145. if (sys->IsolationStatus == GFD_Invalid) //0: on going
  8146. {
  8147. //For PSU
  8148. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  8149. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  8150. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8151. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
  8152. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  8153. }
  8154. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
  8155. {
  8156. //For PSU
  8157. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8158. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8159. if (sys->PresentChargingVoltage < 60) // < 60V
  8160. {
  8161. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8162. sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  8163. sys->PresentChargingVoltage,
  8164. sys->IsolationStatus);
  8165. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8166. //IsolationStatus
  8167. if (sys->IsolationStatus == GFD_Valid)
  8168. {
  8169. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8170. }
  8171. else if (sys->IsolationStatus == GFD_Warning)
  8172. {
  8173. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
  8174. }
  8175. else
  8176. {
  8177. sprintf(buf_log_evcomm,
  8178. "[WARNING]unexpected IsolationStatus(%d)",
  8179. sys->IsolationStatus);
  8180. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8181. }
  8182. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8183. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8184. }
  8185. else
  8186. {
  8187. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8188. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8189. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  8190. }
  8191. }
  8192. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8193. {
  8194. //For PSU
  8195. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8196. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8197. cab->ResponseCode = FAILED_DIN70121;
  8198. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8199. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  8200. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8201. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
  8202. errn = -1;
  8203. }
  8204. else
  8205. {
  8206. //For PSU
  8207. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8208. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8209. cab->ResponseCode = FAILED_DIN70121;
  8210. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8211. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  8212. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8213. sprintf(buf_log_evcomm,
  8214. "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
  8215. sys->IsolationStatus);
  8216. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8217. }
  8218. //Check for CSU command of "Stop by EVSE"
  8219. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8220. {
  8221. cab->ResponseCode = FAILED_DIN70121;
  8222. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8223. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8224. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8225. // errn = -1;
  8226. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_Shutdown");
  8227. }
  8228. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8229. {
  8230. cab->ResponseCode = FAILED_DIN70121;
  8231. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8232. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8233. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8234. errn = -1;
  8235. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_EmergencyShutdown");
  8236. }
  8237. else if (ShmInternalComm->ChargingPermission == FALSE)
  8238. {
  8239. cab->ResponseCode = FAILED_DIN70121;
  8240. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8241. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8242. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8243. // errn = -1;
  8244. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
  8245. }
  8246. else
  8247. {
  8248. //null
  8249. }
  8250. //Response to CP Error
  8251. #if CP_PROTECTION_MECHANISM == ENABLE
  8252. //#if 1
  8253. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  8254. {
  8255. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8256. {
  8257. cab->ResponseCode = FAILED_DIN70121;
  8258. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8259. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8260. Update_V2G_Flow_Status(Other_Fault);
  8261. errn = -1;
  8262. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8263. //CCS_SECC_CP_State_Error (023889)
  8264. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8265. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8266. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8267. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8268. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8269. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8270. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8271. sprintf(buf_log_evcomm,
  8272. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  8273. sys->CpState,
  8274. sys->CpVoltage,
  8275. cab->cnt
  8276. );
  8277. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8278. //cab->cnt = 0;
  8279. }
  8280. }
  8281. #endif
  8282. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8283. #if PARAMETER_NORMAL_MODE == ENABLE
  8284. SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
  8285. #else
  8286. Sudo_Parameter_din_CableCheckRes();
  8287. #endif
  8288. //STEP 4: ============ Encode and Send Response Message ===========
  8289. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8290. {
  8291. errn = -1;
  8292. }
  8293. //STEP 5: ============ Update Flags ===========
  8294. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  8295. return errn;
  8296. }
  8297. /*===========================================================================
  8298. FUNCTION: Proc_iso1_CableCheckRes
  8299. DESCRIPTION:
  8300. PRE-CONDITION:
  8301. INPUT:
  8302. OUTPUT:
  8303. GLOBAL VARIABLES:
  8304. =============================================================================*/
  8305. int Proc_iso1_CableCheckRes(int AcceptFd)
  8306. {
  8307. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8308. //if it is not the same, the packet should be ignored.
  8309. //STEP 1: ============ Initialize ============
  8310. int i = 0;
  8311. int errn = 0;
  8312. bitstream_t v2g_tx_stream;
  8313. static struct CableCheckResponse_ISO15118_2014 *cab;
  8314. static struct ChargingInfoData *sys;
  8315. size_t pos = 0;
  8316. v2g_tx_stream.pos = &pos;
  8317. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8318. v2g_tx_stream.data = V2GTP_Tx_buf;
  8319. cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
  8320. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8321. cab->ResponseCode = OK_ISO15118_2014;
  8322. cab->cnt++;
  8323. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  8324. sys->CpState,
  8325. sys->CpVoltage,
  8326. sys->PresentChargingVoltage,
  8327. sys->IsolationStatus,
  8328. cab->EVSEProcessing);
  8329. //[HEADER] Check Req SessionID
  8330. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8331. {
  8332. cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8333. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8334. errn = -1;
  8335. }
  8336. //Check for SequenceError
  8337. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8338. {
  8339. cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8340. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8341. errn = -1;
  8342. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8343. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8344. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8345. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8346. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8347. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8348. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8349. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8350. }
  8351. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8352. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  8353. {
  8354. //For PSU
  8355. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  8356. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  8357. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8358. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8359. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  8360. }
  8361. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
  8362. {
  8363. //For PSU
  8364. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8365. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8366. if (sys->PresentChargingVoltage < 60) // < 60V
  8367. {
  8368. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8369. sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  8370. sys->PresentChargingVoltage,
  8371. sys->IsolationStatus);
  8372. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8373. //IsolationStatus
  8374. if (sys->IsolationStatus == GFD_Valid)
  8375. {
  8376. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8377. }
  8378. else if (sys->IsolationStatus == GFD_Warning)
  8379. {
  8380. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
  8381. }
  8382. else
  8383. {
  8384. sprintf(buf_log_evcomm,
  8385. "[WARNING]unexpected IsolationStatus(%d)",
  8386. sys->IsolationStatus);
  8387. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8388. }
  8389. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8390. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8391. }
  8392. else
  8393. {
  8394. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8395. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8396. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  8397. }
  8398. }
  8399. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8400. {
  8401. //For PSU
  8402. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8403. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8404. cab->ResponseCode = FAILED_ISO15118_2014;
  8405. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8406. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  8407. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8408. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
  8409. errn = -1;
  8410. }
  8411. //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
  8412. else
  8413. {
  8414. //For PSU
  8415. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8416. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8417. cab->ResponseCode = FAILED_ISO15118_2014;
  8418. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8419. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  8420. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8421. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
  8422. }
  8423. //Check for CSU command of "Stop by EVSE"
  8424. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8425. {
  8426. cab->ResponseCode = FAILED_ISO15118_2014;
  8427. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8428. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8429. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8430. // errn = -1;
  8431. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_Shutdown");
  8432. }
  8433. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8434. {
  8435. cab->ResponseCode = FAILED_ISO15118_2014;
  8436. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8437. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8438. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8439. errn = -1;
  8440. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_EmergencyShutdown");
  8441. }
  8442. else if (ShmInternalComm->ChargingPermission == FALSE)
  8443. {
  8444. cab->ResponseCode = FAILED_ISO15118_2014;
  8445. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8446. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8447. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8448. // errn = -1;
  8449. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
  8450. }
  8451. else
  8452. {
  8453. //null
  8454. }
  8455. //Response to CP Error
  8456. #if CP_PROTECTION_MECHANISM == ENABLE
  8457. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  8458. {
  8459. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8460. {
  8461. cab->ResponseCode = FAILED_ISO15118_2014;
  8462. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8463. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8464. Update_V2G_Flow_Status(Other_Fault);
  8465. errn = -1;
  8466. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8467. //CCS_SECC_CP_State_Error (023889)
  8468. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8469. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8470. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8471. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8472. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8473. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8474. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8475. sprintf(buf_log_evcomm,
  8476. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  8477. sys->CpState,
  8478. sys->CpVoltage,
  8479. cab->cnt
  8480. );
  8481. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8482. //cab->cnt = 0;
  8483. }
  8484. }
  8485. #endif
  8486. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8487. #if PARAMETER_NORMAL_MODE == ENABLE
  8488. SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8489. #else
  8490. Sudo_Parameter_iso1_CableCheckRes();
  8491. #endif
  8492. //STEP 4: ============ Encode and Send Response Message ===========
  8493. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8494. {
  8495. errn = -1;
  8496. }
  8497. //STEP 5: ============ Update Flags ===========
  8498. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  8499. return errn;
  8500. }
  8501. /*===========================================================================
  8502. FUNCTION: Proc_din_CableCheckReq
  8503. DESCRIPTION:
  8504. PRE-CONDITION:
  8505. INPUT:
  8506. OUTPUT:
  8507. GLOBAL VARIABLES:
  8508. =============================================================================*/
  8509. int Proc_din_CableCheckReq(int AcceptFd)
  8510. {
  8511. int errn = 0;
  8512. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckReq] Got CableCheckReq\n");
  8513. //Print the decoded XML Document
  8514. PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
  8515. //Save into Share Memory
  8516. SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8517. //Check for EV Error Code
  8518. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
  8519. errn = Proc_din_CableCheckRes(AcceptFd);
  8520. if (errn == 0)
  8521. {
  8522. //send response successfully.
  8523. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CableCheckRes");
  8524. }
  8525. else
  8526. {
  8527. sprintf(buf_log_evcomm,
  8528. "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  8529. errn);
  8530. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8531. }
  8532. return errn;
  8533. }
  8534. /*===========================================================================
  8535. FUNCTION: Proc_iso1_CableCheckReq
  8536. DESCRIPTION:
  8537. PRE-CONDITION:
  8538. INPUT:
  8539. OUTPUT:
  8540. GLOBAL VARIABLES:
  8541. =============================================================================*/
  8542. int Proc_iso1_CableCheckReq(int AcceptFd)
  8543. {
  8544. int errn = 0;
  8545. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckReq] Got CableCheckReq");
  8546. //Print the decoded XML Document
  8547. PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
  8548. //Save into Share Memory
  8549. SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8550. //Check for EV Error Code
  8551. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
  8552. errn = Proc_iso1_CableCheckRes(AcceptFd);
  8553. if (errn == 0)
  8554. {
  8555. //send response successfully.
  8556. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CableCheckRes");
  8557. }
  8558. else
  8559. {
  8560. sprintf(buf_log_evcomm,
  8561. "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  8562. errn);
  8563. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8564. }
  8565. return errn;
  8566. }
  8567. /*===========================================================================
  8568. FUNCTION: SHM_Init_din_PreChargeRes
  8569. DESCRIPTION:
  8570. PRE-CONDITION:
  8571. INPUT:
  8572. 1. shm_ccs
  8573. OUTPUT:
  8574. 1. shm_ccs
  8575. GLOBAL VARIABLES:
  8576. =============================================================================*/
  8577. void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
  8578. {
  8579. struct PreChargeResponse_DIN70121 *in;
  8580. in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
  8581. //----- [BODY (1/3)] ResponseCode -----
  8582. in->ResponseCode = dinresponseCodeType_OK;
  8583. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8584. short value = 0; int multiplier = 0; unsigned char unit = 0;
  8585. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
  8586. value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
  8587. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  8588. //----- [BODY (3/3)] DC_EVSEStatus -----
  8589. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8590. }
  8591. /*===========================================================================
  8592. FUNCTION: Sudo_Parameter_din_PreChargeRes
  8593. DESCRIPTION:
  8594. PRE-CONDITION:
  8595. INPUT:
  8596. OUTPUT:
  8597. GLOBAL VARIABLES:
  8598. =============================================================================*/
  8599. void Sudo_Parameter_din_PreChargeRes()
  8600. {
  8601. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8602. init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
  8603. ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8604. //----- [BODY (1/3)] ResponseCode -----
  8605. struct dinPreChargeResType *res;
  8606. res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
  8607. res->ResponseCode = dinresponseCodeType_OK;
  8608. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8609. res->EVSEPresentVoltage.Value = 3820;
  8610. res->EVSEPresentVoltage.Multiplier = -1;
  8611. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8612. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  8613. // dinunitSymbolType_h = 0,
  8614. // dinunitSymbolType_m = 1,
  8615. // dinunitSymbolType_s = 2,
  8616. // dinunitSymbolType_A = 3,
  8617. // dinunitSymbolType_Ah = 4,
  8618. // dinunitSymbolType_V = 5,
  8619. // dinunitSymbolType_VA = 6,
  8620. // dinunitSymbolType_W = 7,
  8621. // dinunitSymbolType_W_s = 8,
  8622. // dinunitSymbolType_Wh = 9
  8623. //----- [BODY (3/3)] DC_EVSEStatus -----
  8624. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8625. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8626. // dinisolationLevelType_Invalid = 0,
  8627. // dinisolationLevelType_Valid = 1,
  8628. // dinisolationLevelType_Warning = 2,
  8629. // dinisolationLevelType_Fault = 3
  8630. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8631. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8632. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8633. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8634. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8635. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8636. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8637. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8638. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8639. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8640. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8641. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8642. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8643. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8644. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8645. // dinEVSENotificationType_None = 0,
  8646. // dinEVSENotificationType_StopCharging = 1,
  8647. // dinEVSENotificationType_ReNegotiation = 2
  8648. }
  8649. /*===========================================================================
  8650. FUNCTION: Sudo_Parameter_iso1_PreChargeRes
  8651. DESCRIPTION:
  8652. PRE-CONDITION:
  8653. INPUT:
  8654. OUTPUT:
  8655. GLOBAL VARIABLES:
  8656. =============================================================================*/
  8657. void Sudo_Parameter_iso1_PreChargeRes()
  8658. {
  8659. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8660. init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
  8661. ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8662. //----- [BODY (1/3)] ResponseCode -----
  8663. struct iso1PreChargeResType *res;
  8664. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
  8665. res->ResponseCode = iso1responseCodeType_OK;
  8666. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8667. res->EVSEPresentVoltage.Value = 3820;
  8668. res->EVSEPresentVoltage.Multiplier = -1;
  8669. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8670. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8671. //iso1unitSymbolType_h = 0,
  8672. //iso1unitSymbolType_m = 1,
  8673. //iso1unitSymbolType_s = 2,
  8674. //iso1unitSymbolType_A = 3,
  8675. //iso1unitSymbolType_V = 4,
  8676. //iso1unitSymbolType_W = 5,
  8677. //iso1unitSymbolType_Wh = 6
  8678. //----- [BODY (3/3)] DC_EVSEStatus -----
  8679. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8680. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8681. //iso1isolationLevelType_Invalid = 0,
  8682. //iso1isolationLevelType_Valid = 1,
  8683. //iso1isolationLevelType_Warning = 2,
  8684. //iso1isolationLevelType_Fault = 3,
  8685. //iso1isolationLevelType_No_IMD = 4
  8686. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8687. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8688. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8689. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8690. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8691. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8692. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8693. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8694. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8695. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8696. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8697. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8698. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8699. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8700. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8701. //iso1EVSENotificationType_None = 0,
  8702. //iso1EVSENotificationType_StopCharging = 1,
  8703. //iso1EVSENotificationType_ReNegotiation = 2
  8704. }
  8705. /*===========================================================================
  8706. FUNCTION: Proc_din_PreChargeRes
  8707. DESCRIPTION:
  8708. PRE-CONDITION:
  8709. INPUT:
  8710. OUTPUT:
  8711. GLOBAL VARIABLES:
  8712. =============================================================================*/
  8713. int Proc_din_PreChargeRes(int AcceptFd)
  8714. {
  8715. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8716. //if it is not the same, the packet should be ignored.
  8717. //STEP 1: ============ Initialize ============
  8718. int i = 0;
  8719. int errn = 0;
  8720. bitstream_t v2g_tx_stream;
  8721. static struct PreChargeResponse_DIN70121 *pre;
  8722. static struct ChargingInfoData *sys;
  8723. size_t pos = 0;
  8724. v2g_tx_stream.pos = &pos;
  8725. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8726. v2g_tx_stream.data = V2GTP_Tx_buf;
  8727. pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
  8728. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8729. pre->ResponseCode = OK_DIN70121;
  8730. //EVSE Status Code
  8731. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8732. //[HEADER] Check Req SessionID
  8733. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8734. {
  8735. pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8736. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8737. errn = -1;
  8738. }
  8739. //Check for SequenceError
  8740. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8741. {
  8742. pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8743. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8744. errn = -1;
  8745. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8746. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8747. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8748. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8749. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8750. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8751. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8752. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8753. }
  8754. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8755. SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  8756. //Isolation Status
  8757. if (sys->IsolationStatus == GFD_Invalid) //0: invalid
  8758. {
  8759. #if 0
  8760. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  8761. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8762. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8763. Update_V2G_Flow_Status(Other_Fault);
  8764. errn = -1;
  8765. sprintf(buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8766. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8767. #else
  8768. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8769. #endif
  8770. }
  8771. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8772. {
  8773. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8774. }
  8775. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  8776. {
  8777. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  8778. }
  8779. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8780. {
  8781. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8782. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8783. pre->ResponseCode = FAILED_DIN70121;
  8784. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8785. errn = -1;
  8786. }
  8787. else //GFD_No_IMD or other unexpected status
  8788. {
  8789. pre->ResponseCode = FAILED_DIN70121;
  8790. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8791. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8792. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8793. Update_V2G_Flow_Status(Other_Fault);
  8794. errn = -1;
  8795. sprintf(buf_log_evcomm,
  8796. "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
  8797. sys->IsolationStatus);
  8798. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8799. }
  8800. //Check for CSU command of "Stop by EVSE"
  8801. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8802. {
  8803. //Check for Alarm Code: CCS GFD trip (012235)
  8804. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8805. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8806. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8807. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8808. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8809. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8810. {
  8811. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8812. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8813. }
  8814. else
  8815. {
  8816. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
  8817. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8818. }
  8819. pre->ResponseCode = FAILED_DIN70121;
  8820. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8821. errn = -1;
  8822. }
  8823. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8824. {
  8825. //Check for Alarm Code: CCS GFD trip (012235)
  8826. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8827. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8828. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8829. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8830. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8831. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8832. {
  8833. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8834. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8835. }
  8836. else
  8837. {
  8838. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
  8839. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8840. }
  8841. pre->ResponseCode = FAILED_DIN70121;
  8842. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8843. errn = -1;
  8844. }
  8845. else if (ShmInternalComm->ChargingPermission == FALSE)
  8846. {
  8847. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
  8848. pre->ResponseCode = FAILED_DIN70121;
  8849. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8850. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8851. errn = -1;
  8852. }
  8853. else
  8854. {
  8855. //null
  8856. }
  8857. //Response to CP Error
  8858. #if CP_PROTECTION_MECHANISM == ENABLE
  8859. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8860. {
  8861. pre->ResponseCode = FAILED_DIN70121;
  8862. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8863. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8864. Update_V2G_Flow_Status(Other_Fault);
  8865. errn = -1;
  8866. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8867. //CCS_SECC_CP_State_Error (023889)
  8868. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8869. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8870. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8871. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8872. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8873. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8874. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8875. sprintf(buf_log_evcomm,
  8876. "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8877. sys->CpState,
  8878. sys->CpVoltage
  8879. );
  8880. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8881. }
  8882. #endif
  8883. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8884. #if PARAMETER_NORMAL_MODE == ENABLE
  8885. SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
  8886. #else
  8887. Sudo_Parameter_din_PreChargeRes();
  8888. #endif
  8889. //STEP 4: ============ Encode and Send Response Message ===========
  8890. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8891. {
  8892. SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
  8893. errn = -1;
  8894. }
  8895. //STEP 5: ============ Update Flags ===========
  8896. return errn;
  8897. }
  8898. /*===========================================================================
  8899. FUNCTION: Proc_iso1_PreChargeRes
  8900. DESCRIPTION:
  8901. PRE-CONDITION:
  8902. INPUT:
  8903. OUTPUT:
  8904. GLOBAL VARIABLES:
  8905. =============================================================================*/
  8906. int Proc_iso1_PreChargeRes(int AcceptFd)
  8907. {
  8908. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8909. //if it is not the same, the packet should be ignored.
  8910. //STEP 1: ============ Initialize ============
  8911. int i = 0;
  8912. int errn = 0;
  8913. bitstream_t v2g_tx_stream;
  8914. static struct PreChargeResponse_ISO15118_2014 *pre;
  8915. static struct ChargingInfoData *sys;
  8916. size_t pos = 0;
  8917. v2g_tx_stream.pos = &pos;
  8918. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8919. v2g_tx_stream.data = V2GTP_Tx_buf;
  8920. pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
  8921. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8922. pre->ResponseCode = OK_ISO15118_2014;
  8923. //EVSE Status Code
  8924. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8925. //[HEADER] Check Req SessionID
  8926. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8927. {
  8928. pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8929. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8930. errn = -1;
  8931. }
  8932. //Check for SequenceError
  8933. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8934. {
  8935. pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8936. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8937. errn = -1;
  8938. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8939. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8940. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8941. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8942. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8943. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8944. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8945. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8946. }
  8947. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8948. SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  8949. //Isolation Status
  8950. if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
  8951. {
  8952. #if 0
  8953. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  8954. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8955. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8956. // Update_V2G_Flow_Status(Other_Fault);
  8957. // errn = -1;
  8958. sprintf(buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8959. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8960. #else
  8961. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8962. #endif
  8963. }
  8964. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8965. {
  8966. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8967. }
  8968. else if (sys->IsolationStatus == GFD_Warning) //2: waring
  8969. {
  8970. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
  8971. }
  8972. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8973. {
  8974. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8975. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8976. pre->ResponseCode = FAILED_ISO15118_2014;
  8977. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8978. errn = -1;
  8979. }
  8980. else
  8981. {
  8982. pre->ResponseCode = FAILED_ISO15118_2014;
  8983. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8984. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8985. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8986. Update_V2G_Flow_Status(Other_Fault);
  8987. errn = -1;
  8988. sprintf(buf_log_evcomm,
  8989. "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
  8990. sys->IsolationStatus);
  8991. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8992. }
  8993. //Check for CSU command of "Stop by EVSE"
  8994. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8995. {
  8996. //Check for Alarm Code: CCS GFD trip (012235)
  8997. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8998. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8999. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9000. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9001. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9002. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9003. {
  9004. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  9005. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9006. }
  9007. else
  9008. {
  9009. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
  9010. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9011. }
  9012. pre->ResponseCode = FAILED_ISO15118_2014;
  9013. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9014. // errn = -1;
  9015. }
  9016. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9017. {
  9018. //Check for Alarm Code: CCS GFD trip (012235)
  9019. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9020. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9021. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9022. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9023. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9024. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9025. {
  9026. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9027. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9028. }
  9029. else
  9030. {
  9031. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
  9032. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9033. }
  9034. pre->ResponseCode = FAILED_ISO15118_2014;
  9035. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9036. errn = -1;
  9037. }
  9038. else if (ShmInternalComm->ChargingPermission == FALSE)
  9039. {
  9040. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
  9041. pre->ResponseCode = FAILED_ISO15118_2014;
  9042. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9043. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9044. // errn = -1;
  9045. }
  9046. else
  9047. {
  9048. //null
  9049. }
  9050. //Response to CP Error
  9051. #if CP_PROTECTION_MECHANISM == ENABLE
  9052. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9053. {
  9054. pre->ResponseCode = FAILED_ISO15118_2014;
  9055. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9056. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9057. Update_V2G_Flow_Status(Other_Fault);
  9058. errn = -1;
  9059. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9060. //CCS_SECC_CP_State_Error (023889)
  9061. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9062. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9063. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9064. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9065. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9066. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9067. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9068. sprintf(buf_log_evcomm,
  9069. "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  9070. sys->CpState,
  9071. sys->CpVoltage
  9072. );
  9073. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9074. }
  9075. #endif
  9076. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9077. #if PARAMETER_NORMAL_MODE == ENABLE
  9078. SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9079. #else
  9080. Sudo_Parameter_iso1_PreChargeRes();
  9081. #endif
  9082. //STEP 4: ============ Encode and Send Response Message ===========
  9083. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9084. {
  9085. SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
  9086. errn = -1;
  9087. }
  9088. //STEP 5: ============ Update Flags ===========
  9089. return errn;
  9090. }
  9091. /*===========================================================================
  9092. FUNCTION: Proc_din_PreChargeReq
  9093. DESCRIPTION:
  9094. PRE-CONDITION:
  9095. INPUT:
  9096. OUTPUT:
  9097. GLOBAL VARIABLES:
  9098. =============================================================================*/
  9099. int Proc_din_PreChargeReq(int AcceptFd)
  9100. {
  9101. int errn = 0;
  9102. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PreChargeReq] Got PreChargeReq");
  9103. //Print the decoded XML Document
  9104. PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
  9105. //Save into Share Memory
  9106. SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9107. //Check for EV Error Code
  9108. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
  9109. errn = Proc_din_PreChargeRes(AcceptFd);
  9110. if (errn == 0)
  9111. {
  9112. //send response successfully.
  9113. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PreChargeRes");
  9114. }
  9115. else
  9116. {
  9117. sprintf(buf_log_evcomm,
  9118. "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  9119. errn);
  9120. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9121. }
  9122. return errn;
  9123. }
  9124. /*===========================================================================
  9125. FUNCTION: Proc_iso1_PreChargeReq
  9126. DESCRIPTION:
  9127. PRE-CONDITION:
  9128. INPUT:
  9129. OUTPUT:
  9130. GLOBAL VARIABLES:
  9131. =============================================================================*/
  9132. int Proc_iso1_PreChargeReq(int AcceptFd)
  9133. {
  9134. int errn = 0;
  9135. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PreChargeReq] Got PreChargeReq");
  9136. //Print the decoded XML Document
  9137. PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
  9138. //Save into Share Memory
  9139. SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9140. //Check for EV Error Code
  9141. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
  9142. errn = Proc_iso1_PreChargeRes(AcceptFd);
  9143. if (errn == 0)
  9144. {
  9145. //send response successfully.
  9146. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PreChargeRes");
  9147. }
  9148. else
  9149. {
  9150. sprintf(buf_log_evcomm,
  9151. "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  9152. errn);
  9153. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9154. }
  9155. return errn;
  9156. }
  9157. /*===========================================================================
  9158. FUNCTION: SHM_Init_din_PowerDeliveryRes
  9159. DESCRIPTION:
  9160. PRE-CONDITION:
  9161. INPUT:
  9162. 1. shm_ccs
  9163. OUTPUT:
  9164. 1. shm_ccs
  9165. GLOBAL VARIABLES:
  9166. =============================================================================*/
  9167. void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
  9168. {
  9169. struct PowerDeliveryResponse_DIN70121 *in;
  9170. in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
  9171. //----- [BODY (1/3)] ResponseCode -----
  9172. in->ResponseCode = dinresponseCodeType_OK;
  9173. //----- [BODY (2/3)] AC_EVSEStatus -----
  9174. //ignore, since DIN 70121 doesn't support AC, yet.
  9175. //----- [BODY (2/3)] DC_EVSEStatus -----
  9176. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9177. }
  9178. /*===========================================================================
  9179. FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
  9180. DESCRIPTION:
  9181. PRE-CONDITION:
  9182. INPUT:
  9183. OUTPUT:
  9184. GLOBAL VARIABLES:
  9185. =============================================================================*/
  9186. void Sudo_Parameter_din_PowerDeliveryRes()
  9187. {
  9188. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9189. init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
  9190. ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  9191. //----- [BODY (1/3)] ResponseCode -----
  9192. struct dinPowerDeliveryResType *res;
  9193. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9194. res->ResponseCode = dinresponseCodeType_OK;
  9195. //----- [BODY (2/3)] AC_EVSEStatus -----
  9196. //ignore, since DIN 70121 doesn't support AC, yet.
  9197. //----- [BODY (2/3)] DC_EVSEStatus -----
  9198. res->DC_EVSEStatus_isUsed = 1u;
  9199. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9200. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  9201. // dinisolationLevelType_Invalid = 0,
  9202. // dinisolationLevelType_Valid = 1,
  9203. // dinisolationLevelType_Warning = 2,
  9204. // dinisolationLevelType_Fault = 3
  9205. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9206. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9207. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  9208. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9209. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9210. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9211. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9212. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9213. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  9214. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  9215. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  9216. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  9217. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  9218. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9219. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  9220. // dinEVSENotificationType_None = 0,
  9221. // dinEVSENotificationType_StopCharging = 1,
  9222. // dinEVSENotificationType_ReNegotiation = 2
  9223. }
  9224. /*===========================================================================
  9225. FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
  9226. DESCRIPTION:
  9227. PRE-CONDITION:
  9228. INPUT:
  9229. OUTPUT:
  9230. GLOBAL VARIABLES:
  9231. =============================================================================*/
  9232. void Sudo_Parameter_iso1_PowerDeliveryRes()
  9233. {
  9234. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9235. init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
  9236. ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  9237. //----- [BODY (1/3)] ResponseCode -----
  9238. struct iso1PowerDeliveryResType *res;
  9239. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9240. res->ResponseCode = iso1responseCodeType_OK;
  9241. //----- [BODY (2/3)] AC_EVSEStatus -----
  9242. //ignore, since our ISO1 70121 doesn't support AC, yet.
  9243. //----- [BODY (2/3)] DC_EVSEStatus -----
  9244. res->DC_EVSEStatus_isUsed = 1u;
  9245. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9246. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  9247. //iso1isolationLevelType_Invalid = 0,
  9248. //iso1isolationLevelType_Valid = 1,
  9249. //iso1isolationLevelType_Warning = 2,
  9250. //iso1isolationLevelType_Fault = 3,
  9251. //iso1isolationLevelType_No_IMD = 4
  9252. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9253. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9254. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  9255. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9256. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9257. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9258. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9259. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9260. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  9261. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  9262. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  9263. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  9264. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9265. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9266. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9267. //iso1EVSENotificationType_None = 0,
  9268. //iso1EVSENotificationType_StopCharging = 1,
  9269. //iso1EVSENotificationType_ReNegotiation = 2
  9270. }
  9271. /*===========================================================================
  9272. FUNCTION: Proc_din_PowerDeliveryStartRes
  9273. DESCRIPTION:
  9274. PRE-CONDITION:
  9275. INPUT:
  9276. OUTPUT:
  9277. GLOBAL VARIABLES:
  9278. =============================================================================*/
  9279. int Proc_din_PowerDeliveryStartRes(int AcceptFd)
  9280. {
  9281. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9282. //if it is not the same, the packet should be ignored.
  9283. //STEP 1: ============ Initialize ============
  9284. int i = 0;
  9285. int errn = 0;
  9286. bitstream_t v2g_tx_stream;
  9287. struct dinPowerDeliveryResType *res;
  9288. struct ChargingInfoData *sys;
  9289. size_t pos = 0;
  9290. v2g_tx_stream.pos = &pos;
  9291. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9292. v2g_tx_stream.data = V2GTP_Tx_buf;
  9293. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9294. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9295. res->ResponseCode = OK_DIN70121;
  9296. //[HEADER] Check Req SessionID
  9297. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9298. {
  9299. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9300. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  9301. errn = -1;
  9302. }
  9303. //Check for SequenceError
  9304. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9305. {
  9306. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9307. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  9308. errn = -1;
  9309. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9310. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9311. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9312. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9313. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9314. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9315. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9316. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9317. }
  9318. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9319. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9320. #if PARAMETER_NORMAL_MODE == ENABLE
  9321. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  9322. #else
  9323. Sudo_Parameter_din_PowerDeliveryRes();
  9324. #endif
  9325. //EVSE Status Code
  9326. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  9327. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9328. //Check for CSU command of "Stop by EVSE"
  9329. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9330. {
  9331. //res->ResponseCode = FAILED_DIN70121;
  9332. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9333. }
  9334. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9335. {
  9336. //res->ResponseCode = FAILED_DIN70121;
  9337. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9338. errn = -1;
  9339. }
  9340. else if (ShmInternalComm->ChargingPermission == FALSE)
  9341. {
  9342. //res->ResponseCode = FAILED_DIN70121;
  9343. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9344. }
  9345. //STEP 4: ============ Encode and Send Response Message ===========
  9346. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9347. {
  9348. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
  9349. errn = -1;
  9350. }
  9351. //STEP 5: ============ Update Flags ===========
  9352. return errn;
  9353. }
  9354. /*===========================================================================
  9355. FUNCTION: Proc_iso1_PowerDeliveryStartRes
  9356. DESCRIPTION:
  9357. PRE-CONDITION:
  9358. INPUT:
  9359. OUTPUT:
  9360. GLOBAL VARIABLES:
  9361. =============================================================================*/
  9362. int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
  9363. {
  9364. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9365. //if it is not the same, the packet should be ignored.
  9366. //STEP 1: ============ Initialize ============
  9367. int i = 0;
  9368. int errn = 0;
  9369. bitstream_t v2g_tx_stream;
  9370. struct iso1PowerDeliveryResType *res;
  9371. struct ChargingInfoData *sys;
  9372. size_t pos = 0;
  9373. v2g_tx_stream.pos = &pos;
  9374. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9375. v2g_tx_stream.data = V2GTP_Tx_buf;
  9376. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9377. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9378. res->ResponseCode = OK_ISO15118_2014;
  9379. //[HEADER] Check Req SessionID
  9380. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9381. {
  9382. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9383. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  9384. errn = -1;
  9385. }
  9386. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9387. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9388. #if PARAMETER_NORMAL_MODE == ENABLE
  9389. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9390. #else
  9391. Sudo_Parameter_iso1_PowerDeliveryRes();
  9392. #endif
  9393. //EVSE Status Code
  9394. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  9395. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9396. //Check for CSU command of "Stop by EVSE"
  9397. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9398. {
  9399. //res->ResponseCode = FAILED_ISO15118_2014;
  9400. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9401. }
  9402. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9403. {
  9404. //res->ResponseCode = FAILED_ISO15118_2014;
  9405. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9406. errn = -1;
  9407. }
  9408. else if (ShmInternalComm->ChargingPermission == FALSE)
  9409. {
  9410. //res->ResponseCode = FAILED_ISO15118_2014;
  9411. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9412. }
  9413. //STEP 4: ============ Encode and Send Response Message ===========
  9414. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9415. {
  9416. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
  9417. errn = -1;
  9418. }
  9419. //STEP 5: ============ Update Flags ===========
  9420. return errn;
  9421. }
  9422. /*===========================================================================
  9423. FUNCTION: Proc_din_PowerDeliveryStartReq
  9424. DESCRIPTION:
  9425. PRE-CONDITION:
  9426. INPUT:
  9427. OUTPUT:
  9428. GLOBAL VARIABLES:
  9429. =============================================================================*/
  9430. int Proc_din_PowerDeliveryStartReq(int AcceptFd)
  9431. {
  9432. int errn = 0;
  9433. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
  9434. //Print the decoded XML Document
  9435. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  9436. //Save into Share Memory
  9437. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9438. //Check for EV Error Code
  9439. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9440. errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
  9441. if (errn == 0)
  9442. {
  9443. //send response successfully.
  9444. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryStartRes");
  9445. }
  9446. else
  9447. {
  9448. sprintf(buf_log_evcomm,
  9449. "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  9450. errn);
  9451. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9452. }
  9453. return errn;
  9454. }
  9455. /*===========================================================================
  9456. FUNCTION: Proc_iso1_PowerDeliveryStartReq
  9457. DESCRIPTION:
  9458. PRE-CONDITION:
  9459. INPUT:
  9460. OUTPUT:
  9461. GLOBAL VARIABLES:
  9462. =============================================================================*/
  9463. int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
  9464. {
  9465. int errn = 0;
  9466. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
  9467. //Print the decoded XML Document
  9468. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  9469. //Save into Share Memory
  9470. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9471. //Check for EV Error Code
  9472. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9473. errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
  9474. if (errn == 0)
  9475. {
  9476. //send response successfully.
  9477. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryStartRes");
  9478. }
  9479. else
  9480. {
  9481. sprintf(buf_log_evcomm,
  9482. "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  9483. errn);
  9484. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9485. }
  9486. return errn;
  9487. }
  9488. /*===========================================================================
  9489. FUNCTION: SHM_Init_din_CurrentDemandRes
  9490. DESCRIPTION:
  9491. PRE-CONDITION:
  9492. INPUT:
  9493. 1. shm_ccs
  9494. OUTPUT:
  9495. 1. shm_ccs
  9496. GLOBAL VARIABLES:
  9497. =============================================================================*/
  9498. void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
  9499. {
  9500. struct CurrentDemandResponse_DIN70121 *in;
  9501. in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
  9502. //----- [BODY (1/10)] ResponseCode -----
  9503. in->ResponseCode = dinresponseCodeType_OK;
  9504. //----- [BODY (2/10)] DC_EVSEStatus -----
  9505. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9506. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9507. short value = 0; int multiplier = 0; unsigned char unit = 0;
  9508. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  9509. value = 0; multiplier = 0; unit = V_DIN70121;
  9510. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  9511. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9512. //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
  9513. value = 0; multiplier = 0; unit = A_DIN70121;
  9514. SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
  9515. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9516. in->EVSECurrentLimitAchieved = FALSE;
  9517. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9518. in->EVSEVoltageLimitAchieved = FALSE;
  9519. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9520. in->EVSEPowerLimitAchieved = FALSE;
  9521. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9522. //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  9523. value = 5000; multiplier = -1; unit = V_DIN70121; //500V
  9524. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
  9525. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9526. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  9527. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
  9528. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9529. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  9530. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
  9531. }
  9532. /*===========================================================================
  9533. FUNCTION: Sudo_Parameter_din_CurrentDemandRes
  9534. DESCRIPTION:
  9535. PRE-CONDITION:
  9536. INPUT:
  9537. OUTPUT:
  9538. GLOBAL VARIABLES:
  9539. =============================================================================*/
  9540. void Sudo_Parameter_din_CurrentDemandRes()
  9541. {
  9542. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9543. init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
  9544. ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  9545. //----- [BODY (1/10)] ResponseCode -----
  9546. struct dinCurrentDemandResType *res;
  9547. res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
  9548. res->ResponseCode = dinresponseCodeType_OK;
  9549. //----- [BODY (2/10)] DC_EVSEStatus -----
  9550. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9551. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  9552. // dinisolationLevelType_Invalid = 0,
  9553. // dinisolationLevelType_Valid = 1,
  9554. // dinisolationLevelType_Warning = 2,
  9555. // dinisolationLevelType_Fault = 3
  9556. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9557. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9558. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  9559. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9560. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9561. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9562. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9563. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9564. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  9565. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  9566. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  9567. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  9568. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  9569. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9570. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  9571. // dinEVSENotificationType_None = 0,
  9572. // dinEVSENotificationType_StopCharging = 1,
  9573. // dinEVSENotificationType_ReNegotiation = 2
  9574. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9575. res->EVSEPresentVoltage.Value = 3820;
  9576. res->EVSEPresentVoltage.Multiplier = -1;
  9577. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9578. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  9579. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9580. res->EVSEPresentCurrent.Value = 1200;
  9581. res->EVSEPresentCurrent.Multiplier = -1;
  9582. res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9583. res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
  9584. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9585. res->EVSECurrentLimitAchieved = 0;
  9586. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9587. res->EVSEVoltageLimitAchieved = 0;
  9588. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9589. res->EVSEPowerLimitAchieved = 0;
  9590. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9591. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9592. res->EVSEMaximumVoltageLimit.Value = 7500;
  9593. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9594. res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9595. res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  9596. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9597. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9598. res->EVSEMaximumCurrentLimit.Value = 1200;
  9599. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9600. res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9601. res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  9602. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9603. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9604. res->EVSEMaximumPowerLimit.Value = 6000;
  9605. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9606. res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9607. res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  9608. }
  9609. /*===========================================================================
  9610. FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
  9611. DESCRIPTION:
  9612. PRE-CONDITION:
  9613. INPUT:
  9614. OUTPUT:
  9615. GLOBAL VARIABLES:
  9616. =============================================================================*/
  9617. void Sudo_Parameter_iso1_CurrentDemandRes()
  9618. {
  9619. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9620. init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
  9621. ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  9622. //----- [BODY (1/10)] ResponseCode -----
  9623. struct iso1CurrentDemandResType *res;
  9624. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
  9625. res->ResponseCode = iso1responseCodeType_OK;
  9626. //----- [BODY (2/10)] DC_EVSEStatus -----
  9627. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9628. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  9629. //iso1isolationLevelType_Invalid = 0,
  9630. //iso1isolationLevelType_Valid = 1,
  9631. //iso1isolationLevelType_Warning = 2,
  9632. //iso1isolationLevelType_Fault = 3,
  9633. //iso1isolationLevelType_No_IMD = 4
  9634. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9635. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9636. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  9637. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9638. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9639. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9640. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9641. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9642. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  9643. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  9644. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  9645. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  9646. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9647. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9648. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9649. //iso1EVSENotificationType_None = 0,
  9650. //iso1EVSENotificationType_StopCharging = 1,
  9651. //iso1EVSENotificationType_ReNegotiation = 2
  9652. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9653. res->EVSEPresentVoltage.Value = 3820;
  9654. res->EVSEPresentVoltage.Multiplier = -1;
  9655. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9656. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  9657. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9658. res->EVSEPresentCurrent.Value = 1200;
  9659. res->EVSEPresentCurrent.Multiplier = -1;
  9660. //res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9661. res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
  9662. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9663. res->EVSECurrentLimitAchieved = 0;
  9664. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9665. res->EVSEVoltageLimitAchieved = 0;
  9666. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9667. res->EVSEPowerLimitAchieved = 0;
  9668. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9669. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9670. res->EVSEMaximumVoltageLimit.Value = 7500;
  9671. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9672. //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9673. res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  9674. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9675. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9676. res->EVSEMaximumCurrentLimit.Value = 1200;
  9677. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9678. //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9679. res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  9680. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9681. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9682. res->EVSEMaximumPowerLimit.Value = 6000;
  9683. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9684. //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9685. res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  9686. }
  9687. /*===========================================================================
  9688. FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
  9689. DESCRIPTION:
  9690. PRE-CONDITION:
  9691. INPUT:
  9692. OUTPUT:
  9693. GLOBAL VARIABLES:
  9694. =============================================================================*/
  9695. void Sudo_Parameter_iso1_ChargingStatusRes()
  9696. {
  9697. int i = 0;
  9698. struct iso1ChargingStatusResType *res;
  9699. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9700. init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
  9701. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
  9702. ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  9703. //----- [BODY (1/10)] ResponseCode -----
  9704. res->ResponseCode = OK_ISO15118_2014;
  9705. //----- [BODY (2/10)] AC_EVSEStatus -----
  9706. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9707. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9708. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9709. // iso1EVSENotificationType_None = 0,
  9710. // iso1EVSENotificationType_StopCharging = 1,
  9711. // iso1EVSENotificationType_ReNegotiation = 2
  9712. //----- [BODY (3/10)] EVSEMaxCurrent -----
  9713. res->EVSEMaxCurrent_isUsed = 1u;
  9714. res->EVSEMaxCurrent.Value = 32;
  9715. res->EVSEMaxCurrent.Multiplier = 0;
  9716. res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
  9717. //----- [BODY (4/10)] SAScheduleTupleID -----
  9718. res->SAScheduleTupleID = 0;
  9719. //----- [BODY (5/10)] EVSEID -----
  9720. res->EVSEID.charactersLen = 37;
  9721. memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
  9722. //sprintf(res->EVSEID.characters, CCS_AC_EVSEID);
  9723. //----- [BODY (6/10)] MeterInfo -----
  9724. res->MeterInfo_isUsed = 1u;
  9725. memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9726. memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9727. //[MeterInfo][1/5] MeterID
  9728. //sprintf(res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9729. //[MeterInfo][2/5] SigMeterReading (optional)
  9730. //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9731. //[MeterInfo][3/5] MeterStatus (optional)
  9732. res->MeterInfo.MeterStatus = 0;
  9733. //[MeterInfo][4/5] MeterReading (optional)
  9734. res->MeterInfo.MeterReading = 12345;
  9735. //[MeterInfo][5/5] TMeter (optional)
  9736. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9737. //----- [BODY (7/10)] ReceiptRequired -----
  9738. res->ReceiptRequired_isUsed = 1u;
  9739. res->ReceiptRequired = FALSE; //optional
  9740. }
  9741. /*===========================================================================
  9742. FUNCTION: Check_EVErrorCode
  9743. DESCRIPTION:
  9744. PRE-CONDITION:
  9745. INPUT:
  9746. OUTPUT:
  9747. GLOBAL VARIABLES:
  9748. =============================================================================*/
  9749. void Check_EVErrorCode(int code)
  9750. {
  9751. struct ChargingInfoData *sys;
  9752. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9753. if (code != NO_ERROR) //NO_ERROR = 0
  9754. {
  9755. //Asking CSU to Stop
  9756. switch (code)
  9757. {
  9758. /*case dinDC_EVErrorCodeType_NO_ERROR: // = 0,
  9759. {
  9760. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NO_ERROR)");
  9761. break;
  9762. }*/
  9763. case dinDC_EVErrorCodeType_FAILED_RESSTemperatureInhibit: // = 1,
  9764. { //023737
  9765. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9766. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9767. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9768. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9769. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9770. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  9771. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_RESSTemperatureInhibit)");
  9772. break;
  9773. }
  9774. case dinDC_EVErrorCodeType_FAILED_EVShiftPosition: // = 2,
  9775. {//023738
  9776. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9777. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9778. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9779. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9780. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9781. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9782. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVShiftPosition)");
  9783. break;
  9784. }
  9785. case dinDC_EVErrorCodeType_FAILED_ChargerConnectorLockFault: // = 3,
  9786. {
  9787. //023739
  9788. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9789. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9790. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9791. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9792. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9793. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9794. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(ChargerConnectorLockFault)");
  9795. break;
  9796. }
  9797. case dinDC_EVErrorCodeType_FAILED_EVRESSMalfunction: // = 4,
  9798. {
  9799. //023740
  9800. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9801. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9802. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9803. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9804. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9805. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  9806. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVRESSMalfunction)");
  9807. break;
  9808. }
  9809. case dinDC_EVErrorCodeType_FAILED_ChargingCurrentdifferential: // = 5,
  9810. {
  9811. //023741
  9812. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9813. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9814. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9815. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9816. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9817. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  9818. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingCurrentdifferential)");
  9819. break;
  9820. }
  9821. case dinDC_EVErrorCodeType_FAILED_ChargingVoltageOutOfRange: // = 6,
  9822. {
  9823. //023742
  9824. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9825. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9826. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9827. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9828. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9829. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  9830. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingVoltageOutOfRange)");
  9831. break;
  9832. }
  9833. case dinDC_EVErrorCodeType_Reserved_A: // = 7,
  9834. {
  9835. //023983
  9836. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9837. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9838. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9839. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9840. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9841. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9842. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_A)");
  9843. break;
  9844. }
  9845. case dinDC_EVErrorCodeType_Reserved_B: // = 8,
  9846. {
  9847. //023983
  9848. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9849. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9850. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9851. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9852. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9853. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9854. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_B)");
  9855. break;
  9856. }
  9857. case dinDC_EVErrorCodeType_Reserved_C: // = 9,
  9858. {
  9859. //023983
  9860. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9861. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9862. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9863. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9864. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9865. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9866. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_C)");
  9867. break;
  9868. }
  9869. case dinDC_EVErrorCodeType_FAILED_ChargingSystemIncompatibility:// = 10,
  9870. {
  9871. //023743
  9872. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9873. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9874. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9875. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9876. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9877. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9878. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingSystemIncompatibility)");
  9879. break;
  9880. }
  9881. case dinDC_EVErrorCodeType_NoData: // = 11
  9882. {
  9883. //023746
  9884. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9885. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9886. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9887. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9888. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9889. ShmStatusCodeData->PresentStatusCode[0][5] = 6;
  9890. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NoData)");
  9891. break;
  9892. }
  9893. default:
  9894. {
  9895. if(sys->EvBatterySoc==100)
  9896. {
  9897. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9898. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9899. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9900. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9901. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9902. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9903. }
  9904. else
  9905. {
  9906. //023983
  9907. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9908. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9909. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9910. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9911. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9912. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9913. }
  9914. DEBUG_PRINTF_EXI_ENGINE_DETAIL("([WARNING] Unexpected din EVErrorCode)");
  9915. break;
  9916. }
  9917. }
  9918. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9919. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9920. //Update_V2G_Flow_Status(Other_Fault);
  9921. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  9922. sprintf(buf_log_evcomm,
  9923. "Stop by EV (EVErrorCode = %d (DEC))",
  9924. code);
  9925. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9926. }
  9927. else
  9928. {
  9929. if(Check_V2G_Flow_Status()>=49)
  9930. {
  9931. if((sys->EvBatterySoc==100)||(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.ChargingComplete))
  9932. {
  9933. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9934. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9935. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9936. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9937. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9938. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9939. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  9940. sprintf(buf_log_evcomm,
  9941. "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023979))",
  9942. code);
  9943. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9944. }
  9945. else if(ShmStatusCodeData->PresentStatusCode[0][1] ==0)
  9946. {
  9947. if(!( (ShmInternalComm->ChargingPermission == FALSE)||
  9948. (sys->DC_EVSEStatus == EVSE_Shutdown)||
  9949. (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)))
  9950. {
  9951. //023983
  9952. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9953. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9954. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9955. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9956. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9957. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9958. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9959. sprintf(buf_log_evcomm,
  9960. "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023983))",
  9961. code);
  9962. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9963. }
  9964. }
  9965. }
  9966. }
  9967. }
  9968. /*===========================================================================
  9969. FUNCTION: Proc_din_CurrentDemandRes
  9970. DESCRIPTION:
  9971. PRE-CONDITION:
  9972. INPUT:
  9973. OUTPUT:
  9974. GLOBAL VARIABLES:
  9975. =============================================================================*/
  9976. int Proc_din_CurrentDemandRes(int AcceptFd)
  9977. {
  9978. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9979. //if it is not the same, the packet should be ignored.
  9980. //STEP 1: ============ Initialize ============
  9981. int i = 0;
  9982. int errn = 0;
  9983. bitstream_t v2g_tx_stream;
  9984. static struct CurrentDemandResponse_DIN70121 *cur;
  9985. static struct ChargingInfoData *sys;
  9986. static int EVSE_max_current;
  9987. int tmp = 0;
  9988. size_t pos = 0;
  9989. v2g_tx_stream.pos = &pos;
  9990. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9991. v2g_tx_stream.data = V2GTP_Tx_buf;
  9992. cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
  9993. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9994. cur->ResponseCode = OK_DIN70121;
  9995. //EVSE Status Code
  9996. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9997. //[HEADER] Check Req SessionID
  9998. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9999. {
  10000. cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10001. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10002. errn = -1;
  10003. }
  10004. //Check for SequenceError
  10005. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10006. {
  10007. cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10008. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10009. errn = -1;
  10010. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10011. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10012. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10013. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10014. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10015. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10016. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10017. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10018. }
  10019. //Check for negative EvBatteryMaxCurrent
  10020. if (sys->EvBatteryMaxCurrent < 0)
  10021. {
  10022. sprintf(buf_log_evcomm,
  10023. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  10024. sys->EvBatteryMaxCurrent);
  10025. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10026. cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  10027. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10028. errn = -1;
  10029. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10030. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  10031. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10032. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10033. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10034. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10035. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  10036. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  10037. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10038. }
  10039. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10040. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
  10041. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  10042. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  10043. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  10044. #endif
  10045. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  10046. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  10047. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  10048. if (sys->EvBatteryMaxVoltage <= 500)
  10049. {
  10050. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  10051. }
  10052. #endif
  10053. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  10054. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  10055. {
  10056. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  10057. //[To-Do] Limit is achieved flag
  10058. }
  10059. //Isolation Status
  10060. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  10061. {
  10062. #if 0
  10063. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  10064. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10065. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10066. sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  10067. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10068. //Update_V2G_Flow_Status(Other_Fault);
  10069. //errn = -1;
  10070. #else
  10071. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10072. #endif
  10073. }
  10074. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10075. {
  10076. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10077. }
  10078. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10079. {
  10080. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10081. }
  10082. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10083. {
  10084. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10085. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10086. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10087. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
  10088. Update_V2G_Flow_Status(Other_Fault);
  10089. errn = -1;
  10090. }
  10091. else //GFD_No_IMD or other unexpected status
  10092. {
  10093. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10094. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10095. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10096. sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10097. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10098. Update_V2G_Flow_Status(Other_Fault);
  10099. errn = -1;
  10100. }
  10101. //For testing with Tesla Model 3
  10102. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  10103. //[CAUTION][To-Do] Decresement of Current is not implemented.
  10104. //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
  10105. if (sys->EvBatterytargetCurrent <= 0)
  10106. {
  10107. EVSE_max_current = 50; //10A
  10108. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  10109. /*
  10110. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10111. sys->PresentChargingCurrent,
  10112. sys->EvBatterytargetCurrent,
  10113. EVSE_max_current,
  10114. cur->EVSEMaximumCurrentLimit.Value
  10115. );
  10116. */
  10117. }
  10118. else //1A
  10119. {
  10120. /*
  10121. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10122. sys->PresentChargingCurrent,
  10123. sys->EvBatterytargetCurrent,
  10124. EVSE_max_current,
  10125. cur->EVSEMaximumCurrentLimit.Value
  10126. );
  10127. */
  10128. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  10129. {
  10130. tmp = EVSE_max_current + 50; //10A
  10131. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  10132. {
  10133. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  10134. EVSE_max_current = tmp;
  10135. }
  10136. else
  10137. {
  10138. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  10139. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  10140. }
  10141. }
  10142. }
  10143. #endif
  10144. //Check for CSU command of "Stop by EVSE"
  10145. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10146. {
  10147. //Check for Alarm Code: CCS GFD trip (012235)
  10148. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10149. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10150. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10151. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10152. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10153. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10154. {
  10155. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  10156. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  10157. }
  10158. else
  10159. {
  10160. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
  10161. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10162. }
  10163. //cur->ResponseCode = FAILED_DIN70121;
  10164. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10165. //errn = -1;
  10166. }
  10167. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10168. {
  10169. //Check for Alarm Code: CCS GFD trip (012235)
  10170. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10171. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10172. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10173. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10174. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10175. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10176. {
  10177. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  10178. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  10179. }
  10180. else
  10181. {
  10182. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  10183. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10184. }
  10185. //cur->ResponseCode = FAILED_DIN70121;
  10186. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10187. errn = -1;
  10188. }
  10189. else if (ShmInternalComm->ChargingPermission == FALSE)
  10190. {
  10191. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]Permission OFF");
  10192. //cur->ResponseCode = FAILED_DIN70121;
  10193. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10194. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10195. //errn = -1;
  10196. }
  10197. else
  10198. {
  10199. //null
  10200. }
  10201. //Response to CP Error
  10202. #if CP_PROTECTION_MECHANISM == ENABLE
  10203. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10204. {
  10205. if(sys->CpState <= 1)
  10206. {
  10207. cur->ResponseCode = FAILED_DIN70121;
  10208. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10209. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10210. Update_V2G_Flow_Status(Other_Fault);
  10211. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10212. //CCS_SECC_CP_State_Error (023889)
  10213. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10214. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10215. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10216. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10217. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10218. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10219. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10220. sprintf(buf_log_evcomm,
  10221. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  10222. sys->CpState,
  10223. sys->CpVoltage);
  10224. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10225. }
  10226. else
  10227. {
  10228. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE Normal Stop");
  10229. //cur->ResponseCode = FAILED_DIN70121;
  10230. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10231. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10232. //errn = -1;
  10233. }
  10234. }
  10235. #endif
  10236. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10237. #if PARAMETER_NORMAL_MODE == ENABLE
  10238. SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
  10239. #else
  10240. Sudo_Parameter_din_CurrentDemandRes();
  10241. #endif
  10242. //STEP 4: ============ Encode and Send Response Message ===========
  10243. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10244. {
  10245. errn = -1;
  10246. }
  10247. //STEP 5: ============ Update Flags ===========
  10248. return errn;
  10249. }
  10250. /*===========================================================================
  10251. FUNCTION: Proc_iso1_CurrentDemandRes
  10252. DESCRIPTION:
  10253. PRE-CONDITION:
  10254. INPUT:
  10255. OUTPUT:
  10256. GLOBAL VARIABLES:
  10257. =============================================================================*/
  10258. int Proc_iso1_CurrentDemandRes(int AcceptFd)
  10259. {
  10260. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10261. //if it is not the same, the packet should be ignored.
  10262. //STEP 1: ============ Initialize ============
  10263. int i = 0;
  10264. int errn = 0;
  10265. bitstream_t v2g_tx_stream;
  10266. static struct CurrentDemandResponse_ISO15118_2014 *cur;
  10267. static struct ChargingInfoData *sys;
  10268. static int EVSE_max_current;
  10269. int tmp = 0;
  10270. size_t pos = 0;
  10271. v2g_tx_stream.pos = &pos;
  10272. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10273. v2g_tx_stream.data = V2GTP_Tx_buf;
  10274. cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
  10275. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10276. cur->ResponseCode = OK_ISO15118_2014;
  10277. //EVSE Status Code
  10278. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10279. //[HEADER] Check Req SessionID
  10280. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10281. {
  10282. cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10283. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10284. errn = -1;
  10285. }
  10286. //Check for SequenceError
  10287. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10288. {
  10289. cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10290. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10291. errn = -1;
  10292. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10293. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10294. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10295. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10296. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10297. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10298. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10299. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10300. }
  10301. //Check for negative EvBatteryMaxCurrent
  10302. if (sys->EvBatteryMaxCurrent < 0)
  10303. {
  10304. sprintf(buf_log_evcomm,
  10305. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  10306. sys->EvBatteryMaxCurrent);
  10307. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10308. cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  10309. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10310. errn = -1;
  10311. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10312. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  10313. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10314. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10315. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10316. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10317. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  10318. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  10319. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10320. }
  10321. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10322. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
  10323. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  10324. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  10325. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  10326. #endif
  10327. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  10328. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  10329. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  10330. if (sys->EvBatteryMaxVoltage <= 500)
  10331. {
  10332. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  10333. }
  10334. #endif
  10335. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  10336. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  10337. {
  10338. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  10339. //[To-Do] Limit is achieved flag
  10340. }
  10341. //Isolation Status
  10342. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  10343. {
  10344. #if 0
  10345. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  10346. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10347. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10348. sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  10349. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10350. // Update_V2G_Flow_Status(Other_Fault);
  10351. //errn = -1;
  10352. #else
  10353. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10354. #endif
  10355. }
  10356. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10357. {
  10358. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10359. }
  10360. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10361. {
  10362. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //2
  10363. }
  10364. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10365. {
  10366. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10367. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10368. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10369. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
  10370. Update_V2G_Flow_Status(Other_Fault);
  10371. errn = -1;
  10372. }
  10373. else
  10374. {
  10375. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10376. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10377. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10378. sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10379. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10380. Update_V2G_Flow_Status(Other_Fault);
  10381. errn = -1;
  10382. }
  10383. //For testing with Tesla Model 3
  10384. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  10385. //[CAUTION][To-Do] Decresement of Current is not implemented.
  10386. //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
  10387. if (sys->EvBatterytargetCurrent <= 0)
  10388. {
  10389. EVSE_max_current = 50; //10A
  10390. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  10391. /*
  10392. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10393. sys->PresentChargingCurrent,
  10394. sys->EvBatterytargetCurrent,
  10395. EVSE_max_current,
  10396. cur->EVSEMaximumCurrentLimit.Value
  10397. );
  10398. */
  10399. }
  10400. else //1A
  10401. {
  10402. /*
  10403. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10404. sys->PresentChargingCurrent,
  10405. sys->EvBatterytargetCurrent,
  10406. EVSE_max_current,
  10407. cur->EVSEMaximumCurrentLimit.Value
  10408. );
  10409. */
  10410. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  10411. {
  10412. tmp = EVSE_max_current + 50; //10A
  10413. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  10414. {
  10415. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  10416. EVSE_max_current = tmp;
  10417. }
  10418. else
  10419. {
  10420. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  10421. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  10422. }
  10423. }
  10424. }
  10425. #endif
  10426. //Check for CSU command of "Stop by EVSE"
  10427. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10428. {
  10429. //Check for Alarm Code: CCS GFD trip (012235)
  10430. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10431. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10432. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10433. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10434. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10435. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10436. {
  10437. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  10438. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  10439. }
  10440. else
  10441. {
  10442. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
  10443. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10444. }
  10445. //cur->ResponseCode = FAILED_ISO15118_2014;
  10446. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10447. //errn = -1;
  10448. }
  10449. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10450. {
  10451. //Check for Alarm Code: CCS GFD trip (012235)
  10452. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10453. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10454. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10455. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10456. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10457. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10458. {
  10459. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  10460. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  10461. }
  10462. else
  10463. {
  10464. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  10465. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10466. }
  10467. //cur->ResponseCode = FAILED_ISO15118_2014;
  10468. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10469. errn = -1;
  10470. }
  10471. else if (ShmInternalComm->ChargingPermission == FALSE)
  10472. {
  10473. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]Permission OFF");
  10474. //cur->ResponseCode = FAILED_ISO15118_2014;
  10475. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10476. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10477. //errn = -1;
  10478. }
  10479. else
  10480. {
  10481. //null
  10482. }
  10483. //Response to CP Error
  10484. #if CP_PROTECTION_MECHANISM == ENABLE
  10485. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10486. {
  10487. if(sys->CpState <= 1)
  10488. {
  10489. cur->ResponseCode = FAILED_ISO15118_2014;
  10490. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10491. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10492. Update_V2G_Flow_Status(Other_Fault);
  10493. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10494. //CCS_SECC_CP_State_Error (023889)
  10495. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10496. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10497. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10498. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10499. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10500. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10501. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10502. sprintf(buf_log_evcomm,
  10503. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  10504. sys->CpState,
  10505. sys->CpVoltage);
  10506. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10507. }
  10508. else
  10509. {
  10510. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE Normal Stop");
  10511. //cur->ResponseCode = FAILED_ISO15118_2014;
  10512. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10513. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10514. }
  10515. }
  10516. #endif
  10517. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10518. #if PARAMETER_NORMAL_MODE == ENABLE
  10519. SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10520. #else
  10521. Sudo_Parameter_iso1_CurrentDemandRes();
  10522. #endif
  10523. //STEP 4: ============ Encode and Send Response Message ===========
  10524. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10525. {
  10526. errn = -1;
  10527. }
  10528. //STEP 5: ============ Update Flags ===========
  10529. return errn;
  10530. }
  10531. /*===========================================================================
  10532. FUNCTION: Proc_iso1_ChargingStatusRes
  10533. DESCRIPTION:
  10534. PRE-CONDITION:
  10535. INPUT:
  10536. OUTPUT:
  10537. GLOBAL VARIABLES:
  10538. =============================================================================*/
  10539. int Proc_iso1_ChargingStatusRes(int AcceptFd)
  10540. {
  10541. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10542. //if it is not the same, the packet should be ignored.
  10543. //STEP 1: ============ Initialize ============
  10544. int i = 0;
  10545. int errn = 0;
  10546. bitstream_t v2g_tx_stream;
  10547. static struct ChargingStatusResponse_ISO15118_2014 *res;
  10548. static struct ChargingInfoData *sys;
  10549. size_t pos = 0;
  10550. v2g_tx_stream.pos = &pos;
  10551. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10552. v2g_tx_stream.data = V2GTP_Tx_buf;
  10553. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
  10554. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10555. //Init
  10556. res->ResponseCode = OK_ISO15118_2014;
  10557. res->ReceiptRequired = FALSE; //optional
  10558. res->SAScheduleTupleID = 1;
  10559. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  10560. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  10561. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  10562. // iso1EVSENotificationType_None = 0,
  10563. // iso1EVSENotificationType_StopCharging = 1,
  10564. // iso1EVSENotificationType_ReNegotiation = 2
  10565. //[HEADER] Check Req SessionID
  10566. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10567. {
  10568. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10569. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10570. errn = -1;
  10571. }
  10572. //Check for SequenceError
  10573. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10574. {
  10575. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10576. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10577. errn = -1;
  10578. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10579. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10580. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10581. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10582. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10583. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10584. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10585. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10586. }
  10587. //EVSE ID
  10588. memset(res->EVSEID, 0, sizeof(res->EVSEID));
  10589. res->EVSEID[0]='Z';
  10590. res->EVSEID[1]='Z';
  10591. res->EVSEID[2]='0';
  10592. res->EVSEID[3]='0';
  10593. res->EVSEID[4]='0';
  10594. res->EVSEID[5]='0';
  10595. res->EVSEID[6]='0';
  10596. //sprintf(res->EVSEID, CCS_AC_EVSEID);
  10597. //[MeterInfo][0/5] init
  10598. //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  10599. //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  10600. //[MeterInfo][1/5] MeterID
  10601. strcpy(res->MeterInfo.MeterID , ShmSysConfigAndInfo->SysConfig.SerialNumber);
  10602. //[MeterInfo][2/5] SigMeterReading (optional)
  10603. //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  10604. //[MeterInfo][3/5] MeterStatus (optional)
  10605. res->MeterInfo.MeterStatus = 1;
  10606. //[MeterInfo][4/5] MeterReading (optional)
  10607. res->MeterInfo.MeterReading = ShmInternalComm->AC_MeterReadingValue;//Wh
  10608. //[MeterInfo][5/5] TMeter (optional)
  10609. res->MeterInfo.TMeter = time(NULL); //Unix Time Stamp format
  10610. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10611. SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  10612. //Isolation Status (RCD)
  10613. if (ShmInternalComm->AC_RcdStatus == 1) //RCD tripped,Isolation is invalid
  10614. {
  10615. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  10616. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10617. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10618. sprintf(buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
  10619. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10620. Update_V2G_Flow_Status(Other_Fault);
  10621. errn = -1;
  10622. }
  10623. if (ShmInternalComm->ChargingPermission == FALSE)
  10624. {
  10625. //res->ResponseCode = FAILED_ISO15118_2014;
  10626. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10627. sprintf(buf_log_evcomm, "[ISO1][ChargingStatusRes]ChargingPermission = FALSE");
  10628. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10629. //errn = -1;
  10630. }
  10631. //Response to CP Error
  10632. //#if CP_PROTECTION_MECHANISM == ENABLE
  10633. #if 1
  10634. // if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10635. if ((sys->CpState < 3) || (sys->CpState > 5)) //State C (6V), D (3V)
  10636. {
  10637. res->ResponseCode = FAILED_ISO15118_2014;
  10638. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10639. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10640. Update_V2G_Flow_Status(Other_Fault);
  10641. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10642. //CCS_SECC_CP_State_Error (023889)
  10643. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10644. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10645. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10646. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10647. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10648. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10649. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10650. sprintf(buf_log_evcomm,
  10651. "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
  10652. sys->CpState,
  10653. sys->CpVoltage);
  10654. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10655. }
  10656. #endif
  10657. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10658. #if PARAMETER_NORMAL_MODE == ENABLE
  10659. SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10660. #else
  10661. Sudo_Parameter_iso1_ChargingStatusRes();
  10662. #endif
  10663. //STEP 4: ============ Encode and Send Response Message ===========
  10664. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10665. {
  10666. errn = -1;
  10667. }
  10668. //STEP 5: ============ Update Flags ===========
  10669. return errn;
  10670. }
  10671. /*===========================================================================
  10672. FUNCTION: Proc_din_CurrentDemandReq
  10673. DESCRIPTION:
  10674. PRE-CONDITION:
  10675. INPUT:
  10676. OUTPUT:
  10677. GLOBAL VARIABLES:
  10678. =============================================================================*/
  10679. int Proc_din_CurrentDemandReq(int AcceptFd)
  10680. {
  10681. int errn = 0;
  10682. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
  10683. //Print the decoded XML Document
  10684. PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
  10685. //Save into Share Memory
  10686. SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10687. //Check for EV Error Code
  10688. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  10689. errn = Proc_din_CurrentDemandRes(AcceptFd);
  10690. if (errn == 0)
  10691. {
  10692. //Response is sent successfully.
  10693. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CurrentDemandRes");
  10694. }
  10695. else
  10696. {
  10697. sprintf(buf_log_evcomm,
  10698. "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  10699. errn);
  10700. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10701. }
  10702. return errn;
  10703. }
  10704. /*===========================================================================
  10705. FUNCTION: Proc_iso1_CurrentDemandReq
  10706. DESCRIPTION:
  10707. PRE-CONDITION:
  10708. INPUT:
  10709. OUTPUT:
  10710. GLOBAL VARIABLES:
  10711. =============================================================================*/
  10712. int Proc_iso1_CurrentDemandReq(int AcceptFd)
  10713. {
  10714. int errn = 0;
  10715. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
  10716. //Print the decoded XML Document
  10717. PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
  10718. //Save into Share Memory
  10719. SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10720. //Check for EV Error Code
  10721. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  10722. errn = Proc_iso1_CurrentDemandRes(AcceptFd);
  10723. if (errn == 0)
  10724. {
  10725. //Response is sent successfully.
  10726. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CurrentDemandRes");
  10727. }
  10728. else
  10729. {
  10730. sprintf(buf_log_evcomm,
  10731. "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  10732. errn);
  10733. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10734. }
  10735. return errn;
  10736. }
  10737. /*===========================================================================
  10738. FUNCTION: Proc_iso1_ChargingStatusReq
  10739. DESCRIPTION:
  10740. PRE-CONDITION:
  10741. INPUT:
  10742. OUTPUT:
  10743. GLOBAL VARIABLES:
  10744. =============================================================================*/
  10745. int Proc_iso1_ChargingStatusReq(int AcceptFd)
  10746. {
  10747. int errn = 0;
  10748. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
  10749. //Print the decoded XML Document
  10750. PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
  10751. //Save into Share Memory
  10752. SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10753. //Check for EV Error Code
  10754. //no content in ISO1
  10755. errn = Proc_iso1_ChargingStatusRes(AcceptFd);
  10756. if (errn == 0)
  10757. {
  10758. //Response is sent successfully.
  10759. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargingStatusRes");
  10760. }
  10761. else
  10762. {
  10763. sprintf(buf_log_evcomm,
  10764. "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
  10765. errn);
  10766. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10767. }
  10768. return errn;
  10769. }
  10770. /*===========================================================================
  10771. FUNCTION: Proc_din_PowerDeliveryStopRes
  10772. DESCRIPTION:
  10773. PRE-CONDITION:
  10774. INPUT:
  10775. OUTPUT:
  10776. GLOBAL VARIABLES:
  10777. =============================================================================*/
  10778. int Proc_din_PowerDeliveryStopRes(int AcceptFd)
  10779. {
  10780. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10781. //if it is not the same, the packet should be ignored.
  10782. //STEP 1: ============ Initialize ============
  10783. int i = 0;
  10784. int errn = 0;
  10785. bitstream_t v2g_tx_stream;
  10786. struct dinPowerDeliveryResType *res;
  10787. struct ChargingInfoData *sys;
  10788. size_t pos = 0;
  10789. v2g_tx_stream.pos = &pos;
  10790. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10791. v2g_tx_stream.data = V2GTP_Tx_buf;
  10792. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  10793. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10794. res->ResponseCode = OK_DIN70121;
  10795. //[HEADER] Check Req SessionID
  10796. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10797. {
  10798. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10799. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10800. errn = -1;
  10801. }
  10802. //Check for SequenceError
  10803. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10804. {
  10805. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10806. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10807. errn = -1;
  10808. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10809. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10810. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10811. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10812. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10813. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10814. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10815. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10816. }
  10817. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10818. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10819. #if PARAMETER_NORMAL_MODE == ENABLE
  10820. ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
  10821. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  10822. #else
  10823. Sudo_Parameter_din_PreChargeRes();
  10824. #endif
  10825. //EVSE Status Code
  10826. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10827. //Check for CSU command of "Stop by EVSE"
  10828. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10829. {
  10830. //res->ResponseCode = FAILED_DIN70121;
  10831. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10832. }
  10833. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10834. {
  10835. //res->ResponseCode = FAILED_DIN70121;
  10836. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10837. errn = -1;
  10838. }
  10839. else if (ShmInternalComm->ChargingPermission == FALSE)
  10840. {
  10841. //res->ResponseCode = FAILED_DIN70121;
  10842. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10843. }
  10844. //STEP 4: ============ Encode and Send Response Message ===========
  10845. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10846. {
  10847. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10848. errn = -1;
  10849. }
  10850. //STEP 5: ============ Update Flags ===========
  10851. return errn;
  10852. }
  10853. /*===========================================================================
  10854. FUNCTION: Proc_iso1_PowerDeliveryStopRes
  10855. DESCRIPTION:
  10856. PRE-CONDITION:
  10857. INPUT:
  10858. OUTPUT:
  10859. GLOBAL VARIABLES:
  10860. =============================================================================*/
  10861. int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
  10862. {
  10863. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10864. //if it is not the same, the packet should be ignored.
  10865. //STEP 1: ============ Initialize ============
  10866. int i = 0;
  10867. int errn = 0;
  10868. bitstream_t v2g_tx_stream;
  10869. struct iso1PowerDeliveryResType *res;
  10870. struct ChargingInfoData *sys;
  10871. size_t pos = 0;
  10872. v2g_tx_stream.pos = &pos;
  10873. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10874. v2g_tx_stream.data = V2GTP_Tx_buf;
  10875. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  10876. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10877. res->ResponseCode = OK_ISO15118_2014;
  10878. //[HEADER] Check Req SessionID
  10879. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10880. {
  10881. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10882. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10883. errn = -1;
  10884. }
  10885. //Check for SequenceError
  10886. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10887. {
  10888. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10889. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10890. errn = -1;
  10891. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10892. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10893. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10894. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10895. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10896. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10897. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10898. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10899. }
  10900. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10901. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10902. #if PARAMETER_NORMAL_MODE == ENABLE
  10903. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  10904. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
  10905. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10906. #else
  10907. Sudo_Parameter_iso1_PreChargeRes();
  10908. #endif
  10909. //EVSE Status Code
  10910. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10911. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1 /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10912. //Check for CSU command of "Stop by EVSE"
  10913. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10914. {
  10915. //res->ResponseCode = FAILED_ISO15118_2014;
  10916. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10917. }
  10918. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10919. {
  10920. //res->ResponseCode = FAILED_ISO15118_2014;
  10921. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10922. errn = -1;
  10923. }
  10924. else if (ShmInternalComm->ChargingPermission == FALSE)
  10925. {
  10926. //res->ResponseCode = FAILED_ISO15118_2014;
  10927. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10928. }
  10929. //STEP 4: ============ Encode and Send Response Message ===========
  10930. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10931. {
  10932. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10933. errn = -1;
  10934. }
  10935. //STEP 5: ============ Update Flags ===========
  10936. return errn;
  10937. }
  10938. /*===========================================================================
  10939. FUNCTION: Proc_din_PowerDeliveryStopReq
  10940. DESCRIPTION:
  10941. PRE-CONDITION:
  10942. INPUT:
  10943. OUTPUT:
  10944. GLOBAL VARIABLES:
  10945. =============================================================================*/
  10946. int Proc_din_PowerDeliveryStopReq(int AcceptFd)
  10947. {
  10948. int errn = 0;
  10949. struct ChargingInfoData *sys;
  10950. //Request CSU to STOP
  10951. //This should be reponsed as soon as possible once this message is received.
  10952. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10953. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10954. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10955. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10956. //Print the decoded XML Document
  10957. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  10958. //Save into Share Memory
  10959. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10960. //Check for EV Error Code
  10961. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10962. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10963. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10964. usleep(1500000); //1.5 seconds
  10965. //sleep(1); //1 second
  10966. errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
  10967. if (errn == 0)
  10968. {
  10969. //send response successfully.
  10970. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
  10971. }
  10972. else
  10973. {
  10974. sprintf(buf_log_evcomm,
  10975. "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10976. errn);
  10977. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10978. }
  10979. return errn;
  10980. }
  10981. /*===========================================================================
  10982. FUNCTION: Proc_iso1_PowerDeliveryStopReq
  10983. DESCRIPTION:
  10984. PRE-CONDITION:
  10985. INPUT:
  10986. OUTPUT:
  10987. GLOBAL VARIABLES:
  10988. =============================================================================*/
  10989. int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
  10990. {
  10991. int errn = 0;
  10992. struct ChargingInfoData *sys;
  10993. //Request CSU to STOP
  10994. //This should be reponsed as soon as possible once this message is received.
  10995. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10996. //Print the decoded XML Document
  10997. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  10998. //Save into Share Memory
  10999. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11000. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  11001. {
  11002. //CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11003. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  11004. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  11005. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11006. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Stop)\n");
  11007. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  11008. usleep(1500000); //1.5 seconds
  11009. //sleep(1); //1 second
  11010. }
  11011. else
  11012. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Renegotiation)\n");
  11013. //Check for EV Error Code
  11014. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  11015. errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
  11016. if (errn == 0)
  11017. {
  11018. //send response successfully.
  11019. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryRes (2nd-stop)");
  11020. }
  11021. else
  11022. {
  11023. sprintf(buf_log_evcomm,
  11024. "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  11025. errn);
  11026. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11027. }
  11028. return errn;
  11029. }
  11030. /*===========================================================================
  11031. FUNCTION: SHM_Init_din_WeldingDetectionRes
  11032. DESCRIPTION:
  11033. PRE-CONDITION:
  11034. INPUT:
  11035. 1. shm_ccs
  11036. OUTPUT:
  11037. 1. shm_ccs
  11038. GLOBAL VARIABLES:
  11039. =============================================================================*/
  11040. void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
  11041. {
  11042. struct WeldingDetectionResponse_DIN70121 *in;
  11043. in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
  11044. //----- [BODY (1/3)] ResponseCode -----
  11045. in->ResponseCode = dinresponseCodeType_OK;
  11046. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11047. short value = 0; int multiplier = 0; unsigned char unit = 0;
  11048. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  11049. value = 0; multiplier = 0; unit = V_DIN70121;
  11050. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  11051. //----- [BODY (3/3)] DC_EVSEStatus -----
  11052. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  11053. }
  11054. /*===========================================================================
  11055. FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
  11056. DESCRIPTION:
  11057. PRE-CONDITION:
  11058. INPUT:
  11059. OUTPUT:
  11060. GLOBAL VARIABLES:
  11061. =============================================================================*/
  11062. void Sudo_Parameter_din_WeldingDetectionRes()
  11063. {
  11064. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  11065. init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
  11066. ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  11067. //----- [BODY (1/3)] ResponseCode -----
  11068. struct dinWeldingDetectionResType *res;
  11069. res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
  11070. res->ResponseCode = dinresponseCodeType_OK;
  11071. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11072. res->EVSEPresentVoltage.Value = 3820;
  11073. res->EVSEPresentVoltage.Multiplier = -1;
  11074. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  11075. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  11076. // dinunitSymbolType_h = 0,
  11077. // dinunitSymbolType_m = 1,
  11078. // dinunitSymbolType_s = 2,
  11079. // dinunitSymbolType_A = 3,
  11080. // dinunitSymbolType_Ah = 4,
  11081. // dinunitSymbolType_V = 5,
  11082. // dinunitSymbolType_VA = 6,
  11083. // dinunitSymbolType_W = 7,
  11084. // dinunitSymbolType_W_s = 8,
  11085. // dinunitSymbolType_Wh = 9
  11086. //----- [BODY (3/3)] DC_EVSEStatus -----
  11087. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  11088. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  11089. // dinisolationLevelType_Invalid = 0,
  11090. // dinisolationLevelType_Valid = 1,
  11091. // dinisolationLevelType_Warning = 2,
  11092. // dinisolationLevelType_Fault = 3
  11093. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  11094. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  11095. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  11096. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  11097. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  11098. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  11099. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  11100. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  11101. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  11102. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  11103. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  11104. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  11105. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  11106. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  11107. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  11108. // dinEVSENotificationType_None = 0,
  11109. // dinEVSENotificationType_StopCharging = 1,
  11110. // dinEVSENotificationType_ReNegotiation = 2
  11111. }
  11112. /*===========================================================================
  11113. FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
  11114. DESCRIPTION:
  11115. PRE-CONDITION:
  11116. INPUT:
  11117. OUTPUT:
  11118. GLOBAL VARIABLES:
  11119. =============================================================================*/
  11120. void Sudo_Parameter_iso1_WeldingDetectionRes()
  11121. {
  11122. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  11123. init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
  11124. ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  11125. //----- [BODY (1/3)] ResponseCode -----
  11126. struct iso1WeldingDetectionResType *res;
  11127. res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
  11128. res->ResponseCode = iso1responseCodeType_OK;
  11129. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11130. res->EVSEPresentVoltage.Value = 3820;
  11131. res->EVSEPresentVoltage.Multiplier = -1;
  11132. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  11133. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  11134. //iso1unitSymbolType_h = 0,
  11135. //iso1unitSymbolType_m = 1,
  11136. //iso1unitSymbolType_s = 2,
  11137. //iso1unitSymbolType_A = 3,
  11138. //iso1unitSymbolType_V = 4,
  11139. //iso1unitSymbolType_W = 5,
  11140. //iso1unitSymbolType_Wh = 6
  11141. //----- [BODY (3/3)] DC_EVSEStatus -----
  11142. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  11143. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  11144. //iso1isolationLevelType_Invalid = 0,
  11145. //iso1isolationLevelType_Valid = 1,
  11146. //iso1isolationLevelType_Warning = 2,
  11147. //iso1isolationLevelType_Fault = 3,
  11148. //iso1isolationLevelType_No_IMD = 4
  11149. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11150. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  11151. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  11152. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  11153. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  11154. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  11155. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  11156. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  11157. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  11158. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  11159. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  11160. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  11161. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  11162. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  11163. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  11164. //iso1EVSENotificationType_None = 0,
  11165. //iso1EVSENotificationType_StopCharging = 1,
  11166. //iso1EVSENotificationType_ReNegotiation = 2
  11167. }
  11168. /*===========================================================================
  11169. FUNCTION: Proc_din_WeldingDetectionRes
  11170. DESCRIPTION:
  11171. PRE-CONDITION:
  11172. INPUT:
  11173. OUTPUT:
  11174. GLOBAL VARIABLES:
  11175. =============================================================================*/
  11176. int Proc_din_WeldingDetectionRes(int AcceptFd)
  11177. {
  11178. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11179. //if it is not the same, the packet should be ignored.
  11180. //STEP 1: ============ Initialize ============
  11181. int i = 0;
  11182. int errn = 0;
  11183. bitstream_t v2g_tx_stream;
  11184. static struct WeldingDetectionResponse_DIN70121 *wel;
  11185. static struct ChargingInfoData *sys;
  11186. size_t pos = 0;
  11187. v2g_tx_stream.pos = &pos;
  11188. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11189. v2g_tx_stream.data = V2GTP_Tx_buf;
  11190. wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
  11191. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11192. wel->ResponseCode = OK_DIN70121;
  11193. //[HEADER] Check Req SessionID
  11194. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  11195. {
  11196. wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  11197. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11198. errn = -1;
  11199. }
  11200. //Check for SequenceError
  11201. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11202. {
  11203. wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  11204. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11205. errn = -1;
  11206. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11207. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11208. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11209. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11210. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11211. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11212. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11213. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11214. }
  11215. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11216. SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  11217. //EVSE Status Code
  11218. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  11219. //Check for CSU command of "Stop by EVSE"
  11220. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  11221. {
  11222. //wel->ResponseCode = FAILED_DIN70121;
  11223. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  11224. }
  11225. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  11226. {
  11227. //wel->ResponseCode = FAILED_DIN70121;
  11228. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11229. errn = -1;
  11230. }
  11231. else if (ShmInternalComm->ChargingPermission == FALSE)
  11232. {
  11233. //wel->ResponseCode = FAILED_DIN70121;
  11234. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  11235. }
  11236. //Isolation Status
  11237. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  11238. {
  11239. // wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  11240. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  11241. //wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11242. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11243. sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  11244. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11245. //Update_V2G_Flow_Status(Other_Fault);
  11246. // errn = -1;
  11247. }
  11248. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  11249. {
  11250. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  11251. }
  11252. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  11253. {
  11254. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  11255. }
  11256. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  11257. {
  11258. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  11259. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11260. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11261. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
  11262. Update_V2G_Flow_Status(Other_Fault);
  11263. errn = -1;
  11264. }
  11265. else //GFD_No_IMD or other unexpected status
  11266. {
  11267. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  11268. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11269. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11270. sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  11271. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11272. Update_V2G_Flow_Status(Other_Fault);
  11273. errn = -1;
  11274. }
  11275. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11276. #if PARAMETER_NORMAL_MODE == ENABLE
  11277. SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
  11278. #else
  11279. Sudo_Parameter_din_WeldingDetectionRes();
  11280. #endif
  11281. //STEP 4: ============ Encode and Send Response Message ===========
  11282. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  11283. {
  11284. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
  11285. errn = -1;
  11286. }
  11287. //STEP 5: ============ Update Flags ===========
  11288. return errn;
  11289. }
  11290. /*===========================================================================
  11291. FUNCTION: Proc_iso1_WeldingDetectionRes
  11292. DESCRIPTION:
  11293. PRE-CONDITION:
  11294. INPUT:
  11295. OUTPUT:
  11296. GLOBAL VARIABLES:
  11297. =============================================================================*/
  11298. int Proc_iso1_WeldingDetectionRes(int AcceptFd)
  11299. {
  11300. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11301. //if it is not the same, the packet should be ignored.
  11302. //STEP 1: ============ Initialize ============
  11303. int i = 0;
  11304. int errn = 0;
  11305. bitstream_t v2g_tx_stream;
  11306. static struct WeldingDetectionResponse_ISO15118_2014 *wel;
  11307. static struct ChargingInfoData *sys;
  11308. size_t pos = 0;
  11309. v2g_tx_stream.pos = &pos;
  11310. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11311. v2g_tx_stream.data = V2GTP_Tx_buf;
  11312. wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
  11313. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11314. wel->ResponseCode = OK_ISO15118_2014;
  11315. //[HEADER] Check Req SessionID
  11316. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  11317. {
  11318. wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  11319. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11320. errn = -1;
  11321. }
  11322. //Check for SequenceError
  11323. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11324. {
  11325. wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  11326. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11327. errn = -1;
  11328. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11329. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11330. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11331. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11332. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11333. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11334. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11335. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11336. }
  11337. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11338. SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  11339. //EVSE Status Code
  11340. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11341. //Check for CSU command of "Stop by EVSE"
  11342. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  11343. {
  11344. //wel->ResponseCode = FAILED_ISO15118_2014;
  11345. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11346. }
  11347. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  11348. {
  11349. //wel->ResponseCode = FAILED_ISO15118_2014;
  11350. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11351. errn = -1;
  11352. }
  11353. else if (ShmInternalComm->ChargingPermission == FALSE)
  11354. {
  11355. //wel->ResponseCode = FAILED_ISO15118_2014;
  11356. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11357. }
  11358. //Isolation Status
  11359. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  11360. {
  11361. //wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  11362. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  11363. // wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11364. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11365. sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  11366. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11367. // Update_V2G_Flow_Status(Other_Fault);
  11368. // errn = -1;
  11369. }
  11370. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  11371. {
  11372. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  11373. }
  11374. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  11375. {
  11376. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  11377. }
  11378. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  11379. {
  11380. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  11381. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11382. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11383. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
  11384. Update_V2G_Flow_Status(Other_Fault);
  11385. errn = -1;
  11386. }
  11387. else
  11388. {
  11389. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  11390. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11391. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11392. sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  11393. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11394. Update_V2G_Flow_Status(Other_Fault);
  11395. errn = -1;
  11396. }
  11397. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11398. #if PARAMETER_NORMAL_MODE == ENABLE
  11399. SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
  11400. #else
  11401. Sudo_Parameter_iso1_WeldingDetectionRes();
  11402. #endif
  11403. //STEP 4: ============ Encode and Send Response Message ===========
  11404. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  11405. {
  11406. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
  11407. errn = -1;
  11408. }
  11409. //STEP 5: ============ Update Flags ===========
  11410. return errn;
  11411. }
  11412. /*===========================================================================
  11413. FUNCTION: Proc_din_WeldingDetectionReq
  11414. DESCRIPTION:
  11415. PRE-CONDITION:
  11416. INPUT:
  11417. OUTPUT:
  11418. GLOBAL VARIABLES:
  11419. =============================================================================*/
  11420. int Proc_din_WeldingDetectionReq(int AcceptFd)
  11421. {
  11422. int errn = 0;
  11423. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
  11424. //Print the decoded XML Document
  11425. PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
  11426. //Save into Share Memory
  11427. SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  11428. //Check for EV Error Code
  11429. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  11430. errn = Proc_din_WeldingDetectionRes(AcceptFd);
  11431. if (errn == 0)
  11432. {
  11433. //send response successfully.
  11434. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]WeldingDetectionRes");
  11435. }
  11436. else
  11437. {
  11438. sprintf(buf_log_evcomm,
  11439. "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
  11440. errn);
  11441. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11442. }
  11443. return errn;
  11444. }
  11445. /*===========================================================================
  11446. FUNCTION: Proc_iso1_WeldingDetectionReq
  11447. DESCRIPTION:
  11448. PRE-CONDITION:
  11449. INPUT:
  11450. OUTPUT:
  11451. GLOBAL VARIABLES:
  11452. =============================================================================*/
  11453. int Proc_iso1_WeldingDetectionReq(int AcceptFd)
  11454. {
  11455. int errn = 0;
  11456. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
  11457. //Print the decoded XML Document
  11458. PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
  11459. //Save into Share Memory
  11460. SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11461. //Check for EV Error Code
  11462. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  11463. errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
  11464. if (errn == 0)
  11465. {
  11466. //send response successfully.
  11467. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]WeldingDetectionRes");
  11468. }
  11469. else
  11470. {
  11471. sprintf(buf_log_evcomm,
  11472. "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
  11473. errn);
  11474. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11475. }
  11476. return errn;
  11477. }
  11478. /*===========================================================================
  11479. FUNCTION: SHM_Init_din_SessionStopRes
  11480. DESCRIPTION:
  11481. PRE-CONDITION:
  11482. INPUT:
  11483. 1. shm_ccs
  11484. OUTPUT:
  11485. 1. shm_ccs
  11486. GLOBAL VARIABLES:
  11487. =============================================================================*/
  11488. void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
  11489. {
  11490. struct SessionStopResponse_DIN70121 *in;
  11491. in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
  11492. //----- [BODY (1/3)] ResponseCode -----
  11493. in->ResponseCode = dinresponseCodeType_OK;
  11494. }
  11495. /*===========================================================================
  11496. FUNCTION: Sudo_Parameter_din_SessionStopRes
  11497. DESCRIPTION:
  11498. PRE-CONDITION:
  11499. INPUT:
  11500. OUTPUT:
  11501. GLOBAL VARIABLES:
  11502. =============================================================================*/
  11503. void Sudo_Parameter_din_SessionStopRes()
  11504. {
  11505. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  11506. init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
  11507. ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  11508. //----- [BODY (1/3)] ResponseCode -----
  11509. struct dinSessionStopResType *res;
  11510. res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
  11511. res->ResponseCode = dinresponseCodeType_OK;
  11512. }
  11513. /*===========================================================================
  11514. FUNCTION: Sudo_Parameter_iso1_SessionStopRes
  11515. DESCRIPTION:
  11516. PRE-CONDITION:
  11517. INPUT:
  11518. OUTPUT:
  11519. GLOBAL VARIABLES:
  11520. =============================================================================*/
  11521. void Sudo_Parameter_iso1_SessionStopRes()
  11522. {
  11523. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  11524. init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
  11525. ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  11526. //----- [BODY (1/3)] ResponseCode -----
  11527. struct iso1SessionStopResType *res;
  11528. res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
  11529. res->ResponseCode = iso1responseCodeType_OK;
  11530. }
  11531. /*===========================================================================
  11532. FUNCTION: Proc_din_SessionStopRes
  11533. DESCRIPTION:
  11534. PRE-CONDITION:
  11535. INPUT:
  11536. OUTPUT:
  11537. GLOBAL VARIABLES:
  11538. =============================================================================*/
  11539. int Proc_din_SessionStopRes(int AcceptFd)
  11540. {
  11541. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11542. //if it is not the same, the packet should be ignored.
  11543. //STEP 1: ============ Initialize ============
  11544. int i = 0;
  11545. int errn = 0;
  11546. bitstream_t v2g_tx_stream;
  11547. struct SessionStopResponse_DIN70121 *stp;
  11548. struct ChargingInfoData *sys;
  11549. size_t pos = 0;
  11550. v2g_tx_stream.pos = &pos;
  11551. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11552. v2g_tx_stream.data = V2GTP_Tx_buf;
  11553. stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
  11554. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11555. stp->ResponseCode = OK_DIN70121;
  11556. //[HEADER] Check Req SessionID
  11557. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  11558. {
  11559. stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  11560. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11561. errn = -1;
  11562. }
  11563. //Check for SequenceError
  11564. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11565. {
  11566. stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  11567. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11568. errn = -1;
  11569. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11570. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11571. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11572. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11573. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11574. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11575. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11576. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11577. }
  11578. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11579. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11580. #if PARAMETER_NORMAL_MODE == ENABLE
  11581. SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
  11582. #else
  11583. Sudo_Parameter_din_SessionStopRes();
  11584. #endif
  11585. //STEP 4: ============ Encode and Send Response Message ===========
  11586. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  11587. {
  11588. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
  11589. errn = -1;
  11590. }
  11591. else
  11592. {
  11593. //send response successfully.
  11594. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
  11595. }
  11596. //STEP 5: ============ Update Flags ===========
  11597. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  11598. //Once this is set, the CSU should
  11599. // =========== Annouce to CSU [To-Be Implemented]=============
  11600. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  11601. // =========== Re-initialized [To-Be Implemented]=============
  11602. //Keep 5% PWM for 2 seconds
  11603. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
  11604. sleep(1);
  11605. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
  11606. sleep(1);
  11607. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
  11608. OutputCpPwmDuty(100);
  11609. //[To-Do] Reset All Share memory
  11610. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  11611. //system("reboot -f");
  11612. //sleep(5);
  11613. //system("reboot -f");
  11614. return errn;
  11615. }
  11616. /*===========================================================================
  11617. FUNCTION: Proc_iso1_SessionStopRes
  11618. DESCRIPTION:
  11619. PRE-CONDITION:
  11620. INPUT:
  11621. OUTPUT:
  11622. GLOBAL VARIABLES:
  11623. =============================================================================*/
  11624. int Proc_iso1_SessionStopRes(int AcceptFd)
  11625. {
  11626. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11627. //if it is not the same, the packet should be ignored.
  11628. //STEP 1: ============ Initialize ============
  11629. int i = 0;
  11630. int errn = 0;
  11631. bitstream_t v2g_tx_stream;
  11632. struct SessionStopResponse_ISO15118_2014 *stp;
  11633. struct ChargingInfoData *sys;
  11634. size_t pos = 0;
  11635. v2g_tx_stream.pos = &pos;
  11636. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11637. v2g_tx_stream.data = V2GTP_Tx_buf;
  11638. stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
  11639. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11640. stp->ResponseCode = OK_ISO15118_2014;
  11641. //[HEADER] Check Req SessionID
  11642. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  11643. {
  11644. stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  11645. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11646. errn = -1;
  11647. }
  11648. //Check for SequenceError
  11649. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11650. {
  11651. stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  11652. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11653. errn = -1;
  11654. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11655. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11656. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11657. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11658. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11659. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11660. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11661. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11662. }
  11663. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11664. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11665. #if PARAMETER_NORMAL_MODE == ENABLE
  11666. SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
  11667. #else
  11668. Sudo_Parameter_iso1_SessionStopRes();
  11669. #endif
  11670. //STEP 4: ============ Encode and Send Response Message ===========
  11671. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  11672. {
  11673. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
  11674. errn = -1;
  11675. }
  11676. else
  11677. {
  11678. //send response successfully.
  11679. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
  11680. }
  11681. //STEP 5: ============ Update Flags ===========
  11682. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  11683. //Once this is set, the CSU should
  11684. // =========== Annouce to CSU [To-Be Implemented]=============
  11685. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  11686. // =========== Re-initialized [To-Be Implemented]=============
  11687. //Keep 5% PWM for 2 seconds
  11688. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
  11689. sleep(1);
  11690. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
  11691. sleep(1);
  11692. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
  11693. OutputCpPwmDuty(100);
  11694. //[To-Do] Reset All Share memory
  11695. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  11696. //system("reboot -f");
  11697. //sleep(5);
  11698. //system("reboot -f");
  11699. return errn;
  11700. }
  11701. /*===========================================================================
  11702. FUNCTION: Proc_din_SessionStopReq
  11703. DESCRIPTION:
  11704. PRE-CONDITION:
  11705. INPUT:
  11706. OUTPUT:
  11707. GLOBAL VARIABLES:
  11708. =============================================================================*/
  11709. int Proc_din_SessionStopReq(int AcceptFd)
  11710. {
  11711. int errn = 0;
  11712. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
  11713. //Print the decoded XML Document
  11714. PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
  11715. //Save into Share Memory
  11716. SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  11717. errn = Proc_din_SessionStopRes(AcceptFd);
  11718. if (errn == 0)
  11719. {
  11720. //send response successfully.
  11721. }
  11722. else
  11723. {
  11724. sprintf(buf_log_evcomm,
  11725. "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  11726. errn);
  11727. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11728. }
  11729. return errn;
  11730. }
  11731. /*===========================================================================
  11732. FUNCTION: Proc_iso1_SessionStopReq
  11733. DESCRIPTION:
  11734. PRE-CONDITION:
  11735. INPUT:
  11736. OUTPUT:
  11737. GLOBAL VARIABLES:
  11738. =============================================================================*/
  11739. int Proc_iso1_SessionStopReq(int AcceptFd)
  11740. {
  11741. int errn = 0;
  11742. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
  11743. //Print the decoded XML Document
  11744. PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
  11745. //Save into Share Memory
  11746. SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11747. errn = Proc_iso1_SessionStopRes(AcceptFd);
  11748. if (errn == 0)
  11749. {
  11750. //send response successfully.
  11751. }
  11752. else
  11753. {
  11754. sprintf(buf_log_evcomm,
  11755. "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  11756. errn);
  11757. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11758. }
  11759. return errn;
  11760. }
  11761. /*===========================================================================
  11762. FUNCTION: V2gMsg_Process_din
  11763. DESCRIPTION:
  11764. PRE-CONDITION:
  11765. INPUT:
  11766. 1. V2gFlowStatus
  11767. OUTPUT:
  11768. GLOBAL VARIABLES:
  11769. 1. V2gFlowStatus
  11770. =============================================================================*/
  11771. int V2gMsg_Process_din(int AcceptFd)
  11772. {
  11773. unsigned char req_is_responsed = FALSE;
  11774. while (req_is_responsed == FALSE)
  11775. {
  11776. //Check if it is in End_Process
  11777. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  11778. {
  11779. break;
  11780. }
  11781. switch(V2gFlowStatus)
  11782. {
  11783. //-------------------------------------------
  11784. case SupportedAppProtocolRequest:
  11785. {
  11786. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  11787. {
  11788. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  11789. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  11790. {
  11791. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11792. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  11793. }
  11794. else
  11795. {
  11796. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  11797. Update_V2G_Flow_Status(Other_Fault);
  11798. }
  11799. }
  11800. req_is_responsed = TRUE;
  11801. break;
  11802. }
  11803. case SupportedAppProtocolResponse:
  11804. {
  11805. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  11806. {
  11807. Update_V2G_Flow_Status(SessionSetupRequest);
  11808. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11809. }
  11810. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11811. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11812. {
  11813. sprintf(buf_log_evcomm,
  11814. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11815. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11816. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11817. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11818. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11819. }
  11820. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11821. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11822. {
  11823. sprintf(buf_log_evcomm,
  11824. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11825. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11826. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11827. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11828. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11829. {
  11830. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11831. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11832. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11833. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11834. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11835. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11836. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11837. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11838. }
  11839. }
  11840. else
  11841. {
  11842. break;
  11843. }
  11844. break;
  11845. }
  11846. //-------------------------------------------
  11847. case SessionSetupRequest: //19
  11848. {
  11849. if (Proc_din_SessionSetupReq(AcceptFd) == 0)
  11850. {
  11851. Update_V2G_Flow_Status(SessionSetupResponse);
  11852. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11853. }
  11854. else
  11855. {
  11856. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  11857. Update_V2G_Flow_Status(Other_Fault);
  11858. }
  11859. req_is_responsed = TRUE;
  11860. break;
  11861. }
  11862. case SessionSetupResponse: //20
  11863. {
  11864. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  11865. {
  11866. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  11867. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11868. }
  11869. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11870. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11871. {
  11872. sprintf(buf_log_evcomm,
  11873. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11874. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11875. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11876. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11877. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11878. }
  11879. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11880. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11881. {
  11882. sprintf(buf_log_evcomm,
  11883. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11884. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11885. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11886. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11887. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11888. {
  11889. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11890. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11891. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11892. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11893. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11894. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11895. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11896. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11897. }
  11898. }
  11899. else
  11900. {
  11901. break;
  11902. }
  11903. break;
  11904. }
  11905. //-------------------------------------------
  11906. case ServiceDiscoveryRequest: //21
  11907. {
  11908. if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
  11909. {
  11910. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  11911. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11912. }
  11913. else
  11914. {
  11915. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  11916. Update_V2G_Flow_Status(Other_Fault);
  11917. }
  11918. req_is_responsed = TRUE;
  11919. break;
  11920. }
  11921. case ServiceDiscoveryResponse: //22
  11922. {
  11923. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  11924. {
  11925. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11926. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11927. }
  11928. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11929. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11930. {
  11931. sprintf(buf_log_evcomm,
  11932. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11933. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11934. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11935. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11936. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11937. }
  11938. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11939. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11940. {
  11941. sprintf(buf_log_evcomm,
  11942. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11943. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11944. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11945. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11946. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11947. {
  11948. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11949. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11950. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11951. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11952. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11953. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11954. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11955. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11956. }
  11957. }
  11958. else
  11959. {
  11960. break;
  11961. }
  11962. break;
  11963. }
  11964. //-------------------------------------------
  11965. case ServiceAndPaymentSelectionRequest: //25
  11966. {
  11967. if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11968. {
  11969. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11970. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11971. }
  11972. else
  11973. {
  11974. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  11975. Update_V2G_Flow_Status(Other_Fault);
  11976. }
  11977. req_is_responsed = TRUE;
  11978. break;
  11979. }
  11980. case ServiceAndPaymentSelectionResponse: //26
  11981. {
  11982. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11983. {
  11984. Update_V2G_Flow_Status(AuthorizationRequest);
  11985. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11986. }
  11987. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11988. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11989. {
  11990. sprintf(buf_log_evcomm,
  11991. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11992. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11993. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11994. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11995. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11996. }
  11997. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11998. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11999. {
  12000. sprintf(buf_log_evcomm,
  12001. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12002. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12003. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12004. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12005. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12006. {
  12007. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12008. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12009. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12010. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12011. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12012. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12013. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12014. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12015. }
  12016. }
  12017. else
  12018. {
  12019. break;
  12020. }
  12021. break;
  12022. }
  12023. //-------------------------------------------
  12024. //case ContractAuthenticationReq:
  12025. case AuthorizationRequest: //29
  12026. {
  12027. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  12028. {
  12029. Update_V2G_Flow_Status(AuthorizationResponse);
  12030. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12031. }
  12032. else
  12033. {
  12034. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  12035. Update_V2G_Flow_Status(Other_Fault);
  12036. }
  12037. req_is_responsed = TRUE;
  12038. break;
  12039. }
  12040. case AuthorizationResponse: //30
  12041. {
  12042. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12043. {
  12044. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12045. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  12046. {
  12047. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12048. }
  12049. else
  12050. {
  12051. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  12052. Update_V2G_Flow_Status(Other_Fault);
  12053. }
  12054. req_is_responsed = TRUE;
  12055. break;
  12056. }
  12057. //Check for ChargeParameterDiscoveryReq
  12058. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12059. {
  12060. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12061. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  12062. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  12063. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12064. ftime(&SeqStartTime);
  12065. #endif
  12066. }
  12067. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12068. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12069. {
  12070. sprintf(buf_log_evcomm,
  12071. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12072. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12073. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12074. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12075. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12076. }
  12077. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12078. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12079. {
  12080. sprintf(buf_log_evcomm,
  12081. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12082. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12083. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12084. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12085. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12086. {
  12087. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12088. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12089. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12090. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12091. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12092. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12093. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12094. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12095. }
  12096. }
  12097. else
  12098. {
  12099. break;
  12100. }
  12101. break;
  12102. }
  12103. //-------------------------------------------
  12104. case ChargeParameterDiscoveryRequest: //35
  12105. {
  12106. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12107. {
  12108. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  12109. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12110. }
  12111. else
  12112. {
  12113. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  12114. Update_V2G_Flow_Status(Other_Fault);
  12115. }
  12116. req_is_responsed = TRUE;
  12117. break;
  12118. }
  12119. case ChargeParameterDiscoveryResponse:
  12120. {
  12121. //STEP 1: Check for Process Timeout
  12122. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12123. ftime(&SeqEndTime);
  12124. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  12125. {
  12126. sprintf(buf_log_evcomm,
  12127. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  12128. DiffTimeb(SeqStartTime, SeqEndTime),
  12129. V2G_SECC_ChargingParameter_Performance_Time);
  12130. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12131. Update_V2G_Flow_Status(Sequence_Timeout);
  12132. break;
  12133. }
  12134. #endif
  12135. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12136. {
  12137. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12138. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12139. {
  12140. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12141. }
  12142. else
  12143. {
  12144. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  12145. Update_V2G_Flow_Status(Other_Fault);
  12146. }
  12147. req_is_responsed = TRUE;
  12148. break;
  12149. }
  12150. //STEP 2: Check for CableCheckReq message
  12151. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12152. {
  12153. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12154. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  12155. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  12156. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12157. Update_V2G_Flow_Status(CableCheckRequest);
  12158. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12159. ftime(&SeqStartTime);
  12160. #endif
  12161. }
  12162. //STEP 3: Wait for PowerDeliveryReq Message
  12163. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12164. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12165. {
  12166. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12167. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12168. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12169. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12170. ftime(&SeqStartTime);
  12171. #endif
  12172. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12173. {
  12174. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12175. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12176. }
  12177. else
  12178. {
  12179. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12180. Update_V2G_Flow_Status(Other_Fault);
  12181. }
  12182. break;
  12183. }
  12184. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12185. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12186. {
  12187. sprintf(buf_log_evcomm,
  12188. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12189. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12190. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12191. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12192. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12193. }
  12194. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12195. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12196. {
  12197. sprintf(buf_log_evcomm,
  12198. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12199. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12200. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12201. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12202. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12203. {
  12204. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12205. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12206. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12207. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12208. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12209. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12210. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12211. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12212. }
  12213. }
  12214. else
  12215. {
  12216. break;
  12217. }
  12218. break;
  12219. }
  12220. //-------------------------------------------
  12221. case CableCheckRequest: //37
  12222. {
  12223. //STEP 3: Execute Cable Check Process
  12224. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  12225. {
  12226. Update_V2G_Flow_Status(CableCheckResponse);
  12227. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12228. }
  12229. else
  12230. {
  12231. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  12232. Update_V2G_Flow_Status(Other_Fault);
  12233. }
  12234. req_is_responsed = TRUE;
  12235. break;
  12236. }
  12237. case CableCheckResponse: //38
  12238. {
  12239. //STEP 1: Check for Process Timeout
  12240. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12241. ftime(&SeqEndTime);
  12242. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  12243. {
  12244. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  12245. sprintf(buf_log_evcomm,
  12246. "CableCheck Timeout - (%.02lf of %d ms)\n",
  12247. DiffTimeb(SeqStartTime, SeqEndTime),
  12248. V2G_SECC_CableCheck_Performance_Time);
  12249. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12250. Update_V2G_Flow_Status(Sequence_Timeout);
  12251. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12252. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  12253. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12254. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12255. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12256. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12257. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  12258. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  12259. break;
  12260. }
  12261. #endif
  12262. //STEP 2: Check for CableCheckReq message
  12263. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12264. {
  12265. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12266. //STEP 3: Execute Cable Check Process
  12267. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  12268. {
  12269. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12270. }
  12271. else
  12272. {
  12273. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  12274. Update_V2G_Flow_Status(Other_Fault);
  12275. }
  12276. req_is_responsed = TRUE;
  12277. break;
  12278. }
  12279. //STEP 3: Check for PreChargeReq message
  12280. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12281. {
  12282. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12283. Update_V2G_Flow_Status(PreChargeRequest);
  12284. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  12285. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12286. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  12287. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12288. ftime(&SeqStartTime);
  12289. #endif
  12290. }
  12291. //STEP 3: Wait for PowerDeliveryReq Message
  12292. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12293. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12294. {
  12295. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12296. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12297. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12298. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12299. ftime(&SeqStartTime);
  12300. #endif
  12301. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12302. {
  12303. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12304. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12305. }
  12306. else
  12307. {
  12308. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12309. Update_V2G_Flow_Status(Other_Fault);
  12310. }
  12311. break;
  12312. }
  12313. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12314. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12315. {
  12316. sprintf(buf_log_evcomm,
  12317. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12318. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12319. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12320. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12321. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12322. }
  12323. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12324. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12325. {
  12326. sprintf(buf_log_evcomm,
  12327. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12328. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12329. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12330. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12331. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12332. {
  12333. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12334. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12335. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12336. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12337. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12338. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12339. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12340. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12341. }
  12342. }
  12343. else
  12344. {
  12345. break;
  12346. }
  12347. break;
  12348. }
  12349. //-------------------------------------------
  12350. case PreChargeRequest: //39
  12351. {
  12352. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  12353. {
  12354. Update_V2G_Flow_Status(PreChargeResponse);
  12355. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12356. }
  12357. else
  12358. {
  12359. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  12360. Update_V2G_Flow_Status(Other_Fault);
  12361. }
  12362. req_is_responsed = TRUE;
  12363. break;
  12364. }
  12365. case PreChargeResponse: //40
  12366. {
  12367. //STEP 1: Check for Process Timeout
  12368. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12369. ftime(&SeqEndTime);
  12370. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  12371. {
  12372. sprintf(buf_log_evcomm,
  12373. "Precharge Timeout - (%.02lf of %d ms)\n",
  12374. DiffTimeb(SeqStartTime, SeqEndTime),
  12375. V2G_SECC_PreCharge_Performance_Time);
  12376. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12377. Update_V2G_Flow_Status(Sequence_Timeout);
  12378. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12379. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  12380. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12381. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12382. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12383. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12384. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  12385. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  12386. break;
  12387. }
  12388. #endif
  12389. //STEP 2: Check for PreChargeReq message
  12390. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12391. {
  12392. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12393. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  12394. {
  12395. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12396. }
  12397. else
  12398. {
  12399. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  12400. Update_V2G_Flow_Status(Other_Fault);
  12401. }
  12402. req_is_responsed = TRUE;
  12403. break;
  12404. }
  12405. //STEP 3: Check for PowerDeliveryReq message
  12406. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12407. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12408. {
  12409. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12410. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12411. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  12412. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12413. ftime(&SeqStartTime);
  12414. #endif
  12415. }
  12416. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12417. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12418. {
  12419. sprintf(buf_log_evcomm,
  12420. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12421. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12422. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12423. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12424. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12425. }
  12426. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12427. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12428. {
  12429. sprintf(buf_log_evcomm,
  12430. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12431. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12432. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12433. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12434. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12435. {
  12436. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12437. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12438. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12439. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12440. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12441. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12442. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12443. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12444. }
  12445. }
  12446. else
  12447. {
  12448. break;
  12449. }
  12450. break;
  12451. }
  12452. //-------------------------------------------
  12453. case PowerDeliveryRequestStart: //41
  12454. {
  12455. if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
  12456. {
  12457. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12458. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12459. }
  12460. else
  12461. {
  12462. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  12463. Update_V2G_Flow_Status(Other_Fault);
  12464. }
  12465. req_is_responsed = TRUE;
  12466. break;
  12467. }
  12468. case PowerDeliveryResponsetStart: //42
  12469. {
  12470. //STEP 1: Check for Process Timeout
  12471. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12472. if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12473. {
  12474. ftime(&SeqEndTime);
  12475. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12476. {
  12477. sprintf(buf_log_evcomm,
  12478. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  12479. DiffTimeb(SeqStartTime, SeqEndTime),
  12480. 2000);
  12481. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12482. Update_V2G_Flow_Status(Sequence_Timeout);
  12483. }
  12484. break;
  12485. }
  12486. #endif
  12487. //STEP 2: Wait for CurrentDemandReq Message
  12488. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12489. {
  12490. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12491. Update_V2G_Flow_Status(CurrentDemandRequest);
  12492. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  12493. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  12494. }
  12495. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12496. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12497. {
  12498. sprintf(buf_log_evcomm,
  12499. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12500. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12501. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12502. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12503. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12504. }
  12505. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12506. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12507. {
  12508. sprintf(buf_log_evcomm,
  12509. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12510. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12511. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12512. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12513. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12514. {
  12515. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12516. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12517. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12518. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12519. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12520. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12521. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12522. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12523. }
  12524. }
  12525. else
  12526. {
  12527. break;
  12528. }
  12529. break;
  12530. }
  12531. //-------------------------------------------
  12532. case CurrentDemandRequest: //45,
  12533. {
  12534. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  12535. {
  12536. Update_V2G_Flow_Status(CurrentDemandResponse);
  12537. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12538. }
  12539. else
  12540. {
  12541. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  12542. Update_V2G_Flow_Status(Other_Fault);
  12543. }
  12544. req_is_responsed = TRUE;
  12545. break;
  12546. }
  12547. case CurrentDemandResponse: //46,
  12548. {
  12549. //STEP 1: Wait for CurrentDemandReq Message
  12550. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12551. {
  12552. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12553. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  12554. {
  12555. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12556. }
  12557. else
  12558. {
  12559. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  12560. Update_V2G_Flow_Status(Other_Fault);
  12561. }
  12562. req_is_responsed = TRUE;
  12563. break;
  12564. }
  12565. //STEP 2: Wait for PowerDeliveryReq Message
  12566. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12567. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12568. {
  12569. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12570. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12571. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  12572. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12573. {
  12574. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12575. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12576. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12577. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12578. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12579. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12580. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12581. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12582. }
  12583. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12584. ftime(&SeqStartTime);
  12585. #endif
  12586. }
  12587. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12588. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12589. {
  12590. sprintf(buf_log_evcomm,
  12591. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12592. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12593. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12594. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12595. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12596. }
  12597. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12598. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12599. {
  12600. sprintf(buf_log_evcomm,
  12601. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12602. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12603. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12604. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12605. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12606. {
  12607. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12608. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12609. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12610. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12611. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12612. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12613. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12614. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12615. }
  12616. }
  12617. else
  12618. {
  12619. break;
  12620. }
  12621. break;
  12622. }
  12623. //-------------------------------------------
  12624. case PowerDeliveryRequestStop: //49,
  12625. {
  12626. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12627. {
  12628. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12629. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12630. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12631. ftime(&SeqStartTime);
  12632. #endif
  12633. }
  12634. else
  12635. {
  12636. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12637. Update_V2G_Flow_Status(Other_Fault);
  12638. }
  12639. req_is_responsed = TRUE;
  12640. break;
  12641. }
  12642. case PowerDeliveryResponseStop: //50,
  12643. {
  12644. //STEP 1: Check for Process Timeout
  12645. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12646. ftime(&SeqEndTime);
  12647. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12648. {
  12649. sprintf(buf_log_evcomm,
  12650. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12651. DiffTimeb(SeqStartTime, SeqEndTime),
  12652. 2000);
  12653. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12654. Update_V2G_Flow_Status(Sequence_Timeout);
  12655. break;
  12656. }
  12657. #endif
  12658. //STEP 2: Check for WeldingDetectionReq Message
  12659. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12660. {
  12661. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12662. Update_V2G_Flow_Status(WeldingDetectionRequest);
  12663. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  12664. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  12665. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12666. ftime(&SeqStartTime);
  12667. #endif
  12668. }
  12669. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12670. {
  12671. Update_V2G_Flow_Status(SessionStopRequest);
  12672. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12673. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  12674. {
  12675. Update_V2G_Flow_Status(SessionStopResponse);
  12676. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12677. }
  12678. else
  12679. {
  12680. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  12681. Update_V2G_Flow_Status(Other_Fault);
  12682. }
  12683. break;
  12684. }
  12685. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12686. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12687. {
  12688. sprintf(buf_log_evcomm,
  12689. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12690. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12691. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12692. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12693. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12694. }
  12695. else
  12696. {
  12697. break;
  12698. }
  12699. break;
  12700. }
  12701. //-------------------------------------------
  12702. case WeldingDetectionRequest: //51,
  12703. {
  12704. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  12705. {
  12706. Update_V2G_Flow_Status(WeldingDetectionResponse);
  12707. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12708. }
  12709. else
  12710. {
  12711. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  12712. Update_V2G_Flow_Status(Other_Fault);
  12713. }
  12714. req_is_responsed = TRUE;
  12715. break;
  12716. }
  12717. case WeldingDetectionResponse: //52,
  12718. {
  12719. //STEP 1: Check for Process Timeout
  12720. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12721. ftime(&SeqEndTime);
  12722. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  12723. {
  12724. sprintf(buf_log_evcomm,
  12725. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12726. DiffTimeb(SeqStartTime, SeqEndTime),
  12727. V2G_SECC_WeldingDetection_Performance_Time);
  12728. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12729. Update_V2G_Flow_Status(Sequence_Timeout);
  12730. break;
  12731. }
  12732. #endif
  12733. //STEP 2: Check for WeldingDetectionReq Message
  12734. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12735. {
  12736. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12737. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  12738. {
  12739. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12740. }
  12741. else
  12742. {
  12743. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  12744. Update_V2G_Flow_Status(Other_Fault);
  12745. }
  12746. req_is_responsed = TRUE;
  12747. break;
  12748. }
  12749. //STEP 3: Check for SessionStopReq Message
  12750. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12751. {
  12752. Update_V2G_Flow_Status(SessionStopRequest);
  12753. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12754. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  12755. }
  12756. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12757. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12758. {
  12759. sprintf(buf_log_evcomm,
  12760. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12761. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12762. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12763. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12764. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12765. }
  12766. else
  12767. {
  12768. break;
  12769. }
  12770. break;
  12771. }
  12772. //-------------------------------------------
  12773. case SessionStopRequest: //53,
  12774. {
  12775. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  12776. {
  12777. Update_V2G_Flow_Status(SessionStopResponse);
  12778. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12779. }
  12780. else
  12781. {
  12782. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  12783. Update_V2G_Flow_Status(Other_Fault);
  12784. }
  12785. req_is_responsed = TRUE;
  12786. break;
  12787. }
  12788. case SessionStopResponse: //54,
  12789. {
  12790. break;
  12791. }
  12792. //-------------------------------------------
  12793. default:
  12794. {
  12795. break;
  12796. }
  12797. }
  12798. }
  12799. }
  12800. /*===========================================================================
  12801. FUNCTION: V2gMsg_Process_iso1_DC
  12802. DESCRIPTION:
  12803. PRE-CONDITION:
  12804. INPUT:
  12805. 1. V2gFlowStatus
  12806. OUTPUT:
  12807. GLOBAL VARIABLES:
  12808. 1. V2gFlowStatus
  12809. =============================================================================*/
  12810. int V2gMsg_Process_iso1_DC(int AcceptFd)
  12811. {
  12812. unsigned char req_is_responsed = FALSE;
  12813. while (req_is_responsed == FALSE)
  12814. {
  12815. //Check if it is in End_Process
  12816. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12817. {
  12818. break;
  12819. }
  12820. switch(V2gFlowStatus)
  12821. {
  12822. //-------------------------------------------
  12823. case SupportedAppProtocolRequest:
  12824. {
  12825. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12826. {
  12827. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12828. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12829. {
  12830. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12831. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12832. }
  12833. else
  12834. {
  12835. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  12836. Update_V2G_Flow_Status(Other_Fault);
  12837. }
  12838. }
  12839. req_is_responsed = TRUE;
  12840. break;
  12841. }
  12842. case SupportedAppProtocolResponse:
  12843. {
  12844. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12845. {
  12846. Update_V2G_Flow_Status(SessionSetupRequest);
  12847. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12848. }
  12849. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12850. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12851. {
  12852. sprintf(buf_log_evcomm,
  12853. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12854. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12855. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12856. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12857. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12858. }
  12859. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12860. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12861. {
  12862. sprintf(buf_log_evcomm,
  12863. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12864. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12865. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12866. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12867. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12868. {
  12869. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12870. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12871. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12872. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12873. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12874. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12875. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12876. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12877. }
  12878. }
  12879. else
  12880. {
  12881. break;
  12882. }
  12883. break;
  12884. }
  12885. //-------------------------------------------
  12886. case SessionSetupRequest: //19
  12887. {
  12888. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  12889. {
  12890. Update_V2G_Flow_Status(SessionSetupResponse);
  12891. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12892. }
  12893. else
  12894. {
  12895. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  12896. Update_V2G_Flow_Status(Other_Fault);
  12897. }
  12898. req_is_responsed = TRUE;
  12899. break;
  12900. }
  12901. case SessionSetupResponse: //20
  12902. {
  12903. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12904. {
  12905. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12906. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12907. }
  12908. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12909. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12910. {
  12911. sprintf(buf_log_evcomm,
  12912. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12913. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12914. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12915. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12916. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12917. }
  12918. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12919. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12920. {
  12921. sprintf(buf_log_evcomm,
  12922. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12923. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12924. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12925. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12926. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12927. {
  12928. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12929. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12930. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12931. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12932. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12933. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12934. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12935. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12936. }
  12937. }
  12938. else
  12939. {
  12940. break;
  12941. }
  12942. break;
  12943. }
  12944. //-------------------------------------------
  12945. case ServiceDiscoveryRequest: //21
  12946. {
  12947. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  12948. {
  12949. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12950. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12951. }
  12952. else
  12953. {
  12954. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  12955. Update_V2G_Flow_Status(Other_Fault);
  12956. }
  12957. req_is_responsed = TRUE;
  12958. break;
  12959. }
  12960. case ServiceDiscoveryResponse: //22
  12961. {
  12962. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12963. {
  12964. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12965. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12966. }
  12967. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12968. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12969. {
  12970. sprintf(buf_log_evcomm,
  12971. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12972. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12973. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12974. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12975. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12976. }
  12977. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12978. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12979. {
  12980. sprintf(buf_log_evcomm,
  12981. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12982. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12983. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12984. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12985. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12986. {
  12987. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12988. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12989. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12990. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12991. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12992. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12993. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12994. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12995. }
  12996. }
  12997. else
  12998. {
  12999. break;
  13000. }
  13001. break;
  13002. }
  13003. //-------------------------------------------
  13004. case ServiceAndPaymentSelectionRequest: //25
  13005. {
  13006. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  13007. {
  13008. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  13009. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13010. }
  13011. else
  13012. {
  13013. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  13014. Update_V2G_Flow_Status(Other_Fault);
  13015. }
  13016. req_is_responsed = TRUE;
  13017. break;
  13018. }
  13019. case ServiceAndPaymentSelectionResponse: //26
  13020. {
  13021. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13022. {
  13023. Update_V2G_Flow_Status(AuthorizationRequest);
  13024. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13025. }
  13026. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13027. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13028. {
  13029. sprintf(buf_log_evcomm,
  13030. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13031. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13032. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13033. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13034. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13035. }
  13036. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13037. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13038. {
  13039. sprintf(buf_log_evcomm,
  13040. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13041. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13042. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13043. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13044. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13045. {
  13046. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13047. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13048. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13049. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13050. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13051. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13052. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13053. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13054. }
  13055. }
  13056. else
  13057. {
  13058. break;
  13059. }
  13060. break;
  13061. }
  13062. //-------------------------------------------
  13063. //case ContractAuthenticationReq:
  13064. case AuthorizationRequest: //29
  13065. {
  13066. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  13067. {
  13068. Update_V2G_Flow_Status(AuthorizationResponse);
  13069. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13070. }
  13071. else
  13072. {
  13073. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  13074. Update_V2G_Flow_Status(Other_Fault);
  13075. }
  13076. req_is_responsed = TRUE;
  13077. break;
  13078. }
  13079. case AuthorizationResponse: //30
  13080. {
  13081. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13082. {
  13083. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13084. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  13085. {
  13086. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13087. }
  13088. else
  13089. {
  13090. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  13091. Update_V2G_Flow_Status(Other_Fault);
  13092. }
  13093. req_is_responsed = TRUE;
  13094. break;
  13095. }
  13096. //Check for ChargeParameterDiscoveryReq
  13097. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13098. {
  13099. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13100. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  13101. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  13102. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13103. ftime(&SeqStartTime);
  13104. #endif
  13105. }
  13106. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13107. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13108. {
  13109. sprintf(buf_log_evcomm,
  13110. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13111. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13112. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13113. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13114. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13115. }
  13116. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13117. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13118. {
  13119. sprintf(buf_log_evcomm,
  13120. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13121. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13122. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13123. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13124. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13125. {
  13126. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13127. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13128. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13129. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13130. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13131. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13132. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13133. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13134. }
  13135. }
  13136. else
  13137. {
  13138. break;
  13139. }
  13140. break;
  13141. }
  13142. //-------------------------------------------
  13143. case ChargeParameterDiscoveryRequest: //35
  13144. {
  13145. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13146. {
  13147. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  13148. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13149. }
  13150. else
  13151. {
  13152. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  13153. Update_V2G_Flow_Status(Other_Fault);
  13154. }
  13155. req_is_responsed = TRUE;
  13156. break;
  13157. }
  13158. case ChargeParameterDiscoveryResponse:
  13159. {
  13160. //STEP 1: Check for Process Timeout
  13161. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13162. ftime(&SeqEndTime);
  13163. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  13164. {
  13165. sprintf(buf_log_evcomm,
  13166. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  13167. DiffTimeb(SeqStartTime, SeqEndTime),
  13168. V2G_SECC_ChargingParameter_Performance_Time);
  13169. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13170. Update_V2G_Flow_Status(Sequence_Timeout);
  13171. break;
  13172. }
  13173. #endif
  13174. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13175. {
  13176. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13177. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13178. {
  13179. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13180. }
  13181. else
  13182. {
  13183. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  13184. Update_V2G_Flow_Status(Other_Fault);
  13185. }
  13186. req_is_responsed = TRUE;
  13187. break;
  13188. }
  13189. //STEP 2: Check for CableCheckReq message
  13190. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13191. {
  13192. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13193. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  13194. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  13195. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13196. Update_V2G_Flow_Status(CableCheckRequest);
  13197. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13198. ftime(&SeqStartTime);
  13199. #endif
  13200. }
  13201. //STEP 3: Wait for PowerDeliveryReq Message
  13202. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13203. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13204. {
  13205. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13206. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13207. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13208. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13209. ftime(&SeqStartTime);
  13210. #endif
  13211. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13212. {
  13213. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13214. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13215. }
  13216. else
  13217. {
  13218. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13219. Update_V2G_Flow_Status(Other_Fault);
  13220. }
  13221. break;
  13222. }
  13223. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13224. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13225. {
  13226. sprintf(buf_log_evcomm,
  13227. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13228. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13229. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13230. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13231. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13232. }
  13233. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13234. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13235. {
  13236. sprintf(buf_log_evcomm,
  13237. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13238. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13239. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13240. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13241. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13242. {
  13243. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13244. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13245. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13246. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13247. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13248. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13249. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13250. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13251. }
  13252. }
  13253. else
  13254. {
  13255. break;
  13256. }
  13257. break;
  13258. }
  13259. //-------------------------------------------
  13260. case CableCheckRequest: //37
  13261. {
  13262. //STEP 3: Execute Cable Check Process
  13263. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  13264. {
  13265. Update_V2G_Flow_Status(CableCheckResponse);
  13266. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13267. }
  13268. else
  13269. {
  13270. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  13271. Update_V2G_Flow_Status(Other_Fault);
  13272. }
  13273. req_is_responsed = TRUE;
  13274. break;
  13275. }
  13276. case CableCheckResponse: //38
  13277. {
  13278. //STEP 1: Check for Process Timeout
  13279. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13280. ftime(&SeqEndTime);
  13281. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  13282. {
  13283. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  13284. sprintf(buf_log_evcomm,
  13285. "CableCheck Timeout - (%.02lf of %d ms)\n",
  13286. DiffTimeb(SeqStartTime, SeqEndTime),
  13287. V2G_SECC_CableCheck_Performance_Time);
  13288. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13289. Update_V2G_Flow_Status(Sequence_Timeout);
  13290. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13291. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  13292. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13293. {
  13294. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13295. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13296. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13297. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13298. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13299. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13300. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13301. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13302. }
  13303. break;
  13304. }
  13305. #endif
  13306. //STEP 2: Check for CableCheckReq message
  13307. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13308. {
  13309. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13310. //STEP 3: Execute Cable Check Process
  13311. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  13312. {
  13313. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13314. }
  13315. else
  13316. {
  13317. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  13318. Update_V2G_Flow_Status(Other_Fault);
  13319. }
  13320. req_is_responsed = TRUE;
  13321. break;
  13322. }
  13323. //STEP 3: Check for PreChargeReq message
  13324. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13325. {
  13326. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13327. Update_V2G_Flow_Status(PreChargeRequest);
  13328. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  13329. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13330. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  13331. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13332. ftime(&SeqStartTime);
  13333. #endif
  13334. }
  13335. //STEP 3: Wait for PowerDeliveryReq Message
  13336. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13337. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13338. {
  13339. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13340. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13341. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13342. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13343. ftime(&SeqStartTime);
  13344. #endif
  13345. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13346. {
  13347. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13348. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13349. }
  13350. else
  13351. {
  13352. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13353. Update_V2G_Flow_Status(Other_Fault);
  13354. }
  13355. break;
  13356. }
  13357. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13358. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13359. {
  13360. sprintf(buf_log_evcomm,
  13361. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13362. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13363. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13364. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13365. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13366. }
  13367. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13368. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13369. {
  13370. sprintf(buf_log_evcomm,
  13371. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13372. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13373. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13374. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13375. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13376. {
  13377. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13378. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13379. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13380. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13381. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13382. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13383. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13384. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13385. }
  13386. }
  13387. else
  13388. {
  13389. break;
  13390. }
  13391. break;
  13392. }
  13393. //-------------------------------------------
  13394. case PreChargeRequest: //39
  13395. {
  13396. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  13397. {
  13398. Update_V2G_Flow_Status(PreChargeResponse);
  13399. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13400. }
  13401. else
  13402. {
  13403. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  13404. Update_V2G_Flow_Status(Other_Fault);
  13405. }
  13406. req_is_responsed = TRUE;
  13407. break;
  13408. }
  13409. case PreChargeResponse: //40
  13410. {
  13411. //STEP 1: Check for Process Timeout
  13412. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13413. ftime(&SeqEndTime);
  13414. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  13415. {
  13416. sprintf(buf_log_evcomm,
  13417. "Precharge Timeout - (%.02lf of %d ms)\n",
  13418. DiffTimeb(SeqStartTime, SeqEndTime),
  13419. V2G_SECC_PreCharge_Performance_Time);
  13420. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13421. Update_V2G_Flow_Status(Sequence_Timeout);
  13422. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13423. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  13424. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13425. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13426. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13427. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13428. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  13429. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  13430. break;
  13431. }
  13432. #endif
  13433. //STEP 2: Check for PreChargeReq message
  13434. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13435. {
  13436. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13437. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  13438. {
  13439. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13440. }
  13441. else
  13442. {
  13443. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  13444. Update_V2G_Flow_Status(Other_Fault);
  13445. }
  13446. req_is_responsed = TRUE;
  13447. break;
  13448. }
  13449. //STEP 3: Check for PowerDeliveryReq message
  13450. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13451. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13452. {
  13453. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13454. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  13455. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  13456. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13457. ftime(&SeqStartTime);
  13458. #endif
  13459. }
  13460. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13461. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13462. {
  13463. sprintf(buf_log_evcomm,
  13464. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13465. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13466. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13467. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13468. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13469. }
  13470. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13471. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13472. {
  13473. sprintf(buf_log_evcomm,
  13474. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13475. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13476. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13477. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13478. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13479. {
  13480. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13481. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13482. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13483. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13484. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13485. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13486. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13487. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13488. }
  13489. }
  13490. else
  13491. {
  13492. break;
  13493. }
  13494. break;
  13495. }
  13496. //-------------------------------------------
  13497. case PowerDeliveryRequestStart: //41
  13498. {
  13499. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  13500. {
  13501. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  13502. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13503. }
  13504. else
  13505. {
  13506. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  13507. Update_V2G_Flow_Status(Other_Fault);
  13508. }
  13509. req_is_responsed = TRUE;
  13510. break;
  13511. }
  13512. case PowerDeliveryResponsetStart: //42
  13513. {
  13514. //STEP 1: Check for Process Timeout
  13515. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13516. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  13517. {
  13518. ftime(&SeqEndTime);
  13519. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  13520. {
  13521. sprintf(buf_log_evcomm,
  13522. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  13523. DiffTimeb(SeqStartTime, SeqEndTime),
  13524. 2000);
  13525. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13526. Update_V2G_Flow_Status(Sequence_Timeout);
  13527. }
  13528. break;
  13529. }
  13530. #endif
  13531. //STEP 2: Wait for CurrentDemandReq Message
  13532. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13533. {
  13534. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13535. Update_V2G_Flow_Status(CurrentDemandRequest);
  13536. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  13537. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  13538. }
  13539. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13540. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13541. {
  13542. sprintf(buf_log_evcomm,
  13543. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13544. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13545. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13546. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13547. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13548. }
  13549. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13550. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13551. {
  13552. sprintf(buf_log_evcomm,
  13553. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13554. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13555. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13556. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13557. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13558. {
  13559. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13560. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13561. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13562. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13563. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13564. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13565. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13566. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13567. }
  13568. }
  13569. else
  13570. {
  13571. break;
  13572. }
  13573. break;
  13574. }
  13575. //-------------------------------------------
  13576. case CurrentDemandRequest: //45,
  13577. {
  13578. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  13579. {
  13580. Update_V2G_Flow_Status(CurrentDemandResponse);
  13581. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13582. }
  13583. else
  13584. {
  13585. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  13586. Update_V2G_Flow_Status(Other_Fault);
  13587. }
  13588. req_is_responsed = TRUE;
  13589. break;
  13590. }
  13591. case CurrentDemandResponse: //46,
  13592. {
  13593. //STEP 1: Wait for CurrentDemandReq Message
  13594. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13595. {
  13596. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13597. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  13598. {
  13599. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13600. }
  13601. else
  13602. {
  13603. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  13604. Update_V2G_Flow_Status(Other_Fault);
  13605. }
  13606. req_is_responsed = TRUE;
  13607. break;
  13608. }
  13609. //STEP 2: Wait for PowerDeliveryReq Message
  13610. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13611. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13612. {
  13613. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13614. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13615. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  13616. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13617. ftime(&SeqStartTime);
  13618. #endif
  13619. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13620. {
  13621. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13622. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13623. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13624. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13625. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13626. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13627. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13628. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13629. }
  13630. }
  13631. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13632. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13633. {
  13634. sprintf(buf_log_evcomm,
  13635. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13636. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13637. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13638. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13639. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13640. }
  13641. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13642. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13643. {
  13644. sprintf(buf_log_evcomm,
  13645. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13646. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13647. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13648. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13649. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13650. {
  13651. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13652. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13653. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13654. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13655. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13656. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13657. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13658. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13659. }
  13660. }
  13661. else
  13662. {
  13663. break;
  13664. }
  13665. break;
  13666. }
  13667. //-------------------------------------------
  13668. case PowerDeliveryRequestStop: //49,
  13669. {
  13670. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13671. {
  13672. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13673. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13674. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13675. ftime(&SeqStartTime);
  13676. #endif
  13677. }
  13678. else
  13679. {
  13680. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13681. Update_V2G_Flow_Status(Other_Fault);
  13682. }
  13683. req_is_responsed = TRUE;
  13684. break;
  13685. }
  13686. case PowerDeliveryResponseStop: //50,
  13687. {
  13688. //STEP 1: Check for Process Timeout
  13689. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13690. ftime(&SeqEndTime);
  13691. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  13692. {
  13693. sprintf(buf_log_evcomm,
  13694. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13695. DiffTimeb(SeqStartTime, SeqEndTime),
  13696. 2000);
  13697. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13698. Update_V2G_Flow_Status(Sequence_Timeout);
  13699. break;
  13700. }
  13701. #endif
  13702. //STEP 2: Check for WeldingDetectionReq Message
  13703. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13704. {
  13705. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13706. Update_V2G_Flow_Status(WeldingDetectionRequest);
  13707. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  13708. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  13709. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13710. ftime(&SeqStartTime);
  13711. #endif
  13712. }
  13713. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13714. {
  13715. Update_V2G_Flow_Status(SessionStopRequest);
  13716. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13717. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  13718. {
  13719. Update_V2G_Flow_Status(SessionStopResponse);
  13720. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13721. }
  13722. else
  13723. {
  13724. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  13725. Update_V2G_Flow_Status(Other_Fault);
  13726. }
  13727. break;
  13728. }
  13729. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13730. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13731. {
  13732. sprintf(buf_log_evcomm,
  13733. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13734. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13735. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  13736. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13737. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13738. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13739. }
  13740. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13741. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13742. {
  13743. sprintf(buf_log_evcomm,
  13744. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13745. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13746. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13747. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13748. }
  13749. else
  13750. {
  13751. break;
  13752. }
  13753. break;
  13754. }
  13755. //-------------------------------------------
  13756. case WeldingDetectionRequest: //51,
  13757. {
  13758. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13759. {
  13760. Update_V2G_Flow_Status(WeldingDetectionResponse);
  13761. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13762. }
  13763. else
  13764. {
  13765. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  13766. Update_V2G_Flow_Status(Other_Fault);
  13767. }
  13768. req_is_responsed = TRUE;
  13769. break;
  13770. }
  13771. case WeldingDetectionResponse: //52,
  13772. {
  13773. //STEP 1: Check for Process Timeout
  13774. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13775. ftime(&SeqEndTime);
  13776. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  13777. {
  13778. sprintf(buf_log_evcomm,
  13779. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13780. DiffTimeb(SeqStartTime, SeqEndTime),
  13781. V2G_SECC_WeldingDetection_Performance_Time);
  13782. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13783. Update_V2G_Flow_Status(Sequence_Timeout);
  13784. break;
  13785. }
  13786. #endif
  13787. //STEP 2: Check for WeldingDetectionReq Message
  13788. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13789. {
  13790. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13791. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13792. {
  13793. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13794. }
  13795. else
  13796. {
  13797. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  13798. Update_V2G_Flow_Status(Other_Fault);
  13799. }
  13800. req_is_responsed = TRUE;
  13801. break;
  13802. }
  13803. //STEP 3: Check for SessionStopReq Message
  13804. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13805. {
  13806. Update_V2G_Flow_Status(SessionStopRequest);
  13807. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13808. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  13809. }
  13810. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13811. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13812. {
  13813. sprintf(buf_log_evcomm,
  13814. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13815. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13816. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13817. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13818. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13819. }
  13820. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13821. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13822. {
  13823. sprintf(buf_log_evcomm,
  13824. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13825. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13826. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13827. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13828. }
  13829. else
  13830. {
  13831. break;
  13832. }
  13833. break;
  13834. }
  13835. //-------------------------------------------
  13836. case SessionStopRequest: //53,
  13837. {
  13838. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  13839. {
  13840. Update_V2G_Flow_Status(SessionStopResponse);
  13841. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13842. }
  13843. else
  13844. {
  13845. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  13846. Update_V2G_Flow_Status(Other_Fault);
  13847. }
  13848. req_is_responsed = TRUE;
  13849. break;
  13850. }
  13851. case SessionStopResponse: //54,
  13852. {
  13853. break;
  13854. }
  13855. //-------------------------------------------
  13856. default:
  13857. {
  13858. break;
  13859. }
  13860. }
  13861. }
  13862. }
  13863. /*===========================================================================
  13864. FUNCTION: V2gMsg_Process_iso1_AC
  13865. DESCRIPTION:
  13866. PRE-CONDITION:
  13867. INPUT:
  13868. 1. V2gFlowStatus
  13869. OUTPUT:
  13870. GLOBAL VARIABLES:
  13871. 1. V2gFlowStatus
  13872. =============================================================================*/
  13873. int V2gMsg_Process_iso1_AC(int AcceptFd)
  13874. {
  13875. unsigned char req_is_responsed = FALSE;
  13876. while (req_is_responsed == FALSE)
  13877. {
  13878. //Check if it is in End_Process
  13879. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  13880. {
  13881. break;
  13882. }
  13883. switch(V2gFlowStatus)
  13884. {
  13885. //-------------------------------------------
  13886. case SupportedAppProtocolRequest: //17
  13887. {
  13888. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  13889. {
  13890. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  13891. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  13892. {
  13893. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13894. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  13895. }
  13896. else
  13897. {
  13898. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  13899. Update_V2G_Flow_Status(Other_Fault);
  13900. }
  13901. }
  13902. req_is_responsed = TRUE;
  13903. break;
  13904. }
  13905. case SupportedAppProtocolResponse: //18
  13906. {
  13907. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  13908. {
  13909. Update_V2G_Flow_Status(SessionSetupRequest);
  13910. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13911. }
  13912. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13913. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13914. {
  13915. sprintf(buf_log_evcomm,
  13916. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13917. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13918. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13919. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13920. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13921. }
  13922. else
  13923. {
  13924. break;
  13925. }
  13926. break;
  13927. }
  13928. //-------------------------------------------
  13929. case SessionSetupRequest: //19
  13930. {
  13931. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  13932. {
  13933. Update_V2G_Flow_Status(SessionSetupResponse);
  13934. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13935. }
  13936. else
  13937. {
  13938. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  13939. Update_V2G_Flow_Status(Other_Fault);
  13940. }
  13941. req_is_responsed = TRUE;
  13942. break;
  13943. }
  13944. case SessionSetupResponse: //20
  13945. {
  13946. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  13947. {
  13948. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  13949. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13950. }
  13951. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13952. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13953. {
  13954. sprintf(buf_log_evcomm,
  13955. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13956. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13957. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13958. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13959. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13960. }
  13961. else
  13962. {
  13963. break;
  13964. }
  13965. break;
  13966. }
  13967. //-------------------------------------------
  13968. case ServiceDiscoveryRequest: //21
  13969. {
  13970. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  13971. {
  13972. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  13973. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13974. }
  13975. else
  13976. {
  13977. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  13978. Update_V2G_Flow_Status(Other_Fault);
  13979. }
  13980. req_is_responsed = TRUE;
  13981. break;
  13982. }
  13983. case ServiceDiscoveryResponse: //22
  13984. {
  13985. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  13986. {
  13987. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  13988. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13989. }
  13990. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13991. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13992. {
  13993. sprintf(buf_log_evcomm,
  13994. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13995. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13996. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13997. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13998. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13999. }
  14000. else
  14001. {
  14002. break;
  14003. }
  14004. break;
  14005. }
  14006. //-------------------------------------------
  14007. case ServiceAndPaymentSelectionRequest: //25
  14008. {
  14009. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  14010. {
  14011. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  14012. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14013. }
  14014. else
  14015. {
  14016. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  14017. Update_V2G_Flow_Status(Other_Fault);
  14018. }
  14019. req_is_responsed = TRUE;
  14020. break;
  14021. }
  14022. case ServiceAndPaymentSelectionResponse://26
  14023. {
  14024. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14025. {
  14026. Update_V2G_Flow_Status(AuthorizationRequest);
  14027. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14028. }
  14029. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14030. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14031. {
  14032. sprintf(buf_log_evcomm,
  14033. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14034. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14035. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14036. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14037. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14038. }
  14039. else
  14040. {
  14041. break;
  14042. }
  14043. break;
  14044. }
  14045. //-------------------------------------------
  14046. //case ContractAuthenticationReq:
  14047. case AuthorizationRequest: //29
  14048. {
  14049. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  14050. {
  14051. Update_V2G_Flow_Status(AuthorizationResponse);
  14052. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14053. }
  14054. else
  14055. {
  14056. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14057. Update_V2G_Flow_Status(Other_Fault);
  14058. }
  14059. req_is_responsed = TRUE;
  14060. break;
  14061. }
  14062. case AuthorizationResponse: //30
  14063. {
  14064. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14065. {
  14066. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14067. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  14068. {
  14069. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14070. }
  14071. else
  14072. {
  14073. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14074. Update_V2G_Flow_Status(Other_Fault);
  14075. }
  14076. req_is_responsed = TRUE;
  14077. break;
  14078. }
  14079. //Check for ChargeParameterDiscoveryReq
  14080. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14081. {
  14082. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14083. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  14084. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  14085. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14086. ftime(&SeqStartTime);
  14087. #endif
  14088. }
  14089. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14090. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14091. {
  14092. sprintf(buf_log_evcomm,
  14093. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14094. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14095. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14096. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14097. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14098. }
  14099. else
  14100. {
  14101. break;
  14102. }
  14103. break;
  14104. }
  14105. //-------------------------------------------
  14106. case ChargeParameterDiscoveryRequest: //35
  14107. {
  14108. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14109. {
  14110. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  14111. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14112. }
  14113. else
  14114. {
  14115. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14116. Update_V2G_Flow_Status(Other_Fault);
  14117. }
  14118. req_is_responsed = TRUE;
  14119. break;
  14120. }
  14121. case ChargeParameterDiscoveryResponse: //36
  14122. {
  14123. //STEP 1: Check for Process Timeout
  14124. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14125. ftime(&SeqEndTime);
  14126. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  14127. {
  14128. sprintf(buf_log_evcomm,
  14129. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  14130. DiffTimeb(SeqStartTime, SeqEndTime),
  14131. V2G_SECC_ChargingParameter_Performance_Time);
  14132. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14133. Update_V2G_Flow_Status(Sequence_Timeout);
  14134. break;
  14135. }
  14136. #endif
  14137. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14138. {
  14139. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14140. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14141. {
  14142. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14143. }
  14144. else
  14145. {
  14146. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14147. Update_V2G_Flow_Status(Other_Fault);
  14148. }
  14149. req_is_responsed = TRUE;
  14150. break;
  14151. }
  14152. //STEP 3: Wait for PowerDeliveryReq Message
  14153. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14154. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14155. {
  14156. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  14157. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14158. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14159. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14160. ftime(&SeqStartTime);
  14161. #endif
  14162. break;
  14163. }
  14164. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14165. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14166. {
  14167. sprintf(buf_log_evcomm,
  14168. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14169. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14170. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14171. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14172. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14173. }
  14174. else
  14175. {
  14176. break;
  14177. }
  14178. break;
  14179. }
  14180. //-------------------------------------------
  14181. case PowerDeliveryRequestStart: //41
  14182. {
  14183. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  14184. {
  14185. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  14186. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14187. }
  14188. else
  14189. {
  14190. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  14191. Update_V2G_Flow_Status(Other_Fault);
  14192. }
  14193. req_is_responsed = TRUE;
  14194. break;
  14195. }
  14196. case PowerDeliveryResponsetStart: //42
  14197. {
  14198. //STEP 1: Check for Process Timeout
  14199. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14200. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  14201. {
  14202. ftime(&SeqEndTime);
  14203. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  14204. {
  14205. sprintf(buf_log_evcomm,
  14206. "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
  14207. DiffTimeb(SeqStartTime, SeqEndTime),
  14208. 2000);
  14209. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14210. Update_V2G_Flow_Status(Sequence_Timeout);
  14211. }
  14212. break;
  14213. }
  14214. #endif
  14215. //STEP 2: Wait for ChargingStatusReq Message
  14216. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  14217. {
  14218. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14219. Update_V2G_Flow_Status(ChargingStatusRequest);
  14220. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargingStatusReq: energy transfering...");
  14221. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
  14222. }
  14223. else
  14224. {
  14225. break;
  14226. }
  14227. break;
  14228. }
  14229. //-------------------------------------------
  14230. case ChargingStatusRequest: //43
  14231. {
  14232. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  14233. {
  14234. Update_V2G_Flow_Status(ChargingStatusResponse);
  14235. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14236. }
  14237. else
  14238. {
  14239. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
  14240. Update_V2G_Flow_Status(Other_Fault);
  14241. }
  14242. req_is_responsed = TRUE;
  14243. break;
  14244. }
  14245. case ChargingStatusResponse: //44
  14246. {
  14247. //STEP 1: Wait for ChargingStatusReq Message
  14248. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  14249. {
  14250. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14251. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  14252. {
  14253. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14254. }
  14255. else
  14256. {
  14257. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
  14258. Update_V2G_Flow_Status(Other_Fault);
  14259. }
  14260. req_is_responsed = TRUE;
  14261. break;
  14262. }
  14263. //STEP 2: Wait for PowerDeliveryReq Message
  14264. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14265. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14266. {
  14267. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14268. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14269. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
  14270. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14271. ftime(&SeqStartTime);
  14272. #endif
  14273. }
  14274. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14275. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14276. {
  14277. sprintf(buf_log_evcomm,
  14278. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14279. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14280. // EVCOMM_SYS_INFO.SequenceError = TRUE;
  14281. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14282. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14283. break;
  14284. }
  14285. else
  14286. {
  14287. break;
  14288. }
  14289. break;
  14290. }
  14291. //-------------------------------------------
  14292. case PowerDeliveryRequestStop: //49
  14293. {
  14294. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  14295. {
  14296. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14297. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14298. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14299. ftime(&SeqStartTime);
  14300. #endif
  14301. }
  14302. else
  14303. {
  14304. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14305. Update_V2G_Flow_Status(Other_Fault);
  14306. }
  14307. req_is_responsed = TRUE;
  14308. break;
  14309. }
  14310. case PowerDeliveryResponseStop: //50
  14311. {
  14312. //STEP 1: Check for Process Timeout
  14313. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14314. ftime(&SeqEndTime);
  14315. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  14316. {
  14317. sprintf(buf_log_evcomm,
  14318. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  14319. DiffTimeb(SeqStartTime, SeqEndTime),
  14320. 2000);
  14321. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14322. Update_V2G_Flow_Status(Sequence_Timeout);
  14323. break;
  14324. }
  14325. #endif
  14326. //STEP 3: Check for SessionStopReq Message
  14327. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  14328. {
  14329. Update_V2G_Flow_Status(SessionStopRequest);
  14330. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14331. }
  14332. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14333. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14334. {
  14335. sprintf(buf_log_evcomm,
  14336. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14337. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14338. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  14339. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14340. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14341. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14342. }
  14343. else
  14344. {
  14345. break;
  14346. }
  14347. break;
  14348. }
  14349. //-------------------------------------------
  14350. case SessionStopRequest: //53
  14351. {
  14352. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  14353. {
  14354. Update_V2G_Flow_Status(SessionStopResponse);
  14355. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14356. }
  14357. else
  14358. {
  14359. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  14360. Update_V2G_Flow_Status(Other_Fault);
  14361. }
  14362. req_is_responsed = TRUE;
  14363. break;
  14364. }
  14365. case SessionStopResponse: //54
  14366. {
  14367. break;
  14368. }
  14369. //-------------------------------------------
  14370. default:
  14371. {
  14372. break;
  14373. }
  14374. }
  14375. }
  14376. }
  14377. /*===========================================================================
  14378. FUNCTION: V2gMsg_Process_iso1
  14379. DESCRIPTION:
  14380. 1. EnergyTransferMode:
  14381. AC_single_phase_core = 0,
  14382. AC_three_phase_core = 1,
  14383. DC_core = 2,
  14384. DC_extended = 3,
  14385. DC_combo_core = 4,
  14386. DC_unique = 5
  14387. iso1EnergyTransferModeType_AC_single_phase_core = 0,
  14388. iso1EnergyTransferModeType_AC_three_phase_core = 1,
  14389. iso1EnergyTransferModeType_DC_core = 2,
  14390. iso1EnergyTransferModeType_DC_extended = 3,
  14391. iso1EnergyTransferModeType_DC_combo_core = 4,
  14392. iso1EnergyTransferModeType_DC_unique = 5
  14393. PRE-CONDITION:
  14394. INPUT:
  14395. 1. V2gFlowStatus
  14396. OUTPUT:
  14397. GLOBAL VARIABLES:
  14398. 1. V2gFlowStatus
  14399. =============================================================================*/
  14400. int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
  14401. {
  14402. switch (EnergyTransferMode)
  14403. {
  14404. case DC_extended:
  14405. {
  14406. V2gMsg_Process_iso1_DC(AcceptFd);
  14407. break;
  14408. }
  14409. case AC_single_phase_core:
  14410. case AC_three_phase_core:
  14411. {
  14412. V2gMsg_Process_iso1_AC(AcceptFd);
  14413. break;
  14414. }
  14415. default:
  14416. {
  14417. sprintf(buf_log_evcomm,
  14418. "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
  14419. EnergyTransferMode);
  14420. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14421. break;
  14422. }
  14423. }
  14424. }
  14425. /*===========================================================================
  14426. FUNCTION: V2gMsg_Process_iso2_DC
  14427. DESCRIPTION:
  14428. PRE-CONDITION:
  14429. INPUT:
  14430. 1. V2gFlowStatus
  14431. OUTPUT:
  14432. GLOBAL VARIABLES:
  14433. 1. V2gFlowStatus
  14434. =============================================================================*/
  14435. int V2gMsg_Process_iso2_DC(int AcceptFd)
  14436. {
  14437. unsigned char req_is_responsed = FALSE;
  14438. while (req_is_responsed == FALSE)
  14439. {
  14440. //Check if it is in End_Process
  14441. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  14442. {
  14443. break;
  14444. }
  14445. switch(V2gFlowStatus)
  14446. {
  14447. //-------------------------------------------
  14448. case SupportedAppProtocolRequest:
  14449. {
  14450. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  14451. {
  14452. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  14453. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  14454. {
  14455. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14456. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  14457. }
  14458. else
  14459. {
  14460. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  14461. Update_V2G_Flow_Status(Other_Fault);
  14462. }
  14463. }
  14464. req_is_responsed = TRUE;
  14465. break;
  14466. }
  14467. case SupportedAppProtocolResponse:
  14468. {
  14469. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  14470. {
  14471. Update_V2G_Flow_Status(SessionSetupRequest);
  14472. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14473. }
  14474. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14475. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14476. {
  14477. sprintf(buf_log_evcomm,
  14478. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14479. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14480. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14481. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14482. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14483. }
  14484. else
  14485. {
  14486. break;
  14487. }
  14488. break;
  14489. }
  14490. //-------------------------------------------
  14491. case SessionSetupRequest: //19
  14492. {
  14493. if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
  14494. {
  14495. Update_V2G_Flow_Status(SessionSetupResponse);
  14496. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14497. }
  14498. else
  14499. {
  14500. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  14501. Update_V2G_Flow_Status(Other_Fault);
  14502. }
  14503. req_is_responsed = TRUE;
  14504. break;
  14505. }
  14506. case SessionSetupResponse: //20
  14507. {
  14508. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  14509. {
  14510. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  14511. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14512. }
  14513. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14514. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14515. {
  14516. sprintf(buf_log_evcomm,
  14517. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14518. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14519. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14520. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14521. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14522. }
  14523. else
  14524. {
  14525. break;
  14526. }
  14527. break;
  14528. }
  14529. #if 0
  14530. //-------------------------------------------
  14531. case ServiceDiscoveryRequest: //21
  14532. {
  14533. if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
  14534. {
  14535. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  14536. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14537. }
  14538. else
  14539. {
  14540. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  14541. Update_V2G_Flow_Status(Other_Fault);
  14542. }
  14543. req_is_responsed = TRUE;
  14544. break;
  14545. }
  14546. case ServiceDiscoveryResponse: //22
  14547. {
  14548. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  14549. {
  14550. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  14551. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14552. }
  14553. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14554. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14555. {
  14556. sprintf(buf_log_evcomm,
  14557. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14558. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14559. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14560. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14561. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14562. }
  14563. else
  14564. {
  14565. break;
  14566. }
  14567. break;
  14568. }
  14569. //-------------------------------------------
  14570. case ServiceAndPaymentSelectionRequest: //25
  14571. {
  14572. if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  14573. {
  14574. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  14575. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14576. }
  14577. else
  14578. {
  14579. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  14580. Update_V2G_Flow_Status(Other_Fault);
  14581. }
  14582. req_is_responsed = TRUE;
  14583. break;
  14584. }
  14585. case ServiceAndPaymentSelectionResponse: //26
  14586. {
  14587. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14588. {
  14589. Update_V2G_Flow_Status(AuthorizationRequest);
  14590. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14591. }
  14592. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14593. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14594. {
  14595. sprintf(buf_log_evcomm,
  14596. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14597. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14598. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14599. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14600. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14601. }
  14602. else
  14603. {
  14604. break;
  14605. }
  14606. break;
  14607. }
  14608. //-------------------------------------------
  14609. //case ContractAuthenticationReq:
  14610. case AuthorizationRequest: //29
  14611. {
  14612. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  14613. {
  14614. Update_V2G_Flow_Status(AuthorizationResponse);
  14615. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14616. }
  14617. else
  14618. {
  14619. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14620. Update_V2G_Flow_Status(Other_Fault);
  14621. }
  14622. req_is_responsed = TRUE;
  14623. break;
  14624. }
  14625. case AuthorizationResponse: //30
  14626. {
  14627. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14628. {
  14629. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14630. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  14631. {
  14632. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14633. }
  14634. else
  14635. {
  14636. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14637. Update_V2G_Flow_Status(Other_Fault);
  14638. }
  14639. req_is_responsed = TRUE;
  14640. break;
  14641. }
  14642. //Check for ChargeParameterDiscoveryReq
  14643. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14644. {
  14645. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14646. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  14647. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  14648. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14649. ftime(&SeqStartTime);
  14650. #endif
  14651. }
  14652. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14653. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14654. {
  14655. sprintf(buf_log_evcomm,
  14656. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14657. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14658. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14659. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14660. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14661. }
  14662. else
  14663. {
  14664. break;
  14665. }
  14666. break;
  14667. }
  14668. //-------------------------------------------
  14669. case ChargeParameterDiscoveryRequest: //35
  14670. {
  14671. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14672. {
  14673. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  14674. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14675. }
  14676. else
  14677. {
  14678. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14679. Update_V2G_Flow_Status(Other_Fault);
  14680. }
  14681. req_is_responsed = TRUE;
  14682. break;
  14683. }
  14684. case ChargeParameterDiscoveryResponse:
  14685. {
  14686. //STEP 1: Check for Process Timeout
  14687. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14688. ftime(&SeqEndTime);
  14689. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  14690. {
  14691. sprintf(buf_log_evcomm,
  14692. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  14693. DiffTimeb(SeqStartTime, SeqEndTime),
  14694. V2G_SECC_ChargingParameter_Performance_Time);
  14695. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14696. Update_V2G_Flow_Status(Sequence_Timeout);
  14697. break;
  14698. }
  14699. #endif
  14700. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14701. {
  14702. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14703. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14704. {
  14705. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14706. }
  14707. else
  14708. {
  14709. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14710. Update_V2G_Flow_Status(Other_Fault);
  14711. }
  14712. req_is_responsed = TRUE;
  14713. break;
  14714. }
  14715. //STEP 2: Check for CableCheckReq message
  14716. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  14717. {
  14718. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14719. Update_V2G_Flow_Status(CableCheckRequest);
  14720. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  14721. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  14722. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  14723. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14724. ftime(&SeqStartTime);
  14725. #endif
  14726. }
  14727. //STEP 3: Wait for PowerDeliveryReq Message
  14728. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14729. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14730. {
  14731. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14732. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14733. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14734. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14735. ftime(&SeqStartTime);
  14736. #endif
  14737. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  14738. {
  14739. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14740. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14741. }
  14742. else
  14743. {
  14744. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14745. Update_V2G_Flow_Status(Other_Fault);
  14746. }
  14747. break;
  14748. }
  14749. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14750. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14751. {
  14752. sprintf(buf_log_evcomm,
  14753. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14754. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14755. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14756. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14757. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14758. }
  14759. else
  14760. {
  14761. break;
  14762. }
  14763. break;
  14764. }
  14765. //-------------------------------------------
  14766. case CableCheckRequest: //37
  14767. {
  14768. //STEP 3: Execute Cable Check Process
  14769. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  14770. {
  14771. Update_V2G_Flow_Status(CableCheckResponse);
  14772. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14773. }
  14774. else
  14775. {
  14776. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  14777. Update_V2G_Flow_Status(Other_Fault);
  14778. }
  14779. req_is_responsed = TRUE;
  14780. break;
  14781. }
  14782. case CableCheckResponse: //38
  14783. {
  14784. //STEP 1: Check for Process Timeout
  14785. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14786. ftime(&SeqEndTime);
  14787. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  14788. {
  14789. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  14790. sprintf(buf_log_evcomm,
  14791. "CableCheck Timeout - (%.02lf of %d ms)\n",
  14792. DiffTimeb(SeqStartTime, SeqEndTime),
  14793. V2G_SECC_CableCheck_Performance_Time);
  14794. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14795. Update_V2G_Flow_Status(Sequence_Timeout);
  14796. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14797. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  14798. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14799. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14800. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14801. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14802. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  14803. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  14804. break;
  14805. }
  14806. #endif
  14807. //STEP 2: Check for CableCheckReq message
  14808. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  14809. {
  14810. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14811. //STEP 3: Execute Cable Check Process
  14812. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  14813. {
  14814. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14815. }
  14816. else
  14817. {
  14818. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  14819. Update_V2G_Flow_Status(Other_Fault);
  14820. }
  14821. req_is_responsed = TRUE;
  14822. break;
  14823. }
  14824. //STEP 3: Check for PreChargeReq message
  14825. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  14826. {
  14827. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14828. Update_V2G_Flow_Status(PreChargeRequest);
  14829. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  14830. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  14831. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  14832. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14833. ftime(&SeqStartTime);
  14834. #endif
  14835. }
  14836. //STEP 3: Wait for PowerDeliveryReq Message
  14837. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14838. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14839. {
  14840. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14841. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14842. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14843. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14844. ftime(&SeqStartTime);
  14845. #endif
  14846. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  14847. {
  14848. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14849. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14850. }
  14851. else
  14852. {
  14853. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14854. Update_V2G_Flow_Status(Other_Fault);
  14855. }
  14856. break;
  14857. }
  14858. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14859. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14860. {
  14861. sprintf(buf_log_evcomm,
  14862. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14863. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14864. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14865. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14866. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14867. }
  14868. else
  14869. {
  14870. break;
  14871. }
  14872. break;
  14873. }
  14874. //-------------------------------------------
  14875. case PreChargeRequest: //39
  14876. {
  14877. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  14878. {
  14879. Update_V2G_Flow_Status(PreChargeResponse);
  14880. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14881. }
  14882. else
  14883. {
  14884. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  14885. Update_V2G_Flow_Status(Other_Fault);
  14886. }
  14887. req_is_responsed = TRUE;
  14888. break;
  14889. }
  14890. case PreChargeResponse: //40
  14891. {
  14892. //STEP 1: Check for Process Timeout
  14893. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14894. ftime(&SeqEndTime);
  14895. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  14896. {
  14897. sprintf(buf_log_evcomm,
  14898. "Precharge Timeout - (%.02lf of %d ms)\n",
  14899. DiffTimeb(SeqStartTime, SeqEndTime),
  14900. V2G_SECC_PreCharge_Performance_Time);
  14901. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14902. Update_V2G_Flow_Status(Sequence_Timeout);
  14903. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14904. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  14905. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14906. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14907. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14908. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14909. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  14910. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  14911. break;
  14912. }
  14913. #endif
  14914. //STEP 2: Check for PreChargeReq message
  14915. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  14916. {
  14917. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14918. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  14919. {
  14920. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14921. }
  14922. else
  14923. {
  14924. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  14925. Update_V2G_Flow_Status(Other_Fault);
  14926. }
  14927. req_is_responsed = TRUE;
  14928. break;
  14929. }
  14930. //STEP 3: Check for PowerDeliveryReq message
  14931. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14932. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14933. {
  14934. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14935. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  14936. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  14937. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14938. ftime(&SeqStartTime);
  14939. #endif
  14940. }
  14941. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14942. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14943. {
  14944. sprintf(buf_log_evcomm,
  14945. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14946. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14947. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14948. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14949. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14950. }
  14951. else
  14952. {
  14953. break;
  14954. }
  14955. break;
  14956. }
  14957. //-------------------------------------------
  14958. case PowerDeliveryRequestStart: //41
  14959. {
  14960. if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
  14961. {
  14962. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  14963. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14964. }
  14965. else
  14966. {
  14967. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  14968. Update_V2G_Flow_Status(Other_Fault);
  14969. }
  14970. req_is_responsed = TRUE;
  14971. break;
  14972. }
  14973. case PowerDeliveryResponsetStart: //42
  14974. {
  14975. //STEP 1: Check for Process Timeout
  14976. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14977. if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  14978. {
  14979. ftime(&SeqEndTime);
  14980. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  14981. {
  14982. sprintf(buf_log_evcomm,
  14983. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  14984. DiffTimeb(SeqStartTime, SeqEndTime),
  14985. 2000);
  14986. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14987. Update_V2G_Flow_Status(Sequence_Timeout);
  14988. }
  14989. break;
  14990. }
  14991. #endif
  14992. //STEP 2: Wait for CurrentDemandReq Message
  14993. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  14994. {
  14995. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14996. Update_V2G_Flow_Status(CurrentDemandRequest);
  14997. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  14998. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  14999. }
  15000. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15001. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15002. {
  15003. sprintf(buf_log_evcomm,
  15004. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15005. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15006. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15007. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15008. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15009. }
  15010. else
  15011. {
  15012. break;
  15013. }
  15014. break;
  15015. }
  15016. //-------------------------------------------
  15017. case CurrentDemandRequest: //45,
  15018. {
  15019. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  15020. {
  15021. Update_V2G_Flow_Status(CurrentDemandResponse);
  15022. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15023. }
  15024. else
  15025. {
  15026. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  15027. Update_V2G_Flow_Status(Other_Fault);
  15028. }
  15029. req_is_responsed = TRUE;
  15030. break;
  15031. }
  15032. case CurrentDemandResponse: //46,
  15033. {
  15034. //STEP 1: Wait for CurrentDemandReq Message
  15035. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  15036. {
  15037. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15038. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  15039. {
  15040. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15041. }
  15042. else
  15043. {
  15044. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  15045. Update_V2G_Flow_Status(Other_Fault);
  15046. }
  15047. req_is_responsed = TRUE;
  15048. break;
  15049. }
  15050. //STEP 2: Wait for PowerDeliveryReq Message
  15051. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  15052. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  15053. {
  15054. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  15055. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15056. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  15057. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15058. ftime(&SeqStartTime);
  15059. #endif
  15060. }
  15061. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15062. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15063. {
  15064. sprintf(buf_log_evcomm,
  15065. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15066. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15067. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15068. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15069. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15070. }
  15071. else
  15072. {
  15073. break;
  15074. }
  15075. break;
  15076. }
  15077. //-------------------------------------------
  15078. case PowerDeliveryRequestStop: //49,
  15079. {
  15080. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  15081. {
  15082. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  15083. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15084. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15085. ftime(&SeqStartTime);
  15086. #endif
  15087. }
  15088. else
  15089. {
  15090. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  15091. Update_V2G_Flow_Status(Other_Fault);
  15092. }
  15093. req_is_responsed = TRUE;
  15094. break;
  15095. }
  15096. case PowerDeliveryResponseStop: //50,
  15097. {
  15098. //STEP 1: Check for Process Timeout
  15099. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15100. ftime(&SeqEndTime);
  15101. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  15102. {
  15103. sprintf(buf_log_evcomm,
  15104. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  15105. DiffTimeb(SeqStartTime, SeqEndTime),
  15106. 2000);
  15107. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15108. Update_V2G_Flow_Status(Sequence_Timeout);
  15109. break;
  15110. }
  15111. #endif
  15112. //STEP 2: Check for WeldingDetectionReq Message
  15113. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  15114. {
  15115. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15116. Update_V2G_Flow_Status(WeldingDetectionRequest);
  15117. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  15118. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  15119. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15120. ftime(&SeqStartTime);
  15121. #endif
  15122. }
  15123. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  15124. {
  15125. Update_V2G_Flow_Status(SessionStopRequest);
  15126. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15127. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  15128. {
  15129. Update_V2G_Flow_Status(SessionStopResponse);
  15130. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15131. }
  15132. else
  15133. {
  15134. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  15135. Update_V2G_Flow_Status(Other_Fault);
  15136. }
  15137. break;
  15138. }
  15139. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15140. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15141. {
  15142. sprintf(buf_log_evcomm,
  15143. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15144. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15145. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15146. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15147. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15148. }
  15149. else
  15150. {
  15151. break;
  15152. }
  15153. break;
  15154. }
  15155. //-------------------------------------------
  15156. case WeldingDetectionRequest: //51,
  15157. {
  15158. if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
  15159. {
  15160. Update_V2G_Flow_Status(WeldingDetectionResponse);
  15161. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15162. }
  15163. else
  15164. {
  15165. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  15166. Update_V2G_Flow_Status(Other_Fault);
  15167. }
  15168. req_is_responsed = TRUE;
  15169. break;
  15170. }
  15171. case WeldingDetectionResponse: //52,
  15172. {
  15173. //STEP 1: Check for Process Timeout
  15174. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15175. ftime(&SeqEndTime);
  15176. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  15177. {
  15178. sprintf(buf_log_evcomm,
  15179. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  15180. DiffTimeb(SeqStartTime, SeqEndTime),
  15181. V2G_SECC_WeldingDetection_Performance_Time);
  15182. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15183. Update_V2G_Flow_Status(Sequence_Timeout);
  15184. break;
  15185. }
  15186. #endif
  15187. //STEP 2: Check for WeldingDetectionReq Message
  15188. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  15189. {
  15190. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15191. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  15192. {
  15193. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15194. }
  15195. else
  15196. {
  15197. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  15198. Update_V2G_Flow_Status(Other_Fault);
  15199. }
  15200. req_is_responsed = TRUE;
  15201. break;
  15202. }
  15203. //STEP 3: Check for SessionStopReq Message
  15204. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  15205. {
  15206. Update_V2G_Flow_Status(SessionStopRequest);
  15207. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15208. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  15209. }
  15210. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15211. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15212. {
  15213. sprintf(buf_log_evcomm,
  15214. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15215. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15216. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15217. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15218. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15219. }
  15220. else
  15221. {
  15222. break;
  15223. }
  15224. break;
  15225. }
  15226. //-------------------------------------------
  15227. case SessionStopRequest: //53,
  15228. {
  15229. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  15230. {
  15231. Update_V2G_Flow_Status(SessionStopResponse);
  15232. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15233. }
  15234. else
  15235. {
  15236. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  15237. Update_V2G_Flow_Status(Other_Fault);
  15238. }
  15239. req_is_responsed = TRUE;
  15240. break;
  15241. }
  15242. case SessionStopResponse: //54,
  15243. {
  15244. break;
  15245. }
  15246. #endif
  15247. //-------------------------------------------
  15248. default:
  15249. {
  15250. break;
  15251. }
  15252. }
  15253. }
  15254. }
  15255. /*===========================================================================
  15256. FUNCTION: V2gMsg_Process_iso2_AC
  15257. DESCRIPTION:
  15258. PRE-CONDITION:
  15259. INPUT:
  15260. 1. V2gFlowStatus
  15261. OUTPUT:
  15262. GLOBAL VARIABLES:
  15263. 1. V2gFlowStatus
  15264. =============================================================================*/
  15265. int V2gMsg_Process_iso2_AC(int AcceptFd)
  15266. {
  15267. }
  15268. /*===========================================================================
  15269. FUNCTION: V2gMsg_Process_iso2
  15270. DESCRIPTION:
  15271. PRE-CONDITION:
  15272. INPUT:
  15273. 1. V2gFlowStatus
  15274. OUTPUT:
  15275. GLOBAL VARIABLES:
  15276. 1. V2gFlowStatus
  15277. =============================================================================*/
  15278. int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
  15279. {
  15280. switch (EnergyTransferMode)
  15281. {
  15282. case DC_extended:
  15283. {
  15284. V2gMsg_Process_iso2_DC(AcceptFd);
  15285. break;
  15286. }
  15287. case AC_single_phase_core:
  15288. case AC_three_phase_core:
  15289. {
  15290. V2gMsg_Process_iso2_AC(AcceptFd);
  15291. break;
  15292. }
  15293. default:
  15294. {
  15295. sprintf(buf_log_evcomm,
  15296. "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
  15297. EnergyTransferMode);
  15298. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15299. break;
  15300. }
  15301. }
  15302. }
  15303. /*===========================================================================
  15304. FUNCTION: V2gMsg_Process
  15305. DESCRIPTION:
  15306. PRE-CONDITION:
  15307. INPUT:
  15308. OUTPUT:
  15309. GLOBAL VARIABLES:
  15310. =============================================================================*/
  15311. int V2gMsg_Process(int AcceptFd)
  15312. {
  15313. int errn = 0;
  15314. switch (ShmCcsData->CommProtocol)
  15315. {
  15316. case V2GT_MSG_PROTOCOL_DIN70121: //0
  15317. {
  15318. V2gMsg_Process_din(AcceptFd);
  15319. break;
  15320. }
  15321. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  15322. {
  15323. V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
  15324. break;
  15325. }
  15326. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  15327. {
  15328. V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
  15329. break;
  15330. }
  15331. default:
  15332. {
  15333. sprintf(buf_log_evcomm,
  15334. "[Warning]Unexpected CommProtocol(%d)",
  15335. ShmCcsData->CommProtocol);
  15336. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15337. break;
  15338. }
  15339. }
  15340. return errn;
  15341. }
  15342. /*===========================================================================
  15343. FUNCTION: V2gMsg_Rx
  15344. DESCRIPTION:
  15345. PRE-CONDITION:
  15346. INPUT:
  15347. OUTPUT:
  15348. GLOBAL VARIABLES:
  15349. =============================================================================*/
  15350. int V2gMsg_Rx(int AcceptFd)
  15351. {
  15352. int errn = 0;
  15353. unsigned int packet_size = 0;
  15354. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15355. #ifdef SUPPORT_TLS_CONNECTION
  15356. if(EvSecurity == 0)//support security
  15357. {
  15358. packet_size = SSL_read(ssl, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE);
  15359. }
  15360. else
  15361. {
  15362. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  15363. }
  15364. #else
  15365. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  15366. #endif
  15367. //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
  15368. //The more time you call recv(), the more time you will waste here.
  15369. //Here it is suggested that response immediatedly once you receive any packets.
  15370. //For configuring the Rx waiting time, please use setsockopt().
  15371. if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
  15372. {
  15373. //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
  15374. errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
  15375. if (errn < 0)
  15376. {
  15377. sprintf(buf_log_evcomm, "[ERROR]V2gMsgDecoder", errn);
  15378. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15379. }
  15380. }
  15381. return errn;
  15382. }
  15383. /*===========================================================================
  15384. FUNCTION: V2gComm
  15385. DESCRIPTION:
  15386. PRE-CONDITION:
  15387. 1. TCP socket is connected.
  15388. INPUT:
  15389. 1. AcceptFd //TCP Connection ID
  15390. 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
  15391. 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
  15392. OUTPUT:
  15393. GLOBAL VARIABLES:
  15394. 1. V2gtpMsgRxBuf[]
  15395. =============================================================================*/
  15396. int V2gComm(int AcceptFd)
  15397. {
  15398. int errn = 0;
  15399. if (V2gMsg_Rx(AcceptFd) < 0)
  15400. {
  15401. Update_V2G_Flow_Status(Other_Fault);
  15402. errn = -1;
  15403. }
  15404. //following are the response message handling according to status flag
  15405. if (V2gMsg_Process(AcceptFd) < 0)
  15406. {
  15407. errn = -1;
  15408. }
  15409. //Error Check
  15410. //V2G_Error_Monitor();
  15411. return errn;
  15412. }
  15413. /*===========================================================================
  15414. FUNCTION: SdpUdpConnected
  15415. DESCRIPTION:
  15416. PRE-CONDITION:
  15417. INPUT:
  15418. OUTPUT:
  15419. GLOBAL VARIABLES:
  15420. =============================================================================*/
  15421. int SdpUdpConnected()
  15422. {
  15423. int packet_size,Rtn;
  15424. struct sockaddr_in6 ServerAddr,ClientAddr;
  15425. struct V2gtpHeader *header;
  15426. unsigned char *payload;
  15427. if(UdpSock <= 0)
  15428. {
  15429. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  15430. {
  15431. SAVE_SYS_LOG_MSG_EVCOMM("SdpUdpConnected: Fail to open UdpSock");
  15432. return 0;
  15433. }
  15434. ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=UdpSock;
  15435. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  15436. ServerAddr.sin6_family = AF_INET6;
  15437. ServerAddr.sin6_addr = in6addr_any;
  15438. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  15439. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  15440. {
  15441. sprintf(buf_log_evcomm,
  15442. "SdpUdpConnected: Fail to bind UdpSock(%d)",
  15443. UdpSock);
  15444. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15445. close(UdpSock);
  15446. UdpSock = -1;
  15447. return 0;
  15448. }
  15449. sprintf(buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
  15450. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15451. sprintf(buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
  15452. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15453. }
  15454. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15455. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  15456. Rtn = sizeof(struct sockaddr_in6);
  15457. packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, &Rtn);
  15458. if(packet_size > 0)
  15459. {
  15460. header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
  15461. payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
  15462. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15463. {
  15464. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
  15465. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  15466. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
  15467. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  15468. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  15469. for(Rtn = 0; Rtn < 16; Rtn += 2)
  15470. {
  15471. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  15472. }
  15473. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15474. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
  15475. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
  15476. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
  15477. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
  15478. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
  15479. DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
  15480. }
  15481. #endif
  15482. if( (header->ProtocolVersion == 0x01) &&
  15483. (header->InverseProtocolVersion == 0xFE) &&
  15484. (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  15485. {
  15486. sprintf(buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
  15487. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15488. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
  15489. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
  15490. #ifdef SUPPORT_TLS_CONNECTION
  15491. EvSecurity= *(payload);
  15492. #endif
  15493. header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  15494. header->PayloadLength = htonl(20); //Fixed Length=20
  15495. memset(payload, 0, 20);
  15496. // MAC address[0:2] + FFFE + MAC address[3:5]
  15497. payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
  15498. payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
  15499. payload[8 ]= CsuMac[0];
  15500. payload[8] ^= 0x02;// bit 1 should complemented.
  15501. payload[9] = CsuMac[1];
  15502. payload[10] = CsuMac[2];
  15503. payload[11] = 0xFF;
  15504. payload[12] = 0xFE;
  15505. payload[13] = CsuMac[3];
  15506. payload[14] = CsuMac[4];
  15507. payload[15] = CsuMac[5];
  15508. //TCP port
  15509. payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
  15510. payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
  15511. #ifdef SUPPORT_TLS_CONNECTION
  15512. if(EvSecurity == 0)//support security
  15513. payload[18] = SDP_PAYLOAD_SECURITY_TLS; //Security
  15514. else
  15515. payload[18] = SDP_PAYLOAD_SECURITY_NONE; // No Security
  15516. #else
  15517. payload[18] = SDP_PAYLOAD_SECURITY_NONE; //No Security
  15518. #endif
  15519. payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  15520. //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
  15521. Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  15522. sprintf(buf_log_evcomm, "[SDP][Tx]Res from SECC");
  15523. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15524. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15525. {
  15526. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
  15527. DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
  15528. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
  15529. for(Rtn = 0; Rtn < 16; Rtn++)
  15530. {
  15531. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
  15532. }
  15533. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15534. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
  15535. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
  15536. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
  15537. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
  15538. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
  15539. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
  15540. for(Rtn = 0; Rtn < 16; Rtn++)
  15541. {
  15542. DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
  15543. }
  15544. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15545. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
  15546. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
  15547. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
  15548. }
  15549. #endif
  15550. if(Rtn >= 28)
  15551. {
  15552. return 1;
  15553. }
  15554. }
  15555. }
  15556. return 0;
  15557. }
  15558. /*===========================================================================
  15559. FUNCTION: V2gTcpConnected
  15560. DESCRIPTION:
  15561. PRE-CONDITION:
  15562. INPUT:
  15563. OUTPUT:
  15564. GLOBAL VARIABLES:
  15565. =============================================================================*/
  15566. int V2gTcpConnected()
  15567. {
  15568. int packet_size,Rtn,AcceptFd;
  15569. struct sockaddr_in6 ServerAddr,ClientAddr;
  15570. if(TcpSock <= 0)
  15571. {
  15572. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
  15573. {
  15574. sprintf(buf_log_evcomm,
  15575. "V2gTcpConnected: Fail to open TcpSock (%s)",
  15576. strerror(errno));
  15577. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15578. usleep(100000); //100ms
  15579. return 0;
  15580. }
  15581. ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=TcpSock;
  15582. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  15583. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]socket set: DONE");
  15584. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  15585. ServerAddr.sin6_family = PF_INET6;
  15586. ServerAddr.sin6_addr = in6addr_any;
  15587. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15588. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
  15589. //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
  15590. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  15591. {
  15592. sprintf(buf_log_evcomm,
  15593. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  15594. strerror(errno),
  15595. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  15596. );
  15597. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15598. //Change to another TCP port
  15599. /*
  15600. memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  15601. ServerAddr.sin6_family = PF_INET6;
  15602. ServerAddr.sin6_addr = in6addr_any;
  15603. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
  15604. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15605. */
  15606. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  15607. {
  15608. sprintf(buf_log_evcomm,
  15609. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  15610. strerror(errno),
  15611. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  15612. );
  15613. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15614. usleep(100000); //100ms
  15615. close(TcpSock);
  15616. TcpSock = -1;
  15617. return 0;
  15618. }
  15619. }
  15620. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]blid: DONE");
  15621. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: START");
  15622. if(listen(TcpSock, 1) < 0) //only accept one connection
  15623. {
  15624. sprintf(buf_log_evcomm,
  15625. "V2gTcpConnected: Fail to listen TcpSock (%s)",
  15626. strerror(errno));
  15627. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15628. usleep(100000); //100ms
  15629. close(TcpSock);
  15630. TcpSock = -1;
  15631. return 0;
  15632. }
  15633. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: DONE");
  15634. sprintf(buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
  15635. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15636. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: START");
  15637. }
  15638. Rtn = sizeof(struct sockaddr_in6);
  15639. if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, &Rtn)) < 0 )
  15640. {
  15641. static BOOL tmp = 0;
  15642. if (tmp = 0)
  15643. {
  15644. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]Wait TCP connection...");
  15645. tmp = 1;
  15646. }
  15647. else
  15648. {
  15649. //DEBUG_PRINTF_EVCOMM_DETAIL(".");
  15650. }
  15651. return 0;
  15652. }
  15653. ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=AcceptFd;
  15654. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: DONE\n");
  15655. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15656. {
  15657. DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
  15658. DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
  15659. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  15660. for(Rtn = 0; Rtn < 16; Rtn += 2)
  15661. {
  15662. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  15663. }
  15664. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15665. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
  15666. }
  15667. #endif
  15668. #ifdef SUPPORT_TLS_CONNECTION
  15669. /* TCP connection is ready. Do server side SSL connection. */
  15670. if(EvSecurity == 0)//support security
  15671. {
  15672. ssl = SSL_new(ctx);
  15673. SSL_set_fd(ssl, AcceptFd);
  15674. if (SSL_accept(ssl) <= 0)
  15675. {
  15676. //SAVE_SYS_LOG_MSG_EVCOMM("[SSL]SSL_accept Failed");
  15677. //SSL_free(ssl);
  15678. //close(AcceptFd);
  15679. //AcceptFd = -1;
  15680. return 0;
  15681. }
  15682. }
  15683. #endif
  15684. return AcceptFd;
  15685. }
  15686. /*===========================================================================
  15687. FUNCTION: End_Process
  15688. DESCRIPTION:
  15689. PRE-CONDITION:
  15690. 1. <CAUTION> This function could only be used in SeccComm fork2.
  15691. INPUT:
  15692. OUTPUT:
  15693. GLOBAL VARIABLES:
  15694. =============================================================================*/
  15695. int End_Process()
  15696. {
  15697. if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  15698. {
  15699. SAVE_SYS_LOG_MSG_EVCOMM("End_Process has been triggered by another event.");
  15700. return -1;
  15701. }
  15702. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]entering...");
  15703. //STEP 1: Ask CSU to Stop
  15704. EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  15705. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  15706. EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
  15707. ShmInternalComm->ChargingPermission = FALSE;
  15708. //Step 2: Close sockets
  15709. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]close sockets...");
  15710. if(RawSock > 0)
  15711. {
  15712. close(RawSock);
  15713. }
  15714. if(UdpSock > 0)
  15715. {
  15716. close(UdpSock);
  15717. }
  15718. if(TcpSock > 0)
  15719. {
  15720. close(TcpSock);
  15721. close(TcpAcceptFd);
  15722. }
  15723. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  15724. if(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp > 0)
  15725. {
  15726. close(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp);
  15727. ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=0;
  15728. }
  15729. if(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp > 0)
  15730. {
  15731. close(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp);
  15732. ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=0;
  15733. }
  15734. if(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp > 0)
  15735. {
  15736. close(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp);
  15737. close(ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed);
  15738. ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=0;
  15739. ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=0;
  15740. }
  15741. /*#ifdef SUPPORT_TLS_CONNECTION
  15742. if(EvSecurity == 0)//support security
  15743. {
  15744. SSL_shutdown(ssl);
  15745. SSL_free (ssl);
  15746. }
  15747. SSL_CTX_free (ctx);
  15748. #endif*/
  15749. //STEP 3: Switch to State E
  15750. //SwitchCpStateE(ENABLE);
  15751. //STEP 4: Close tcpdump
  15752. Sniffer_Tcpdump(DISABLE);
  15753. //STEP 5: Keep 100% PWM for 5 seconds
  15754. OutputCpPwmDuty(100);
  15755. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 5");
  15756. sleep(1);
  15757. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 4");
  15758. sleep(1);
  15759. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 3");
  15760. sleep(1);
  15761. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 2");
  15762. sleep(1);
  15763. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 1");
  15764. sleep(1);
  15765. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 0");
  15766. AttenProfileCnt = 0;
  15767. init_appHandEXIDocument(&ccs_handshake);
  15768. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  15769. {
  15770. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]1st sync...");
  15771. system("sync");
  15772. }
  15773. #endif
  15774. //STEP 4: Switch to State E
  15775. //Keep State E for 5 seconds
  15776. #if 0
  15777. SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
  15778. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 5");
  15779. sleep(1);
  15780. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 4");
  15781. sleep(1);
  15782. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 3");
  15783. sleep(1);
  15784. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 2");
  15785. sleep(1);
  15786. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 1");
  15787. sleep(1);
  15788. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 0");
  15789. #endif
  15790. //Reset Memory
  15791. unsigned char SlaveAddress_backup;
  15792. unsigned int matched_backup;
  15793. //unsigned char state_backup;
  15794. SAVE_SYS_LOG_MSG_EVCOMM("[CCS Board]soft reset (closing SeccComm)...");
  15795. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
  15796. SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: END --");
  15797. SAVE_SYS_LOG_MSG_EVCOMM("-----------------------------------------\n");
  15798. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  15799. {
  15800. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]2nd sync...");
  15801. system("sync");
  15802. }
  15803. #endif
  15804. // system("sleep 1");
  15805. //Backup CsuComm flags
  15806. SlaveAddress_backup = ShmInternalComm->SlaveAddress;
  15807. matched_backup = CSUCOMMDC_TASK_FLAG.matched;
  15808. //state_backup = Check_V2G_Flow_Status();
  15809. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15810. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15811. memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
  15812. memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
  15813. memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15814. memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  15815. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  15816. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  15817. memset(ShmCcsData, 0, sizeof(struct CcsData));
  15818. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress= 0xFF;
  15819. //Resume CsuComm flags
  15820. ShmInternalComm->SlaveAddress = SlaveAddress_backup;
  15821. CSUCOMMDC_TASK_FLAG.matched = matched_backup;
  15822. Sniffer_Candump(DISABLE);
  15823. Sniffer_Candump(ENABLE);
  15824. //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
  15825. //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  15826. EVCOMM_SYS_INFO.DC_EVSEStatus=EVSE_NotReady;
  15827. //Update_V2G_Flow_Status(state_backup);
  15828. //CP_Detection_Pid = 0;
  15829. //PP_Detection_Pid = 0;
  15830. //Error_Monitor_Pid = 0;
  15831. /* while(CheckConnectorPlugIn() != TRUE)
  15832. {
  15833. sleep(1);
  15834. }*/
  15835. free(V2gtpMsgRxBuf);
  15836. free(V2gtpMsgTxBuf);
  15837. //DetachShareMemory();
  15838. Qca7kPowerReset(); //reset QCA7000 /* +++ 20200808, vern, should disconnected PLC connection after session stop ---*/
  15839. system("cd /root;./reset_soft.sh");
  15840. while(1)
  15841. {
  15842. //wait for CSU configrm
  15843. }
  15844. }
  15845. /*===========================================================================
  15846. FUNCTION: Parameters_Init
  15847. DESCRIPTION:
  15848. PRE-CONDITION:
  15849. INPUT:
  15850. OUTPUT:
  15851. GLOBAL VARIABLES:
  15852. =============================================================================*/
  15853. int Parameters_Init()
  15854. {
  15855. //Step 0: Generate random number
  15856. unsigned int value_random;
  15857. struct timeb time_seed;
  15858. ftime(&time_seed);
  15859. srand(time_seed.millitm);
  15860. //Step 1: Init SDP TCP Port
  15861. value_random = rand();
  15862. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
  15863. if((EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active <= 49152)||(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active >= 65535))//49152-65535
  15864. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active=59438;
  15865. sprintf(buf_log_evcomm,
  15866. "[Init]TCP Port:OK(%d)",
  15867. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15868. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15869. //Step 2: Init SessionID
  15870. value_random = rand();
  15871. memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
  15872. value_random = rand();
  15873. memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
  15874. sprintf(buf_log_evcomm,
  15875. "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
  15876. EVCOMM_SYS_INFO.SessionID[0],
  15877. EVCOMM_SYS_INFO.SessionID[1],
  15878. EVCOMM_SYS_INFO.SessionID[2],
  15879. EVCOMM_SYS_INFO.SessionID[3],
  15880. EVCOMM_SYS_INFO.SessionID[4],
  15881. EVCOMM_SYS_INFO.SessionID[5],
  15882. EVCOMM_SYS_INFO.SessionID[6],
  15883. EVCOMM_SYS_INFO.SessionID[7]);
  15884. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15885. }
  15886. #ifdef SUPPORT_TLS_CONNECTION
  15887. SSL_CTX *create_sslcontext()
  15888. {
  15889. const SSL_METHOD *method;
  15890. SSL_CTX *ctx;
  15891. // Support only TLSv1.2
  15892. method = TLSv1_2_server_method();
  15893. // Create context
  15894. ctx = SSL_CTX_new(method);
  15895. if (!ctx)
  15896. {
  15897. ERR_print_errors_fp(stderr);
  15898. return NULL;
  15899. }
  15900. return ctx;
  15901. }
  15902. int configure_sslcertkey_file(SSL_CTX *ctx)
  15903. {
  15904. SSL_CTX_set_ecdh_auto(ctx, 1);
  15905. // Load certificate file
  15906. if (SSL_CTX_use_certificate_file(ctx, "/root/cacert.pem", SSL_FILETYPE_PEM) <= 0)
  15907. {
  15908. ERR_print_errors_fp(stderr);
  15909. return -1;
  15910. }
  15911. // Load private key file
  15912. if (SSL_CTX_use_PrivateKey_file(ctx, "/root/cakey.pem", SSL_FILETYPE_PEM) <= 0 )
  15913. {
  15914. ERR_print_errors_fp(stderr);
  15915. return -1;
  15916. }
  15917. return 0;
  15918. }
  15919. #endif
  15920. /*===========================================================================
  15921. FUNCTION: main
  15922. DESCRIPTION:
  15923. PRE-CONDITION:
  15924. INPUT:
  15925. OUTPUT:
  15926. GLOBAL VARIABLES:
  15927. =============================================================================*/
  15928. int main(int argc, char *argv[])
  15929. {
  15930. unsigned char Rtn;
  15931. //Initialization
  15932. if(ShareMemory_Init()==0)
  15933. {
  15934. system("reboot -f");
  15935. sleep(5);
  15936. system("reboot -f");
  15937. }
  15938. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  15939. if(RawSock > 0)
  15940. {
  15941. close(RawSock);
  15942. }
  15943. if(UdpSock > 0)
  15944. {
  15945. close(UdpSock);
  15946. }
  15947. if(TcpSock > 0)
  15948. {
  15949. close(TcpSock);
  15950. }
  15951. RawSock = UdpSock = TcpSock = -1;
  15952. Update_V2G_Flow_Status(IDLE);
  15953. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
  15954. SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: START --");
  15955. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------\n");
  15956. //Print Linux Kernel Version
  15957. sprintf(buf_log_evcomm, "\nLinux Image SHA1: %s\n", LINUX_IMAGE_VERSION);
  15958. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15959. //Print Hardware Version
  15960. sprintf(buf_log_evcomm, "HW: %s\n", HARDWARE_VERSION);
  15961. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15962. //Print Firmware Version
  15963. sprintf(buf_log_evcomm, "FW: %s\n", FIRMWARE_VERSION);
  15964. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15965. SAVE_SYS_LOG_MSG_EVCOMM("init...");
  15966. //Init V2G TCP/IPv6 packets buffer
  15967. V2gtpMsgRxBuf = (unsigned char *)malloc(V2GTP_MSG_RX_BUFFER_SIZE);
  15968. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15969. V2gtpMsgTxBuf = (unsigned char *)malloc(V2GTP_MSG_TX_BUFFER_SIZE);
  15970. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15971. //Release State E Control
  15972. SwitchCpStateE(DISABLE);
  15973. OutputCpPwmDuty(100);
  15974. //start to detect CP pilot state
  15975. CP_Detection_Pid = 0;
  15976. CP_Detection(); //fork1
  15977. SAVE_SYS_LOG_MSG_EVCOMM("[fork1]CP Detection: ON");
  15978. //start to detect errors
  15979. Error_Monitor(); //fork2
  15980. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Error Monitor: ON");
  15981. //CCS connector type
  15982. sprintf(buf_log_evcomm, "CCS connector type : %s\n", ShmInternalComm->CCSConnectorType > 0? "CCS2":"CCS1" );
  15983. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15984. //start to detect PP
  15985. PP_Detection_Pid = 0;
  15986. #if (PP_PROTECTION_MECHANISM == ENABLE)
  15987. PP_Detection();
  15988. SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: ON");
  15989. #else
  15990. SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: OFF");
  15991. #endif
  15992. //Init communication parameters
  15993. GetEthMac(QcaInterface, CsuMac);
  15994. AttenProfileCnt = 0;
  15995. init_appHandEXIDocument(&ccs_handshake);
  15996. //Init Energy transfer mode
  15997. //[To-Do] Parsing Model Name
  15998. if(CCS_ENERGY_TRANSFER_MODE<=1)
  15999. {
  16000. if((ShmInternalComm->AC_EVSEModelName[2]=='Y') || (ShmInternalComm->AC_EVSEModelName[2]=='D') || (ShmInternalComm->AC_EVSEModelName[2]=='W'))
  16001. //if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount==3)
  16002. ShmCcsData->EnergyTransferMode = MODE_AC_THREE_PHASE_CORE;
  16003. else
  16004. ShmCcsData->EnergyTransferMode = MODE_AC_SINGLE_PHASE_CORE;
  16005. }
  16006. else
  16007. ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
  16008. struct ChargingInfoData *ccs;
  16009. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  16010. Parameters_Init();
  16011. Sniffer_Tcpdump(ENABLE);
  16012. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  16013. sleep(1); //wait for tcpdump getting ready
  16014. #endif
  16015. #ifdef SUPPORT_TLS_CONNECTION
  16016. // SSL init
  16017. //SSL_free (ssl);
  16018. //SSL_CTX_free (ctx);
  16019. SSL_load_error_strings();
  16020. OpenSSL_add_ssl_algorithms();
  16021. // Create SSL_CTX
  16022. ctx = create_sslcontext();
  16023. if (ctx == NULL)
  16024. {
  16025. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext Failed");
  16026. }
  16027. else
  16028. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext OK");
  16029. // Configure cert and key
  16030. if (configure_sslcertkey_file(ctx) < 0)
  16031. {
  16032. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file Failed");
  16033. }
  16034. else
  16035. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file OK");
  16036. #endif
  16037. SAVE_SYS_LOG_MSG_EVCOMM("[Init]DONE");
  16038. while(1)
  16039. {
  16040. //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
  16041. //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
  16042. //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  16043. //if(ShmInternalComm->ChargingPermission == 0x01)
  16044. //if(CheckConnectorPlugIn() == TRUE)
  16045. if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  16046. {
  16047. if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
  16048. {
  16049. SlacComm();
  16050. }
  16051. else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
  16052. {
  16053. if(SdpUdpConnected() == 1)
  16054. {
  16055. Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
  16056. continue;
  16057. }
  16058. SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
  16059. ftime(&SeqEndTime);
  16060. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  16061. {
  16062. sprintf(buf_log_evcomm,
  16063. "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
  16064. DiffTimeb(SeqStartTime, SeqEndTime),
  16065. TT_match_join);
  16066. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  16067. Update_V2G_Flow_Status(Sequence_Timeout);
  16068. //Update_ShmStatusCode(); //[To-Do] to be implemented
  16069. //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
  16070. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  16071. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  16072. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  16073. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  16074. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  16075. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  16076. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  16077. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  16078. }
  16079. }
  16080. else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
  16081. {
  16082. if((TcpAcceptFd = V2gTcpConnected()) > 0)
  16083. {
  16084. Update_V2G_Flow_Status(SupportedAppProtocolRequest);
  16085. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  16086. continue;
  16087. }
  16088. SlacComm();
  16089. ftime(&SeqEndTime);
  16090. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  16091. {
  16092. sprintf(buf_log_evcomm,
  16093. "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
  16094. DiffTimeb(SeqStartTime, SeqEndTime),
  16095. TT_match_join);
  16096. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  16097. Update_V2G_Flow_Status(Sequence_Timeout);
  16098. //Update_ShmStatusCode(); //[To-Do] to be implemented
  16099. //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
  16100. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  16101. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  16102. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  16103. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  16104. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  16105. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  16106. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  16107. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  16108. }
  16109. }
  16110. else if(V2gFlowStatus <= SessionStopResponse)
  16111. {
  16112. if (V2gComm(TcpAcceptFd) < 0)
  16113. {
  16114. //error occours
  16115. }
  16116. if(V2gFlowStatus == SessionStopResponse)
  16117. {
  16118. if(RawSock > 0)
  16119. {
  16120. close(RawSock);
  16121. }
  16122. if(UdpSock > 0)
  16123. {
  16124. close(UdpSock);
  16125. }
  16126. if(TcpSock > 0)
  16127. {
  16128. close(TcpSock);
  16129. close(TcpAcceptFd);
  16130. }
  16131. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  16132. #ifdef SUPPORT_TLS_CONNECTION
  16133. if(EvSecurity == 0)//support security
  16134. {
  16135. SSL_shutdown(ssl);
  16136. SSL_free (ssl);
  16137. }
  16138. SSL_CTX_free (ctx);
  16139. #endif
  16140. }
  16141. }
  16142. else if (V2gFlowStatus >= Performance_Timeout)
  16143. {
  16144. //End_Process
  16145. if(RawSock > 0)
  16146. {
  16147. close(RawSock);
  16148. }
  16149. if(UdpSock > 0)
  16150. {
  16151. close(UdpSock);
  16152. }
  16153. if(TcpSock > 0)
  16154. {
  16155. close(TcpSock);
  16156. close(TcpAcceptFd);
  16157. }
  16158. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  16159. #ifdef SUPPORT_TLS_CONNECTION
  16160. if(EvSecurity == 0)//support security
  16161. {
  16162. SSL_shutdown(ssl);
  16163. SSL_free (ssl);
  16164. }
  16165. SSL_CTX_free (ctx);
  16166. #endif
  16167. }
  16168. else
  16169. {
  16170. //null
  16171. }
  16172. }
  16173. // printf("V2gFlowStatus=%d, socket=%d,%d,%d\n",V2gFlowStatus,RawSock,UdpSock,TcpSock);
  16174. } //while
  16175. }//main while